diff --git a/app/(admin)/settings/admin-settings-client.tsx b/app/(admin)/settings/admin-settings-client.tsx index eab8aeacd..8b6e56364 100644 --- a/app/(admin)/settings/admin-settings-client.tsx +++ b/app/(admin)/settings/admin-settings-client.tsx @@ -4,7 +4,7 @@ import Link from "next/link"; import { useState, useEffect, useMemo, type ChangeEvent, type DragEvent } from "react"; import useSWR from "swr"; import { toast } from "sonner"; -import { formatBeijingTime } from "@/lib/utils"; +import { cn, formatBeijingTime } from "@/lib/utils"; import { Card, CardContent, @@ -1214,6 +1214,9 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ ...defaultThirdPartySqlServerConfig, }); const [isTestingThirdPartySqlServer, setIsTestingThirdPartySqlServer] = useState(false); + const [isLocalAiSettingsExpanded, setIsLocalAiSettingsExpanded] = useState(false); + const [isThirdPartySqlServerFieldsVisible, setIsThirdPartySqlServerFieldsVisible] = + useState(false); const [productPlanningApiConfig, setProductPlanningApiConfig] = useState(defaultProductPlanningApiConfig()); const [productPlanningAiModelConfig, setProductPlanningAiModelConfig] = @@ -1459,6 +1462,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ } }, [thirdPartySqlServerConfigData]); + useEffect(() => { + if (!isLocalAiSettingsExpanded) { + setIsThirdPartySqlServerFieldsVisible(false); + } + }, [isLocalAiSettingsExpanded]); + // 加载实时画布API配置 const { data: realtimeCanvasConfigData } = useSWR( "/api/admin/settings?key=realtime_canvas_config", @@ -4587,6 +4596,13 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ ); + const hasThirdPartySqlServerConfiguredValue = Boolean( + thirdPartySqlServerConfig.host.trim() || + thirdPartySqlServerConfig.database.trim() || + thirdPartySqlServerConfig.username.trim() || + thirdPartySqlServerConfig.password.trim(), + ); + return (
@@ -9742,6 +9758,28 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ {/* 本地AI设置 */} +
+
+
本地 AI 设置概览模式
+
+ 默认先收起各项配置,避免打开页签时一次性展示过多参数。数据库连接信息会额外保持隐藏,需手动显示后才会回显。 +
+
+ +
+ 商品策划工具 API 配置 @@ -9749,7 +9787,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置商品策划工具页面使用的淘宝 / 京东 Onebound、问大家和销量接口。保存后商品策划相关接口会优先读取这里的配置,未填写时才回退到环境变量。 - +
@@ -9910,7 +9953,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 为商品策划工具单独绑定一套分析模型。开启后,评价分析、问大家分析、竞品图片分析和 SKU 卖点分析会优先走这里配置的 OpenAI 兼容模型,不再依赖站点默认模型。 - +
@@ -10034,7 +10082,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 为 AI详情生成 单独配置 Moonshot 官方 Kimi K2.5 模型。保存后会自动绑定到“AI详情生成 - Agent专用模型”。 - +
- +
- +
- + {/* 服务提供商选择 */}
@@ -10560,7 +10628,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置图片变清晰API,用于画图标注功能中的图片增强处理。支持主API和备用API切换。 - + {/* API切换开关 */}
@@ -10759,7 +10832,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置 Krea Topaz Generative,用于无限画布中的“图像增强 Pro”能力。 - +
@@ -11156,7 +11234,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置阿里云Dashscope图像拓展API,用于画图标注功能中的图像智能扩展处理 - +
- +
- + {/* 启用开关 */}
@@ -11438,7 +11531,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置 Replicate 上的 Qwen-Image-Layered 模型,用于将单张图片拆分为多个可编辑图层并回写到无限画布。 - +
@@ -11652,7 +11750,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置后可供后续业务功能直接访问外部 SQL Server 数据库。当前仅提供配置保存与连通性测试。 - +
@@ -11673,151 +11776,201 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({
-
-
- - - setThirdPartySqlServerConfig((prev) => ({ ...prev, host: e.target.value })) - } - placeholder="218.93.191.16" - /> +
+
+
数据库连接信息默认隐藏
+
+ {hasThirdPartySqlServerConfiguredValue + ? "已保存的主机地址、数据库、账号和密码不会默认显示,只有主动点击后才会回显并允许编辑。" + : "当前未展开连接字段。需要新增或编辑配置时,再手动显示连接信息。"} +
-
- - - setThirdPartySqlServerConfig((prev) => ({ - ...prev, - port: Math.max(1, Math.min(65535, Number(e.target.value) || 1433)), - })) - } - placeholder="1433" - /> -
-
- -
-
- - - setThirdPartySqlServerConfig((prev) => ({ ...prev, database: e.target.value })) - } - placeholder="JSDataMiddlePlatform" - /> -
-
- - - setThirdPartySqlServerConfig((prev) => ({ ...prev, username: e.target.value })) - } - placeholder="nanting" - /> -
-
- -
- - - setThirdPartySqlServerConfig((prev) => ({ ...prev, password: e.target.value })) +
-
-
- - - setThirdPartySqlServerConfig((prev) => ({ - ...prev, - connectionTimeoutMs: Math.max( - 1000, - Math.min(120000, Number(e.target.value) || 15000) - ), - })) - } - /> -
-
- - - setThirdPartySqlServerConfig((prev) => ({ - ...prev, - requestTimeoutMs: Math.max( - 1000, - Math.min(120000, Number(e.target.value) || 30000) - ), - })) - } - /> -
-
+ {isThirdPartySqlServerFieldsVisible ? ( + <> +
+
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + host: e.target.value, + })) + } + placeholder="例如:db.example.com 或 10.0.0.8" + /> +
+
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + port: Math.max(1, Math.min(65535, Number(e.target.value) || 1433)), + })) + } + placeholder="1433" + /> +
+
-
-
-
- -
- 现代云数据库通常需要开启;传统内网 SQL Server 可关闭。 +
+
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + database: e.target.value, + })) + } + placeholder="请输入数据库名称" + /> +
+
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + username: e.target.value, + })) + } + placeholder="请输入数据库账号" + />
- - setThirdPartySqlServerConfig((prev) => ({ ...prev, encrypt: checked })) - } - /> -
-
-
- -
- 对自签名证书或传统 SQL Server 更友好。 + +
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + password: e.target.value, + })) + } + placeholder="请输入 SQL Server 密码" + /> +
+ +
+
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + connectionTimeoutMs: Math.max( + 1000, + Math.min(120000, Number(e.target.value) || 15000), + ), + })) + } + /> +
+
+ + + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + requestTimeoutMs: Math.max( + 1000, + Math.min(120000, Number(e.target.value) || 30000), + ), + })) + } + />
- - setThirdPartySqlServerConfig((prev) => ({ - ...prev, - trustServerCertificate: checked, - })) - } - /> + +
+
+
+ +
+ 现代云数据库通常需要开启;传统内网 SQL Server 可关闭。 +
+
+ + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + encrypt: checked, + })) + } + /> +
+
+
+ +
+ 对自签名证书或传统 SQL Server 更友好。 +
+
+ + setThirdPartySqlServerConfig((prev) => ({ + ...prev, + trustServerCertificate: checked, + })) + } + /> +
+
+ + ) : ( +
+ {hasThirdPartySqlServerConfiguredValue + ? "当前已保存的 SQL Server 连接字段处于隐藏状态。点击上方按钮后才会展示主机、数据库、账号和密码。" + : "当前未展示 SQL Server 连接字段。点击上方按钮开始填写连接信息。"}
-
+ )}

• 当前支持 SQL Server 标准 TCP 连接。

@@ -11852,7 +12005,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置实时画布功能的供应商、模型与 API Key。当前已接入 BFL / Replicate / FAL 供应商;FAL 的 WebSocket 真流式实时属于第二阶段,不是这次上线内容。 - +
@@ -12450,7 +12608,12 @@ const [realtimeCanvasConfig, setRealtimeCanvasConfig] = useState({ 配置批量处理功能的默认提示词和参数。批量处理可将产品图批量融合到多个场景中。 - + {/* 功能开关 */}