From 005c3966607d99b659d7c22e5bfe4b0f814fc7cc Mon Sep 17 00:00:00 2001 From: HouYunFei <1844025705@qq.com> Date: Tue, 26 May 2026 14:44:06 +0800 Subject: [PATCH] =?UTF-8?q?feat(image):=20=E4=BC=98=E5=8C=96=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=94=9F=E6=88=90=E8=AE=B0=E5=BD=95=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96=E5=92=8C=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增生成记录配置持久化功能,保存提示词、参考图、模型、质量、尺寸和张数配置 - 结果图写入本地图片存储后只保存 storageKey,减少存储空间占用 - 点击历史记录可回填生成配置并预览结果 - 优化我的画布、我的素材导出功能 - 新增视频创作台页面 - 修复图片节点size参数传递问题 - 添加完整的生成日志数据结构和序列化处理 - 实现图片存储和删除的批量操作支持 --- docs/pending-test.md | 1 + .../components/canvas-config-node-panel.tsx | 15 ++++--- .../canvas-image-settings-popover.tsx | 43 +++++++++++++++---- web/src/app/globals.css | 5 +++ 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/docs/pending-test.md b/docs/pending-test.md index 00b34dd..65a702d 100644 --- a/docs/pending-test.md +++ b/docs/pending-test.md @@ -15,6 +15,7 @@ - 管理后台公开配置里的系统可用模型候选项改为由已启用渠道中选择的模型合并去重生成,最终开放哪些模型仍由公开配置里手动勾选。 - 视频生成请求参数对齐 `grok-imagine-video` 接口:使用 `resolution_name`、`preset=normal`、`input_reference[]`,支持清晰度、尺寸、秒数快捷选择和手动输入,并支持最多 7 张参考图。 - 画布视频设置浮层改为挂载到页面根层级,避免被节点悬浮工具栏遮挡。 +- 画布生成配置节点的生图参数改为复用图像设置浮层,支持在同一个入口里调整质量、尺寸和生成张数。 - 视频清晰度输入框改为只输入数字,提交请求时再拼接 `p` 单位。 - 视频生成前端会识别后端 `{ code, msg }` 错误响应,创建失败不再继续轮询 `undefined`。 - 新增 `/video` 视频创作台页面,参考生图工作台布局,支持提示词、参考图、视频参数、生成结果、保存素材、下载和本地生成记录;清晰度和秒数均支持常用值选择与手动输入,生成记录只保存媒体 `storageKey` 并可回填本次提示词、参考图和参数。 diff --git a/web/src/app/(user)/canvas/components/canvas-config-node-panel.tsx b/web/src/app/(user)/canvas/components/canvas-config-node-panel.tsx index 41f2eb4..0e5b515 100644 --- a/web/src/app/(user)/canvas/components/canvas-config-node-panel.tsx +++ b/web/src/app/(user)/canvas/components/canvas-config-node-panel.tsx @@ -3,14 +3,14 @@ import type { CSSProperties } from "react"; import { useState } from "react"; import { ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Edit3, Eye, Image as ImageIcon, LoaderCircle, MessageSquare, Play, Video } from "lucide-react"; -import { App, Button, Empty, Input, InputNumber, Modal, Segmented } from "antd"; +import { App, Button, Empty, Input, Modal, Segmented } from "antd"; import { ModelPicker } from "@/components/model-picker"; import { defaultConfig, useConfigStore, useEffectiveConfig, type AiConfig } from "@/stores/use-config-store"; import { CreditSymbol, requestCreditCost } from "@/constant/credits"; import { canvasThemes } from "@/lib/canvas-theme"; import { useThemeStore } from "@/stores/use-theme-store"; -import { CanvasSizePicker } from "./canvas-size-picker"; +import { CanvasImageSettingsPopover } from "./canvas-image-settings-popover"; import { CanvasVideoSettingsPopover } from "./canvas-video-settings-popover"; import type { NodeGenerationInput } from "./canvas-node-generation"; import type { CanvasGenerationMode, CanvasNodeData, CanvasNodeMetadata } from "../types"; @@ -118,10 +118,13 @@ export function CanvasConfigNodePanel({ node, isRunning, inputSummary, inputs, o -
event.stopPropagation()}> +
event.stopPropagation()}> onConfigChange(node.id, { model })} onMissingConfig={() => openConfigDialog(true)} fullWidth /> - {mode === "video" ? onConfigChange(node.id, key === "videoSeconds" ? { seconds: value } : { [key]: value })} /> : mode === "image" ? onConfigChange(node.id, { size: value })} /> : null} - {mode === "video" ? null : onConfigChange(node.id, { count: Number(value) || 1 })} />} + {mode === "video" ? ( + onConfigChange(node.id, key === "videoSeconds" ? { seconds: value } : { [key]: value })} /> + ) : mode === "image" ? ( + onConfigChange(node.id, key === "count" ? { count: Number(value) || 1 } : { [key]: value })} /> + ) : null}
+ + + ); } diff --git a/web/src/app/globals.css b/web/src/app/globals.css index c72a9b5..df56d2a 100644 --- a/web/src/app/globals.css +++ b/web/src/app/globals.css @@ -405,6 +405,11 @@ padding: 18px; } + .canvas-image-settings-popover .ant-popover-inner-content { + max-height: calc(100vh - 96px); + overflow-y: auto; + } + .canvas-image-settings-popover .ant-segmented { border-radius: 999px; padding: 3px;