From 688f67c25c3dfc8dc519c26b69799e7b1f887bd8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 18 Jan 2026 14:56:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9B=BE=E7=89=87=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E5=99=A8=E5=8D=87=E7=BA=A7=20-=20=E5=85=A5=E5=8F=A3=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20+=20=E5=9C=BA=E6=99=AF=E8=A3=82=E5=8F=98=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 功能一:图片编辑器入口优化 - 支持先打开编辑器再上传图片 - 新增拖拽上传功能 - 新增粘贴上传功能 (Ctrl+V) 功能二:场景裂变 - 新增场景裂变弹窗组件 - 支持产品图批量融合到多个场景 - 每个场景独立配置补充关键词 - 并发处理提高效率 - 支持单个重新生成和全部下载 - 生成结果自动保存到相册 管理员配置: - 新增场景裂变配置面板 - 支持自定义默认提示词 - 支持配置最大场景数量 - 支持功能开关 新增文件: - app/api/scene-fusion/route.ts - app/api/scene-fusion/config/route.ts - components/scene-fusion-dialog.tsx - docs/图片编辑器功能升级规划.md --- .../settings/admin-settings-client.tsx | 127 ++++ app/api/scene-fusion/config/route.ts | 55 ++ app/api/scene-fusion/route.ts | 406 +++++++++++++ components/image-annotator.tsx | 202 ++++++- components/scene-fusion-dialog.tsx | 568 ++++++++++++++++++ components/top-navbar.tsx | 52 +- docs/图片编辑器功能升级规划.md | 303 ++++++++++ 7 files changed, 1659 insertions(+), 54 deletions(-) create mode 100644 app/api/scene-fusion/config/route.ts create mode 100644 app/api/scene-fusion/route.ts create mode 100644 components/scene-fusion-dialog.tsx create mode 100644 docs/图片编辑器功能升级规划.md diff --git a/app/(admin)/settings/admin-settings-client.tsx b/app/(admin)/settings/admin-settings-client.tsx index 5a44689c4..4f9a3ac5b 100644 --- a/app/(admin)/settings/admin-settings-client.tsx +++ b/app/(admin)/settings/admin-settings-client.tsx @@ -396,6 +396,13 @@ export function AdminSettingsClient() { timeout: 120, }); + // 场景裂变配置状态 + const [sceneFusionConfig, setSceneFusionConfig] = useState({ + enabled: true, + defaultPrompt: "将图1的产品替换到图2的场景中,保持图1产品的外观、颜色和细节不变,自然融合到图2的环境中。", + maxScenes: 10, + }); + // 加载抠图API配置 const { data: rmbgConfigData } = useSWR("/api/admin/settings?key=rmbg_api_config", fetcher); useEffect(() => { @@ -479,6 +486,23 @@ export function AdminSettingsClient() { } }, [angleEditConfigData]); + // 加载场景裂变配置 + const { data: sceneFusionConfigData } = useSWR("/api/admin/settings?key=scene_fusion_config", fetcher); + useEffect(() => { + if (sceneFusionConfigData?.setting?.value) { + const config = sceneFusionConfigData.setting.value as { + enabled?: boolean; + defaultPrompt?: string; + maxScenes?: number; + }; + setSceneFusionConfig({ + enabled: config.enabled ?? true, + defaultPrompt: config.defaultPrompt || "将图1的产品替换到图2的场景中,保持图1产品的外观、颜色和细节不变,自然融合到图2的环境中。", + maxScenes: config.maxScenes ?? 10, + }); + } + }, [sceneFusionConfigData]); + // 导航链接状态 const [navLinkForm, setNavLinkForm] = useState({ id: "", @@ -922,6 +946,34 @@ export function AdminSettingsClient() { } }; + // --- 场景裂变配置逻辑 --- + const handleSaveSceneFusionConfig = async () => { + try { + if (!sceneFusionConfig.defaultPrompt.trim()) { + toast.error("默认提示词不能为空"); + return; + } + + const response = await fetch("/api/admin/settings", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + key: "scene_fusion_config", + value: { + enabled: sceneFusionConfig.enabled, + defaultPrompt: sceneFusionConfig.defaultPrompt.trim(), + maxScenes: sceneFusionConfig.maxScenes, + }, + }), + }); + + if (!response.ok) throw new Error("保存失败"); + toast.success("场景裂变配置保存成功"); + } catch (error) { + toast.error("保存场景裂变配置失败"); + } + }; + // --- 导航链接逻辑 --- const resetNavLinkForm = () => { setNavLinkForm({ id: "", name: "", url: "", order: 0, isEnabled: true }); @@ -3764,6 +3816,81 @@ export function AdminSettingsClient() { + + {/* 场景裂变配置 */} + + + + + 场景裂变配置 + + + 配置场景裂变功能的默认提示词和参数。场景裂变可将产品图批量融合到多个场景中。 + + + + {/* 功能开关 */} +
+
+ +
+ 开启后用户可在图片编辑器中使用场景裂变功能 +
+
+ setSceneFusionConfig({ ...sceneFusionConfig, enabled: checked })} + /> +
+ + {/* 默认提示词 */} +
+ +