From 4d4ca6e425a098f8d651c64a9b6ae3f145604532 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B8=85?= <2944435683> Date: Sun, 29 Mar 2026 20:49:28 +0800 Subject: [PATCH 1/5] no message --- src/types/database.d.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 2a3bc57..735f17d 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,6 +1,19 @@ -// @db-hash 93b2462070c45c2b449e9a18c4e88763 +// @db-hash e24c7c99757472b92af11f26a2b2b8c7 //该文件由脚本自动生成,请勿手动修改 +export interface _o_project_old_20260328 { + 'artStyle'?: string | null; + 'createTime'?: number | null; + 'id'?: number | null; + 'imageModel'?: string | null; + 'intro'?: string | null; + 'name'?: string | null; + 'projectType'?: string | null; + 'type'?: string | null; + 'userId'?: number | null; + 'videoModel'?: string | null; + 'videoRatio'?: string | null; +} export interface memories { 'content': string; 'createTime': number; @@ -21,7 +34,7 @@ export interface o_agentDeploy { 'model'?: string | null; 'modelName'?: string | null; 'name'?: string | null; - 'vendorId'?: string | null; + 'vendorId'?: number | null; } export interface o_agentWorkData { 'createTime'?: number | null; @@ -232,6 +245,7 @@ export interface o_videoConfig { } export interface DB { + "_o_project_old_20260328": _o_project_old_20260328; "memories": memories; "o_agentDeploy": o_agentDeploy; "o_agentWorkData": o_agentWorkData; From cd8e3d483f750657439c056c197d9cade4a0fddb Mon Sep 17 00:00:00 2001 From: zhishi <1951671751@qq.com> Date: Sun, 29 Mar 2026 20:51:39 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=A4=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/initDB.ts | 2 +- src/routes/project/deleteVisualManual.ts | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/lib/initDB.ts b/src/lib/initDB.ts index 69b40ae..4cb790b 100644 --- a/src/lib/initDB.ts +++ b/src/lib/initDB.ts @@ -96,7 +96,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise => model: "", modelName: "", vendorId: null, - key: "universalAgent", + key: "universalAi", name: "通用AI", desc: "用于小说事件提取、资产提示词生成、台词提取等边缘功能,建议使用具备较强文本处理能力的模型", disabled: false, diff --git a/src/routes/project/deleteVisualManual.ts b/src/routes/project/deleteVisualManual.ts index 16d184b..5d35333 100644 --- a/src/routes/project/deleteVisualManual.ts +++ b/src/routes/project/deleteVisualManual.ts @@ -1,6 +1,6 @@ import express from "express"; import u from "@/utils"; -import fs from "fs"; +import fs from "node:fs/promises"; import { z } from "zod"; import { error, success } from "@/lib/responseFormat"; import { validateFields } from "@/middleware/middleware"; @@ -24,15 +24,21 @@ export default router.post( const artPromptsDir = u.getPath(["skills", "art_prompts", name]); - // 1. 删除 skills/art_prompts 下的同名文件夹 - if (fs.existsSync(artPromptsDir)) { - fs.rmSync(artPromptsDir, { recursive: true, force: true }); - // 2. 删除 oss 下的同名文件夹(存放图片) - try { - await u.oss.deleteDirectory(name); - } catch { - // oss 下不存在该目录则忽略 + try { + const stat = await fs.stat(artPromptsDir); + if (!stat.isDirectory()) { + throw new Error(`${artPromptsDir} 不是文件夹`); } + await fs.rm(artPromptsDir, { recursive: true, force: true }); + } catch (e) { + console.error("[删除视觉手册] 删除失败:", artPromptsDir, e); + } + + // 2. 删除 oss 下的同名文件夹(存放图片),独立于 art_prompts 目录 + try { + await u.oss.deleteDirectory(name); + } catch (e) { + console.warn("[删除视觉手册] oss 目录删除失败:", name, e); } res.status(200).send(success({ message: "删除成功" })); From 292a0042ab21203e0d352a1bffaa30ac5f121403 Mon Sep 17 00:00:00 2001 From: zhishi <1951671751@qq.com> Date: Sun, 29 Mar 2026 21:18:30 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=A7=86=E8=A7=89=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/router.ts | 192 +++++++++++++------------ src/routes/project/addVisualManual.ts | 102 +++++++++++++ src/routes/project/editVisualManual.ts | 30 ++-- src/utils/getArtPrompt.ts | 9 +- 4 files changed, 222 insertions(+), 111 deletions(-) create mode 100644 src/routes/project/addVisualManual.ts diff --git a/src/router.ts b/src/router.ts index 8d43229..7590ee1 100644 --- a/src/router.ts +++ b/src/router.ts @@ -1,4 +1,4 @@ -// @routes-hash 5a19c42c22d44ec4c7fe2fc7245535d9 +// @routes-hash 48f3cafa7563a8ec5d646e1f88ef8bfd import { Express } from "express"; import route1 from "./routes/agents/clearMemory"; @@ -66,53 +66,54 @@ import route62 from "./routes/production/workbench/getVideoModelDetail"; import route63 from "./routes/production/workbench/videoPolling"; import route64 from "./routes/project/addProject"; import route65 from "./routes/project/addVisual"; -import route66 from "./routes/project/deleteVisualManual"; -import route67 from "./routes/project/delProject"; -import route68 from "./routes/project/editProject"; -import route69 from "./routes/project/editVisualManual"; -import route70 from "./routes/project/getProject"; -import route71 from "./routes/project/getVisualManual"; -import route72 from "./routes/project/visualManual"; -import route73 from "./routes/script/addScript"; -import route74 from "./routes/script/delScript"; -import route75 from "./routes/script/exportScript"; -import route76 from "./routes/script/extractAssets"; -import route77 from "./routes/script/getScrptApi"; -import route78 from "./routes/script/pollScriptAssets"; -import route79 from "./routes/script/updateScript"; -import route80 from "./routes/scriptAgent/getPlanData"; -import route81 from "./routes/scriptAgent/setPlanData"; -import route82 from "./routes/setting/about/checkUpdate"; -import route83 from "./routes/setting/about/downloadApp"; -import route84 from "./routes/setting/agentDeploy/agentSetKey"; -import route85 from "./routes/setting/agentDeploy/deployAgentModel"; -import route86 from "./routes/setting/agentDeploy/getAgentDeploy"; -import route87 from "./routes/setting/dbConfig/clearData"; -import route88 from "./routes/setting/dev/getSwitchAiDevTool"; -import route89 from "./routes/setting/dev/updateSwitchAiDevTool"; -import route90 from "./routes/setting/fileManagement/openFolder"; -import route91 from "./routes/setting/getTextModel"; -import route92 from "./routes/setting/loginConfig/getUser"; -import route93 from "./routes/setting/loginConfig/updateUserPwd"; -import route94 from "./routes/setting/memoryConfig/delAllMemory"; -import route95 from "./routes/setting/memoryConfig/getMemory"; -import route96 from "./routes/setting/memoryConfig/sureMemory"; -import route97 from "./routes/setting/promptManage/getPrompt"; -import route98 from "./routes/setting/promptManage/updatePrompt"; -import route99 from "./routes/setting/skillManagement/getSkillContent"; -import route100 from "./routes/setting/skillManagement/getSkillList"; -import route101 from "./routes/setting/skillManagement/saveSkillContent"; -import route102 from "./routes/setting/vendorConfig/addVendor"; -import route103 from "./routes/setting/vendorConfig/deleteVendor"; -import route104 from "./routes/setting/vendorConfig/getVendorList"; -import route105 from "./routes/setting/vendorConfig/modelTest"; -import route106 from "./routes/setting/vendorConfig/updateCode"; -import route107 from "./routes/setting/vendorConfig/updateVendor"; -import route108 from "./routes/task/getProject"; -import route109 from "./routes/task/getTaskApi"; -import route110 from "./routes/task/getTaskCategories"; -import route111 from "./routes/task/taskDetails"; -import route112 from "./routes/test/test"; +import route66 from "./routes/project/addVisualManual"; +import route67 from "./routes/project/deleteVisualManual"; +import route68 from "./routes/project/delProject"; +import route69 from "./routes/project/editProject"; +import route70 from "./routes/project/editVisualManual"; +import route71 from "./routes/project/getProject"; +import route72 from "./routes/project/getVisualManual"; +import route73 from "./routes/project/visualManual"; +import route74 from "./routes/script/addScript"; +import route75 from "./routes/script/delScript"; +import route76 from "./routes/script/exportScript"; +import route77 from "./routes/script/extractAssets"; +import route78 from "./routes/script/getScrptApi"; +import route79 from "./routes/script/pollScriptAssets"; +import route80 from "./routes/script/updateScript"; +import route81 from "./routes/scriptAgent/getPlanData"; +import route82 from "./routes/scriptAgent/setPlanData"; +import route83 from "./routes/setting/about/checkUpdate"; +import route84 from "./routes/setting/about/downloadApp"; +import route85 from "./routes/setting/agentDeploy/agentSetKey"; +import route86 from "./routes/setting/agentDeploy/deployAgentModel"; +import route87 from "./routes/setting/agentDeploy/getAgentDeploy"; +import route88 from "./routes/setting/dbConfig/clearData"; +import route89 from "./routes/setting/dev/getSwitchAiDevTool"; +import route90 from "./routes/setting/dev/updateSwitchAiDevTool"; +import route91 from "./routes/setting/fileManagement/openFolder"; +import route92 from "./routes/setting/getTextModel"; +import route93 from "./routes/setting/loginConfig/getUser"; +import route94 from "./routes/setting/loginConfig/updateUserPwd"; +import route95 from "./routes/setting/memoryConfig/delAllMemory"; +import route96 from "./routes/setting/memoryConfig/getMemory"; +import route97 from "./routes/setting/memoryConfig/sureMemory"; +import route98 from "./routes/setting/promptManage/getPrompt"; +import route99 from "./routes/setting/promptManage/updatePrompt"; +import route100 from "./routes/setting/skillManagement/getSkillContent"; +import route101 from "./routes/setting/skillManagement/getSkillList"; +import route102 from "./routes/setting/skillManagement/saveSkillContent"; +import route103 from "./routes/setting/vendorConfig/addVendor"; +import route104 from "./routes/setting/vendorConfig/deleteVendor"; +import route105 from "./routes/setting/vendorConfig/getVendorList"; +import route106 from "./routes/setting/vendorConfig/modelTest"; +import route107 from "./routes/setting/vendorConfig/updateCode"; +import route108 from "./routes/setting/vendorConfig/updateVendor"; +import route109 from "./routes/task/getProject"; +import route110 from "./routes/task/getTaskApi"; +import route111 from "./routes/task/getTaskCategories"; +import route112 from "./routes/task/taskDetails"; +import route113 from "./routes/test/test"; export default async (app: Express) => { app.use("/api/agents/clearMemory", route1); @@ -180,51 +181,52 @@ export default async (app: Express) => { app.use("/api/production/workbench/videoPolling", route63); app.use("/api/project/addProject", route64); app.use("/api/project/addVisual", route65); - app.use("/api/project/deleteVisualManual", route66); - app.use("/api/project/delProject", route67); - app.use("/api/project/editProject", route68); - app.use("/api/project/editVisualManual", route69); - app.use("/api/project/getProject", route70); - app.use("/api/project/getVisualManual", route71); - app.use("/api/project/visualManual", route72); - app.use("/api/script/addScript", route73); - app.use("/api/script/delScript", route74); - app.use("/api/script/exportScript", route75); - app.use("/api/script/extractAssets", route76); - app.use("/api/script/getScrptApi", route77); - app.use("/api/script/pollScriptAssets", route78); - app.use("/api/script/updateScript", route79); - app.use("/api/scriptAgent/getPlanData", route80); - app.use("/api/scriptAgent/setPlanData", route81); - app.use("/api/setting/about/checkUpdate", route82); - app.use("/api/setting/about/downloadApp", route83); - app.use("/api/setting/agentDeploy/agentSetKey", route84); - app.use("/api/setting/agentDeploy/deployAgentModel", route85); - app.use("/api/setting/agentDeploy/getAgentDeploy", route86); - app.use("/api/setting/dbConfig/clearData", route87); - app.use("/api/setting/dev/getSwitchAiDevTool", route88); - app.use("/api/setting/dev/updateSwitchAiDevTool", route89); - app.use("/api/setting/fileManagement/openFolder", route90); - app.use("/api/setting/getTextModel", route91); - app.use("/api/setting/loginConfig/getUser", route92); - app.use("/api/setting/loginConfig/updateUserPwd", route93); - app.use("/api/setting/memoryConfig/delAllMemory", route94); - app.use("/api/setting/memoryConfig/getMemory", route95); - app.use("/api/setting/memoryConfig/sureMemory", route96); - app.use("/api/setting/promptManage/getPrompt", route97); - app.use("/api/setting/promptManage/updatePrompt", route98); - app.use("/api/setting/skillManagement/getSkillContent", route99); - app.use("/api/setting/skillManagement/getSkillList", route100); - app.use("/api/setting/skillManagement/saveSkillContent", route101); - app.use("/api/setting/vendorConfig/addVendor", route102); - app.use("/api/setting/vendorConfig/deleteVendor", route103); - app.use("/api/setting/vendorConfig/getVendorList", route104); - app.use("/api/setting/vendorConfig/modelTest", route105); - app.use("/api/setting/vendorConfig/updateCode", route106); - app.use("/api/setting/vendorConfig/updateVendor", route107); - app.use("/api/task/getProject", route108); - app.use("/api/task/getTaskApi", route109); - app.use("/api/task/getTaskCategories", route110); - app.use("/api/task/taskDetails", route111); - app.use("/api/test/test", route112); + app.use("/api/project/addVisualManual", route66); + app.use("/api/project/deleteVisualManual", route67); + app.use("/api/project/delProject", route68); + app.use("/api/project/editProject", route69); + app.use("/api/project/editVisualManual", route70); + app.use("/api/project/getProject", route71); + app.use("/api/project/getVisualManual", route72); + app.use("/api/project/visualManual", route73); + app.use("/api/script/addScript", route74); + app.use("/api/script/delScript", route75); + app.use("/api/script/exportScript", route76); + app.use("/api/script/extractAssets", route77); + app.use("/api/script/getScrptApi", route78); + app.use("/api/script/pollScriptAssets", route79); + app.use("/api/script/updateScript", route80); + app.use("/api/scriptAgent/getPlanData", route81); + app.use("/api/scriptAgent/setPlanData", route82); + app.use("/api/setting/about/checkUpdate", route83); + app.use("/api/setting/about/downloadApp", route84); + app.use("/api/setting/agentDeploy/agentSetKey", route85); + app.use("/api/setting/agentDeploy/deployAgentModel", route86); + app.use("/api/setting/agentDeploy/getAgentDeploy", route87); + app.use("/api/setting/dbConfig/clearData", route88); + app.use("/api/setting/dev/getSwitchAiDevTool", route89); + app.use("/api/setting/dev/updateSwitchAiDevTool", route90); + app.use("/api/setting/fileManagement/openFolder", route91); + app.use("/api/setting/getTextModel", route92); + app.use("/api/setting/loginConfig/getUser", route93); + app.use("/api/setting/loginConfig/updateUserPwd", route94); + app.use("/api/setting/memoryConfig/delAllMemory", route95); + app.use("/api/setting/memoryConfig/getMemory", route96); + app.use("/api/setting/memoryConfig/sureMemory", route97); + app.use("/api/setting/promptManage/getPrompt", route98); + app.use("/api/setting/promptManage/updatePrompt", route99); + app.use("/api/setting/skillManagement/getSkillContent", route100); + app.use("/api/setting/skillManagement/getSkillList", route101); + app.use("/api/setting/skillManagement/saveSkillContent", route102); + app.use("/api/setting/vendorConfig/addVendor", route103); + app.use("/api/setting/vendorConfig/deleteVendor", route104); + app.use("/api/setting/vendorConfig/getVendorList", route105); + app.use("/api/setting/vendorConfig/modelTest", route106); + app.use("/api/setting/vendorConfig/updateCode", route107); + app.use("/api/setting/vendorConfig/updateVendor", route108); + app.use("/api/task/getProject", route109); + app.use("/api/task/getTaskApi", route110); + app.use("/api/task/getTaskCategories", route111); + app.use("/api/task/taskDetails", route112); + app.use("/api/test/test", route113); } diff --git a/src/routes/project/addVisualManual.ts b/src/routes/project/addVisualManual.ts new file mode 100644 index 0000000..e25f6a6 --- /dev/null +++ b/src/routes/project/addVisualManual.ts @@ -0,0 +1,102 @@ +import express from "express"; +import u from "@/utils"; +import { error, success } from "@/lib/responseFormat"; +import fs from "fs"; +import path from "path"; +import { validateFields } from "@/middleware/middleware"; +import { z } from "zod"; +const router = express.Router(); + +// 编辑视觉手册 +export default router.post( + "/", + validateFields({ + name: z.string(), + images: z.array(z.string()), + data: z.array( + z.object({ + label: z.string(), + value: z.string(), + data: z.string(), + }), + ), + }), + async (req, res) => { + try { + const { name, images, data } = req.body as { + name: string; + images: string[]; + data: { label: string; value: string; data: string }[]; + }; + + if (/^\d+$/.test(name)) { + res.status(400).send(error("名称不能为纯数字")); + return; + } + + const mainPath = u.getPath(["skills", "art_prompts", name]); + if (fs.existsSync(mainPath)) { + return res.status(400).send(error("请勿填写重复名称的视觉手册")); + } + // 字段映射表(与 getVisualManual 保持一致) + const DATA_MAP: { value: string; subDir?: string }[] = [ + { value: "README" }, + { value: "prefix" }, + { value: "art_character", subDir: "art_prompt" }, + { value: "art_character_derivative", subDir: "art_prompt" }, + { value: "art_prop", subDir: "art_prompt" }, + { value: "art_prop_derivative", subDir: "art_prompt" }, + { value: "art_scene", subDir: "art_prompt" }, + { value: "art_scene_derivative", subDir: "art_prompt" }, + { value: "art_storyboard", subDir: "art_prompt" }, + { value: "art_storyboard_video", subDir: "art_prompt" }, + { value: "director_planning", subDir: "driector_skills" }, + { value: "director_storyboard_table", subDir: "driector_skills" }, + ]; + + // 根据 DATA_MAP 构建 value -> subDir 的映射 + const SUB_DIR_MAP = new Map(DATA_MAP.map(({ value, subDir }) => [value, subDir ?? ""])); + + // 合法的 value 值集合,用于校验 + const VALID_KEYS = new Set(DATA_MAP.map(({ value }) => value)); + + for (const item of data) { + if (!VALID_KEYS.has(item.value)) continue; + + const subDir = SUB_DIR_MAP.get(item.value)!; + const dirArr = subDir ? [mainPath, subDir] : [mainPath]; + const filePath = u.getPath([...dirArr, `${item.value}.md`]); + + const fileDir = path.dirname(filePath); + // 目录不存在时递归创建 + if (!fs.existsSync(fileDir)) { + fs.mkdirSync(fileDir, { recursive: true }); + } + fs.writeFileSync(filePath, item.data, "utf-8"); + } + const ossImagesDir = u.getPath(["oss", name]); + + let existingFiles: string[] = []; + try { + const allFiles = fs.readdirSync(ossImagesDir); + existingFiles = allFiles.filter((f) => /\.(png|jpe?g|gif|webp|svg)$/i.test(f)); + } catch {} + + const retainedFileNames = new Set(images.filter((item) => item.startsWith("http")).map((url) => path.basename(new URL(url).pathname))); + + for (const file of existingFiles) { + if (!retainedFileNames.has(file)) { + await u.oss.deleteFile(`${name}/${file}`); + } + } + + for (const item of images) { + if (!item.startsWith("http")) await u.oss.writeFile(`${name}/${u.uuid()}.jpg`, item); + } + + res.status(200).send(success()); + } catch (err) { + res.status(500).send({ error: String(err) }); + } + }, +); diff --git a/src/routes/project/editVisualManual.ts b/src/routes/project/editVisualManual.ts index 142975f..6171620 100644 --- a/src/routes/project/editVisualManual.ts +++ b/src/routes/project/editVisualManual.ts @@ -35,21 +35,23 @@ export default router.post( } const mainPath = u.getPath(["skills", "art_prompts", name]); - + if (!fs.existsSync(mainPath)) { + return res.status(400).send(error("视觉手册不存在")); + } // 字段映射表(与 getVisualManual 保持一致) - const DATA_MAP: { label: string; value: string; subDir?: string }[] = [ - { label: "README", value: "README" }, - { label: "前缀", value: "prefix" }, - { label: "角色", value: "art_character", subDir: "art_prompt" }, - { label: "角色衍生", value: "art_character_derivative", subDir: "art_prompt" }, - { label: "道具", value: "art_prop", subDir: "art_prompt" }, - { label: "道具衍生", value: "art_prop_derivative", subDir: "art_prompt" }, - { label: "场景", value: "art_scene", subDir: "art_prompt" }, - { label: "场景衍生", value: "art_scene_derivative", subDir: "art_prompt" }, - { label: "分镜", value: "art_storyboard", subDir: "art_prompt" }, - { label: "分镜视频", value: "art_storyboard_video", subDir: "art_prompt" }, - { label: "技法-导演规划", value: "director_planning", subDir: "driector_skills" }, - { label: "技法-分镜表设计", value: "director_storyboard_table", subDir: "driector_skills" }, + const DATA_MAP: { value: string; subDir?: string }[] = [ + { value: "README" }, + { value: "prefix" }, + { value: "art_character", subDir: "art_prompt" }, + { value: "art_character_derivative", subDir: "art_prompt" }, + { value: "art_prop", subDir: "art_prompt" }, + { value: "art_prop_derivative", subDir: "art_prompt" }, + { value: "art_scene", subDir: "art_prompt" }, + { value: "art_scene_derivative", subDir: "art_prompt" }, + { value: "art_storyboard", subDir: "art_prompt" }, + { value: "art_storyboard_video", subDir: "art_prompt" }, + { value: "director_planning", subDir: "driector_skills" }, + { value: "director_storyboard_table", subDir: "driector_skills" }, ]; // 根据 DATA_MAP 构建 value -> subDir 的映射 diff --git a/src/utils/getArtPrompt.ts b/src/utils/getArtPrompt.ts index 08b0782..1b6d679 100644 --- a/src/utils/getArtPrompt.ts +++ b/src/utils/getArtPrompt.ts @@ -15,14 +15,19 @@ export function getArtPrompt(styleName: string, fileName: string): string { return ""; } + // 获取 prefix.md 内容 + const prefixFile = findFileRecursive(baseDir, "prefix.md"); + const prefixContent = prefixFile ? fs.readFileSync(prefixFile, "utf-8") : ""; + const target = fileName.endsWith(".md") ? fileName : `${fileName}.md`; const found = findFileRecursive(baseDir, target); if (!found) { - return ""; + return prefixContent; } - return fs.readFileSync(found, "utf-8"); + const fileContent = fs.readFileSync(found, "utf-8"); + return prefixContent ? `${prefixContent}\n${fileContent}` : fileContent; } /** * 传入风格目录名,获取该风格下所有 .md 文件内容,按文件名映射返回 From 618007d80be1589399e2dcda59e0d9dbb2037827 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B8=85?= <2944435683> Date: Sun, 29 Mar 2026 22:20:17 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=9F=E6=88=90?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E8=A7=86=E8=A7=89=E6=89=8B=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chinese_sweet_romance/README.md | 2 +- .../assetsGenerate/batchPolishAssetsPrompt.ts | 19 ++++++++-------- .../assetsGenerate/polishAssetsPrompt.ts | 22 +++++++++---------- src/types/database.d.ts | 21 ++++++++++++------ 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/data/skills/art_prompts/chinese_sweet_romance/README.md b/data/skills/art_prompts/chinese_sweet_romance/README.md index 0d35dd8..165cb0d 100644 --- a/data/skills/art_prompts/chinese_sweet_romance/README.md +++ b/data/skills/art_prompts/chinese_sweet_romance/README.md @@ -1,4 +1,4 @@ name 123123水电费水电费水电费水电费水电费 -123123123 +12312312312 123123123 \ No newline at end of file diff --git a/src/routes/assetsGenerate/batchPolishAssetsPrompt.ts b/src/routes/assetsGenerate/batchPolishAssetsPrompt.ts index b05abf0..7f42327 100644 --- a/src/routes/assetsGenerate/batchPolishAssetsPrompt.ts +++ b/src/routes/assetsGenerate/batchPolishAssetsPrompt.ts @@ -84,16 +84,13 @@ export default router.post( }); const result: ResultItem[] = Object.values(itemMap); - const typeConfig: Record = { - role: { promptKey: "role-polish", itemType: "characters", label: "角色标准四视图", nameLabel: "角色" }, - scene: { promptKey: "scene-polish", itemType: "scenes", label: "场景图", nameLabel: "场景" }, - tool: { promptKey: "tool-polish", itemType: "props", label: "道具图", nameLabel: "道具" }, + const typeConfig: Record = { + role: { promptKey: "role-polish", itemType: "characters", label: "角色标准四视图", nameLabel: "角色", visualManual: "art_character" }, + scene: { promptKey: "scene-polish", itemType: "scenes", label: "场景图", nameLabel: "场景", visualManual: "art_scene" }, + tool: { promptKey: "tool-polish", itemType: "props", label: "道具图", nameLabel: "道具", visualManual: "art_prop" }, }; - const novelData = (await u.db("o_novel").whereIn("chapterIndex", [1]).select("*")) as NovelChapter[]; const novelText = mergeNovelText(novelData); - const data = await u.db("o_prompt").where("type", "assetsPromptGeneration").first("data"); - // 批量更新所有 item 状态为生成中 const assetsIds = items.map((item: { assetsId: number }) => item.assetsId); await u.db("o_assets").whereIn("id", assetsIds).update({ promptState: "生成中" }); @@ -105,11 +102,12 @@ export default router.post( limit(async () => { const config = typeConfig[item.type]; if (!config) return; - + //获取到视觉手册 + const visualManual = await u.getArtPrompt(project.artStyle as string, config.visualManual); + if (!visualManual) return res.status(500).send(error("视觉手册未定义")); findItemByName(result, item.name, config.itemType); - const systemPrompt = `${data?.data} - + const systemPrompt = ` 请根据以下参数生成${config.label}提示词: **基础参数:** @@ -122,6 +120,7 @@ export default router.post( - ${config.nameLabel}描述:${item.describe}, 请严格按照skill规范生成${item.type === "role" ? "人物角色四视图" : config.label}提示词。 + ${visualManual} `; try { diff --git a/src/routes/assetsGenerate/polishAssetsPrompt.ts b/src/routes/assetsGenerate/polishAssetsPrompt.ts index f922283..bb12bc5 100644 --- a/src/routes/assetsGenerate/polishAssetsPrompt.ts +++ b/src/routes/assetsGenerate/polishAssetsPrompt.ts @@ -85,27 +85,26 @@ export default router.post( const result: ResultItem[] = Object.values(itemMap); - const typeConfig: Record = { - role: { promptKey: "role-polish", itemType: "characters", label: "角色标准四视图", nameLabel: "角色" }, - scene: { promptKey: "scene-polish", itemType: "scenes", label: "场景图", nameLabel: "场景" }, - tool: { promptKey: "tool-polish", itemType: "props", label: "道具图", nameLabel: "道具" }, + const typeConfig: Record = { + role: { promptKey: "role-polish", itemType: "characters", label: "角色标准四视图", nameLabel: "角色", visualManual: "art_character" }, + scene: { promptKey: "scene-polish", itemType: "scenes", label: "场景图", nameLabel: "场景", visualManual: "art_scene" }, + tool: { promptKey: "tool-polish", itemType: "props", label: "道具图", nameLabel: "道具", visualManual: "art_prop" }, }; const config = typeConfig[type]; if (!config) return res.status(500).send(error("不支持的类型")); - + if (!config.visualManual) return res.status(500).send(error("视觉手册未定义")); + //获取到视觉手册 + const visualManual = await u.getArtPrompt(project.artStyle as string, config.visualManual); + if (!visualManual) return res.status(500).send(error("视觉手册未定义")); findItemByName(result, name, config.itemType); const novelData = (await u.db("o_novel").whereIn("chapterIndex", [1]).select("*")) as NovelChapter[]; const novelText = mergeNovelText(novelData); - const data = await u.db("o_prompt").where("type", "assetsPromptGeneration").first("data"); - - const systemPrompt = `${data?.data} - + const systemPrompt = ` 请根据以下参数生成${config.label}提示词: **基础参数:** - - 风格: ${project?.artStyle || "未指定"} - 小说类型: ${project?.type || "未指定"} - 小说背景: ${project?.intro || "未指定"} @@ -113,7 +112,8 @@ export default router.post( - ${config.nameLabel}名称:${name}, - ${config.nameLabel}描述:${describe}, - 请严格按照skill规范生成${type === "role" ? "人物角色四视图" : config.label}提示词。 + 请严格按照skill规范生成${type === "role" ? "人物角色四视图" : config.label}提示词 + ${visualManual}。 `; try { diff --git a/src/types/database.d.ts b/src/types/database.d.ts index 4544078..735f17d 100644 --- a/src/types/database.d.ts +++ b/src/types/database.d.ts @@ -1,12 +1,18 @@ -// @db-hash f7bc2fdb80756d5536929eb47155578b +// @db-hash e24c7c99757472b92af11f26a2b2b8c7 //该文件由脚本自动生成,请勿手动修改 -export interface _o_script_old_20260327 { - 'content'?: string | null; +export interface _o_project_old_20260328 { + 'artStyle'?: string | null; 'createTime'?: number | null; - 'id'?: number; + 'id'?: number | null; + 'imageModel'?: string | null; + 'intro'?: string | null; 'name'?: string | null; - 'projectId'?: number | null; + 'projectType'?: string | null; + 'type'?: string | null; + 'userId'?: number | null; + 'videoModel'?: string | null; + 'videoRatio'?: string | null; } export interface memories { 'content': string; @@ -54,6 +60,7 @@ export interface o_assets { 'name'?: string | null; 'projectId'?: number | null; 'prompt'?: string | null; + 'promptState'?: string | null; 'remark'?: string | null; 'scriptId'?: number | null; 'startTime'?: number | null; @@ -173,7 +180,7 @@ export interface o_storyboard { 'filePath'?: string | null; 'frameMode'?: string | null; 'id'?: number; - 'index'?: string | null; + 'index'?: number | null; 'lines'?: string | null; 'mode'?: string | null; 'model'?: string | null; @@ -238,7 +245,7 @@ export interface o_videoConfig { } export interface DB { - "_o_script_old_20260327": _o_script_old_20260327; + "_o_project_old_20260328": _o_project_old_20260328; "memories": memories; "o_agentDeploy": o_agentDeploy; "o_agentWorkData": o_agentWorkData; From bb0970255172eddcbb2ec20dd35f82d97ac8bcd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=B8=85?= <2944435683> Date: Sun, 29 Mar 2026 23:11:41 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E8=BF=94=E5=9B=9E=E5=8E=86=E5=8F=B2=E8=B5=84?= =?UTF-8?q?=E4=BA=A7=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/skills/art_prompts/你好/README.md | 1 - .../你好/art_prompt/art_character.md | 1 - .../art_prompt/art_character_derivative.md | 1 - .../art_prompts/你好/art_prompt/art_prop.md | 1 - .../你好/art_prompt/art_prop_derivative.md | 1 - .../art_prompts/你好/art_prompt/art_scene.md | 1 - .../你好/art_prompt/art_scene_derivative.md | 1 - .../你好/art_prompt/art_storyboard.md | 1 - .../你好/art_prompt/art_storyboard_video.md | 1 - .../你好/driector_skills/director_planning.md | 1 - .../director_storyboard_table.md | 1 - data/skills/art_prompts/你好/prefix.md | 1 - src/routes/assets/getImage.ts | 1 - src/routes/cornerScape/getAllAssets.ts | 56 +++++++++++-------- 14 files changed, 33 insertions(+), 36 deletions(-) delete mode 100644 data/skills/art_prompts/你好/README.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_character.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_character_derivative.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_prop.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_prop_derivative.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_scene.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_scene_derivative.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_storyboard.md delete mode 100644 data/skills/art_prompts/你好/art_prompt/art_storyboard_video.md delete mode 100644 data/skills/art_prompts/你好/driector_skills/director_planning.md delete mode 100644 data/skills/art_prompts/你好/driector_skills/director_storyboard_table.md delete mode 100644 data/skills/art_prompts/你好/prefix.md diff --git a/data/skills/art_prompts/你好/README.md b/data/skills/art_prompts/你好/README.md deleted file mode 100644 index 67f98b5..0000000 --- a/data/skills/art_prompts/你好/README.md +++ /dev/null @@ -1 +0,0 @@ -1212水电费水电费萨芬的水电费 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_character.md b/data/skills/art_prompts/你好/art_prompt/art_character.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_character.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_character_derivative.md b/data/skills/art_prompts/你好/art_prompt/art_character_derivative.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_character_derivative.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_prop.md b/data/skills/art_prompts/你好/art_prompt/art_prop.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_prop.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_prop_derivative.md b/data/skills/art_prompts/你好/art_prompt/art_prop_derivative.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_prop_derivative.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_scene.md b/data/skills/art_prompts/你好/art_prompt/art_scene.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_scene.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_scene_derivative.md b/data/skills/art_prompts/你好/art_prompt/art_scene_derivative.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_scene_derivative.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_storyboard.md b/data/skills/art_prompts/你好/art_prompt/art_storyboard.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_storyboard.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/art_prompt/art_storyboard_video.md b/data/skills/art_prompts/你好/art_prompt/art_storyboard_video.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/art_prompt/art_storyboard_video.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/driector_skills/director_planning.md b/data/skills/art_prompts/你好/driector_skills/director_planning.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/driector_skills/director_planning.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/driector_skills/director_storyboard_table.md b/data/skills/art_prompts/你好/driector_skills/director_storyboard_table.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/driector_skills/director_storyboard_table.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/data/skills/art_prompts/你好/prefix.md b/data/skills/art_prompts/你好/prefix.md deleted file mode 100644 index f73dd74..0000000 --- a/data/skills/art_prompts/你好/prefix.md +++ /dev/null @@ -1 +0,0 @@ -1212 \ No newline at end of file diff --git a/src/routes/assets/getImage.ts b/src/routes/assets/getImage.ts index b575e5d..56d1a4c 100644 --- a/src/routes/assets/getImage.ts +++ b/src/routes/assets/getImage.ts @@ -31,7 +31,6 @@ export default router.post( imageId: assets!.imageId ?? null, tempAssets, }; - console.log("%c Line:30 🥤 data", "background:#465975", data); res.status(200).send(success(data)); }, ); diff --git a/src/routes/cornerScape/getAllAssets.ts b/src/routes/cornerScape/getAllAssets.ts index 8db8713..0977f2e 100644 --- a/src/routes/cornerScape/getAllAssets.ts +++ b/src/routes/cornerScape/getAllAssets.ts @@ -6,28 +6,38 @@ import { validateFields } from "@/middleware/middleware"; const router = express.Router(); export default router.post( - "/", - validateFields({ - projectId: z.number(), - type: z.array(z.string()).optional(), - }), - async (req, res) => { - const { projectId, type, } = req.body; - const data = await u - .db("o_assets") - .leftJoin("o_image", "o_assets.imageId", "o_image.id") - .select("o_assets.*", "o_image.filePath", "o_image.state", "o_image.model", "o_image.resolution") - .where("o_assets.projectId", projectId) - .andWhere("o_assets.type", "<>", "clip") - .modify((qb) => { - if (type && type.length > 0) qb.whereIn("o_assets.type", type); - }); - const result = await Promise.all( - data.map(async (parent: any) => ({ - ...parent, - filePath: parent.filePath && (await u.oss.getFileUrl(parent.filePath!)), - })), + "/", + validateFields({ + projectId: z.number(), + type: z.array(z.string()).optional(), + }), + async (req, res) => { + const { projectId, type } = req.body; + const data = await u + .db("o_assets") + .leftJoin("o_image", "o_assets.imageId", "o_image.id") + .select("o_assets.*", "o_image.filePath", "o_image.state", "o_image.model", "o_image.resolution") + .where("o_assets.projectId", projectId) + .andWhere("o_assets.type", "<>", "clip") + .modify((qb) => { + if (type && type.length > 0) qb.whereIn("o_assets.type", type); + }); + const result = await Promise.all( + data.map(async (parent: any) => { + const historyImages = await u.db("o_image").where("assetsId", parent.id).andWhere("state", "已完成").select("id", "filePath"); + const historyImagesWithUrl = await Promise.all( + historyImages.map(async (img: any) => ({ + id: img.id, + filePath: img.filePath && (await u.oss.getFileUrl(img.filePath)), + })), ); - res.status(200).send(success(result)); - }, + return { + ...parent, + filePath: parent.filePath && (await u.oss.getFileUrl(parent.filePath!)), + historyImages: historyImagesWithUrl, + }; + }), + ); + res.status(200).send(success(result)); + }, );