diff --git a/data/skills/art_skills/2D_flat_design/README.md b/data/skills/art_skills/2D_flat_design/README.md index f1cb3fe..9faf126 100644 --- a/data/skills/art_skills/2D_flat_design/README.md +++ b/data/skills/art_skills/2D_flat_design/README.md @@ -1,4 +1,5 @@ # 2D扁平风(Flat Design)风格说明 +# 2D扁平风(Flat Design)风格说明 本风格专为"2D扁平风(Flat Design)"题材打造,所有美术提示词、规范和生成内容均严格限定于: diff --git a/data/skills/art_skills/2D_flat_design/art_prompt/art_character_flat.md b/data/skills/art_skills/2D_flat_design/art_prompt/art_character.md similarity index 100% rename from data/skills/art_skills/2D_flat_design/art_prompt/art_character_flat.md rename to data/skills/art_skills/2D_flat_design/art_prompt/art_character.md diff --git a/data/skills/art_skills/2D_flat_design/art_prompt/art_character_derivative_flat.md b/data/skills/art_skills/2D_flat_design/art_prompt/art_character_derivative.md similarity index 100% rename from data/skills/art_skills/2D_flat_design/art_prompt/art_character_derivative_flat.md rename to data/skills/art_skills/2D_flat_design/art_prompt/art_character_derivative.md diff --git a/data/skills/art_skills/2D_flat_design/art_prompt/art_prop_flat.md b/data/skills/art_skills/2D_flat_design/art_prompt/art_prop.md similarity index 100% rename from data/skills/art_skills/2D_flat_design/art_prompt/art_prop_flat.md rename to data/skills/art_skills/2D_flat_design/art_prompt/art_prop.md diff --git a/data/skills/art_skills/2D_flat_design/art_prompt/art_prop_derivative_flat.md b/data/skills/art_skills/2D_flat_design/art_prompt/art_prop_derivative.md similarity index 100% rename from data/skills/art_skills/2D_flat_design/art_prompt/art_prop_derivative_flat.md rename to data/skills/art_skills/2D_flat_design/art_prompt/art_prop_derivative.md diff --git a/data/skills/art_skills/2D_flat_design/art_prompt/art_scene_flat.md b/data/skills/art_skills/2D_flat_design/art_prompt/art_scene.md similarity index 100% rename from data/skills/art_skills/2D_flat_design/art_prompt/art_scene_flat.md rename to data/skills/art_skills/2D_flat_design/art_prompt/art_scene.md diff --git a/data/skills/art_skills/2D_flat_design/art_prompt/art_scene_derivative_flat.md b/data/skills/art_skills/2D_flat_design/art_prompt/art_scene_derivative.md similarity index 100% rename from data/skills/art_skills/2D_flat_design/art_prompt/art_scene_derivative_flat.md rename to data/skills/art_skills/2D_flat_design/art_prompt/art_scene_derivative.md diff --git a/data/skills/art_skills/2D_flat_design/images/场景原始.png b/data/skills/art_skills/2D_flat_design/images/场景原始.png deleted file mode 100644 index dd54d11..0000000 Binary files a/data/skills/art_skills/2D_flat_design/images/场景原始.png and /dev/null differ diff --git a/data/skills/art_skills/2D_flat_design/images/场景衍生.png b/data/skills/art_skills/2D_flat_design/images/场景衍生.png deleted file mode 100644 index 36e4370..0000000 Binary files a/data/skills/art_skills/2D_flat_design/images/场景衍生.png and /dev/null differ diff --git a/data/skills/art_skills/2D_flat_design/images/女生原始.png b/data/skills/art_skills/2D_flat_design/images/女生原始.png deleted file mode 100644 index 05b6f5b..0000000 Binary files a/data/skills/art_skills/2D_flat_design/images/女生原始.png and /dev/null differ diff --git a/data/skills/art_skills/2D_flat_design/images/女生衍生.png b/data/skills/art_skills/2D_flat_design/images/女生衍生.png deleted file mode 100644 index d59136a..0000000 Binary files a/data/skills/art_skills/2D_flat_design/images/女生衍生.png and /dev/null differ diff --git a/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character_modern.md b/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character_modern.md rename to data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character.md diff --git a/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character_derivative_modern.md b/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character_derivative.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character_derivative_modern.md rename to data/skills/art_skills/realpeople_urban_modern/art_prompt/art_character_derivative.md diff --git a/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop_modern.md b/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop_modern.md rename to data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop.md diff --git a/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop_derivative_modern.md b/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop_derivative.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop_derivative_modern.md rename to data/skills/art_skills/realpeople_urban_modern/art_prompt/art_prop_derivative.md diff --git a/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene_modern.md b/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene_modern.md rename to data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene.md diff --git a/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene_derivative_modern.md b/data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene_derivative.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene_derivative_modern.md rename to data/skills/art_skills/realpeople_urban_modern/art_prompt/art_scene_derivative.md diff --git a/data/skills/art_skills/realpeople_urban_modern/driector_skills/director_planning.md b/data/skills/art_skills/realpeople_urban_modern/driector_skills/director_planning_style.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/driector_skills/director_planning.md rename to data/skills/art_skills/realpeople_urban_modern/driector_skills/director_planning_style.md diff --git a/data/skills/art_skills/realpeople_urban_modern/driector_skills/director_storyboard_table.md b/data/skills/art_skills/realpeople_urban_modern/driector_skills/director_storyboard_table_style.md similarity index 100% rename from data/skills/art_skills/realpeople_urban_modern/driector_skills/director_storyboard_table.md rename to data/skills/art_skills/realpeople_urban_modern/driector_skills/director_storyboard_table_style.md diff --git a/data/web/index.html b/data/web/index.html index 4ce72ed..6c0a904 100644 --- a/data/web/index.html +++ b/data/web/index.html @@ -5,37 +5,37 @@ Toonflow - - + `),GFs=/enable|requires|diagnostic/,_vn=new RegExp("[_\\p{XID_Start}]\\p{XID_Continue}*","u"),uF="variable.predefined",YFs={tokenPostfix:".wgsl",defaultToken:"invalid",unicode:!0,atoms:NFs,keywords:UFs,reserved:jFs,predeclared_enums:WFs,predeclared_types:VFs,predeclared_type_generators:zFs,predeclared_type_aliases:HFs,predeclared_intrinsics:$Fs,operators:XFs,symbols:/[!%&*+\-\.\/:;<=>^|_~,]+/,tokenizer:{root:[[GFs,"keyword","@directive"],[_vn,{cases:{"@atoms":uF,"@keywords":"keyword","@reserved":"invalid","@predeclared_enums":uF,"@predeclared_types":uF,"@predeclared_type_generators":uF,"@predeclared_type_aliases":uF,"@predeclared_intrinsics":uF,"@default":"identifier"}}],{include:"@commentOrSpace"},{include:"@numbers"},[/[{}()\[\]]/,"@brackets"],["@","annotation","@attribute"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/./,"invalid"]],commentOrSpace:[[/\s+/,"white"],[/\/\*/,"comment","@blockComment"],[/\/\/.*$/,"comment"]],blockComment:[[/[^\/*]+/,"comment"],[/\/\*/,"comment","@push"],[/\*\//,"comment","@pop"],[/[\/*]/,"comment"]],attribute:[{include:"@commentOrSpace"},[/\w+/,"annotation","@pop"]],directive:[{include:"@commentOrSpace"},[/[()]/,"@brackets"],[/,/,"delimiter"],[_vn,"meta.content"],[/;/,"delimiter","@pop"]],numbers:[[/0[fh]/,"number.float"],[/[1-9][0-9]*[fh]/,"number.float"],[/[0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+\.[0-9]*([eE][+-]?[0-9]+)?[fh]?/,"number.float"],[/[0-9]+[eE][+-]?[0-9]+[fh]?/,"number.float"],[/0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*(?:[pP][+-]?[0-9]+[fh]?)?/,"number.hex"],[/0[xX][0-9a-fA-F]+[pP][+-]?[0-9]+[fh]?/,"number.hex"],[/0[xX][0-9a-fA-F]+[iu]?/,"number.hex"],[/[1-9][0-9]*[iu]?/,"number"],[/0[iu]?/,"number"]]}},ZFs=Object.freeze(Object.defineProperty({__proto__:null,conf:FFs,language:YFs},Symbol.toStringTag,{value:"Module"})),qFs={comments:{blockComment:["\x3C!--","-->"]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:Et.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:Et.IndentAction.Indent}}]},KFs={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[/\x3C!--/,{token:"comment",next:"@comment"}]],comment:[[/[^<\-]+/,"comment.content"],[/-->/,{token:"comment",next:"@pop"}],[/\x3C!--/,"comment.content.invalid"],[/[<\-]/,"comment.content"]]}},JFs=Object.freeze(Object.defineProperty({__proto__:null,conf:qFs,language:KFs},Symbol.toStringTag,{value:"Module"})),eNs={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:Et.IndentAction.Indent}}]},tNs={tokenPostfix:".yaml",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.square",open:"[",close:"]"}],keywords:["true","True","TRUE","false","False","FALSE","null","Null","Null","~"],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/%[^ ]+.*$/,"meta.directive"],[/---/,"operators.directivesEnd"],[/\.{3}/,"operators.documentEnd"],[/[-?:](?= )/,"operators"],{include:"@anchor"},{include:"@tagHandle"},{include:"@flowCollections"},{include:"@blockStyle"},[/@numberInteger(?![ \t]*\S+)/,"number"],[/@numberFloat(?![ \t]*\S+)/,"number.float"],[/@numberOctal(?![ \t]*\S+)/,"number.octal"],[/@numberHex(?![ \t]*\S+)/,"number.hex"],[/@numberInfinity(?![ \t]*\S+)/,"number.infinity"],[/@numberNaN(?![ \t]*\S+)/,"number.nan"],[/@numberDate(?![ \t]*\S+)/,"number.date"],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,["type","white","operators","white"]],{include:"@flowScalars"},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":"keyword","@default":"string"}}]],object:[{include:"@whitespace"},{include:"@comment"},[/\}/,"@brackets","@pop"],[/,/,"delimiter.comma"],[/:(?= )/,"operators"],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,"type"],{include:"@flowCollections"},{include:"@flowScalars"},{include:"@tagHandle"},{include:"@anchor"},{include:"@flowNumber"},[/[^\},]+/,{cases:{"@keywords":"keyword","@default":"string"}}]],array:[{include:"@whitespace"},{include:"@comment"},[/\]/,"@brackets","@pop"],[/,/,"delimiter.comma"],{include:"@flowCollections"},{include:"@flowScalars"},{include:"@tagHandle"},{include:"@anchor"},{include:"@flowNumber"},[/[^\],]+/,{cases:{"@keywords":"keyword","@default":"string"}}]],multiString:[[/^( +).+$/,"string","@multiStringContinued.$1"]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":"string","@default":{token:"@rematch",next:"@popall"}}}]],whitespace:[[/[ \t\r\n]+/,"white"]],comment:[[/#.*$/,"comment"]],flowCollections:[[/\[/,"@brackets","@array"],[/\{/,"@brackets","@object"]],flowScalars:[[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'[^']*'/,"string"],[/"/,"string","@doubleQuotedString"]],doubleQuotedString:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,"string","@pop"]],blockStyle:[[/[>|][0-9]*[+-]?$/,"operators","@multiString"]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,"number"],[/@numberFloat(?=[ \t]*[,\]\}])/,"number.float"],[/@numberOctal(?=[ \t]*[,\]\}])/,"number.octal"],[/@numberHex(?=[ \t]*[,\]\}])/,"number.hex"],[/@numberInfinity(?=[ \t]*[,\]\}])/,"number.infinity"],[/@numberNaN(?=[ \t]*[,\]\}])/,"number.nan"],[/@numberDate(?=[ \t]*[,\]\}])/,"number.date"]],tagHandle:[[/\![^ ]*/,"tag"]],anchor:[[/[&*][^ ]+/,"namespace"]]}},nNs=Object.freeze(Object.defineProperty({__proto__:null,conf:eNs,language:tNs},Symbol.toStringTag,{value:"Module"})); +
diff --git a/electron-builder.yml b/electron-builder.yml index c13ea1a..66d87d0 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -47,6 +47,7 @@ nsis: artifactName: ${productName}-${version}-win-${arch}-setup.${ext} installerIcon: './scripts/logo.ico' uninstallerIcon: './scripts/logo.ico' + include: ./scripts/installer.nsh mac: target: diff --git a/scripts/installer.nsh b/scripts/installer.nsh new file mode 100644 index 0000000..c1e6e59 --- /dev/null +++ b/scripts/installer.nsh @@ -0,0 +1,25 @@ +!macro customInstall + ; Check if VC++ Redistributable is already installed + ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\X64" "Installed" + ${If} $0 != 1 + DetailPrint "Downloading Visual C++ Redistributable..." + ${If} ${RunningX64} + inetc::get "https://aka.ms/vs/17/release/vc_redist.x64.exe" "$TEMP\vc_redist.exe" /END + ${Else} + inetc::get "https://aka.ms/vs/17/release/vc_redist.arm64.exe" "$TEMP\vc_redist.exe" /END + ${EndIf} + Pop $0 + ${If} $0 == "OK" + DetailPrint "Installing Visual C++ Redistributable..." + nsExec::ExecToLog '"$TEMP\vc_redist.exe" /install /quiet /norestart' + Pop $0 + DetailPrint "VC++ Redistributable install returned: $0" + ${Else} + DetailPrint "VC++ Redistributable download failed: $0" + MessageBox MB_OK|MB_ICONEXCLAMATION "Visual C++ Redistributable download failed. Please install it manually from https://aka.ms/vs/17/release/vc_redist.x64.exe" + ${EndIf} + Delete "$TEMP\vc_redist.exe" + ${Else} + DetailPrint "Visual C++ Redistributable is already installed." + ${EndIf} +!macroend diff --git a/src/routes/assets/delAssets.ts b/src/routes/assets/delAssets.ts index 162e55b..d5195df 100644 --- a/src/routes/assets/delAssets.ts +++ b/src/routes/assets/delAssets.ts @@ -14,6 +14,7 @@ export default router.post( const { id } = req.body; const assetsData = await u.db("o_image").where("assetsId", id); await Promise.all(assetsData.map((i) => i.filePath && u.oss.deleteFile(i.filePath))); + await u.db("o_image").where({ assetsId: id }).delete(); await u.db("o_assets").where({ id }).delete(); res.status(200).send(success({ message: "删除资产成功" })); }, diff --git a/src/routes/production/workbench/delVideo.ts b/src/routes/production/workbench/delVideo.ts index 4b87855..dd1c300 100644 --- a/src/routes/production/workbench/delVideo.ts +++ b/src/routes/production/workbench/delVideo.ts @@ -13,6 +13,9 @@ export default router.post( async (req, res) => { const { id } = req.body; await u.db("o_video").where("id", id).delete(); + await u.db("o_videoTrack").where("videoId", id).update({ + videoId: null, + }); res.status(200).send(success({ message: "视频删除成功" })); }, ); diff --git a/src/routes/production/workbench/generateVideoPrompt.ts b/src/routes/production/workbench/generateVideoPrompt.ts index d3fd0f2..74a1deb 100644 --- a/src/routes/production/workbench/generateVideoPrompt.ts +++ b/src/routes/production/workbench/generateVideoPrompt.ts @@ -76,9 +76,7 @@ export default router.post( const projectData = await u.db("o_project").select("*").where({ id: projectId }).first(); const videoPrompt = await u.db("o_prompt").where("type", "videoPromptGeneration").first(); const artStyle = projectData?.artStyle || "无"; - const data = projectData?.directorManual || "无"; const visualManual = u.getArtPrompt(artStyle, "art_skills", "art_storyboard_video"); - const directorManual = u.getArtPrompt(data, "story_skills", "narrative_sweet_romance"); const content = ` **模型名称**:${modelData}, **资产信息**(角色、场景、道具):${assets.map((i) => `[id:${i.id},type:${i.type},name:${i.name}]`).join(",")}, @@ -99,7 +97,7 @@ export default router.post( messages: [ { role: "assistant", - content: `${visualManual}\n${directorManual}`, + content: `${visualManual}`, }, { role: "user", diff --git a/src/routes/project/addVisualManual.ts b/src/routes/project/addVisualManual.ts index b185614..65a2170 100644 --- a/src/routes/project/addVisualManual.ts +++ b/src/routes/project/addVisualManual.ts @@ -50,10 +50,10 @@ export default router.post( { 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: "director_storyboard", subDir: "driector_skills" }, { value: "art_storyboard_video", subDir: "art_prompt" }, - { value: "director_planning", subDir: "driector_skills" }, - { value: "director_storyboard_table", subDir: "driector_skills" }, + { value: "director_planning_style", subDir: "driector_skills" }, + { value: "director_storyboard_table_style", subDir: "driector_skills" }, ]; // 根据 DATA_MAP 构建 value -> subDir 的映射 diff --git a/src/routes/project/delProject.ts b/src/routes/project/delProject.ts index 4ceed7c..40f2658 100644 --- a/src/routes/project/delProject.ts +++ b/src/routes/project/delProject.ts @@ -13,27 +13,47 @@ export default router.post( }), async (req, res) => { const { id } = req.body; - + //删除项目 + await u.db("o_project").where("id", id).delete(); + await u.db("o_agentWorkData").where("projectId", id).delete(); + const novelData = await u.db("o_novel").where("projectId", id).select("id"); + const novelId = novelData.map((item: any) => item.id); + if (novelId.length > 0) { + await u.db("o_outlineNovel").whereIn("novelId", novelId).delete(); + } + //删除项目下的原文 + await u.db("o_novel").where("projectId", id).delete(); + // 删除项目下的剧本信息 const scriptData = await u.db("o_script").where("projectId", id).select("id"); const scriptIds = scriptData.map((item: any) => item.id); - + if (scriptIds.length > 0) { + await u.db("o_scriptAssets").whereIn("scriptId", scriptIds).delete(); + } + await u.db("o_script").where("projectId", id).delete(); + await u.db("o_outline").where("projectId", id).delete(); + // 删除项目下的任务 + await u.db("o_tasks").where("projectId", id).delete(); + // 删除项目下的分镜 + const storyboardData = await u.db("o_storyboard").where("projectId", id).select("id"); + const storyboardIds = storyboardData.map((item: any) => item.id); + if (storyboardIds.length > 0) { + await u.db("o_assets2Storyboard").whereIn("storyboardId", storyboardIds).delete(); + } + await u.db("o_storyboard").where("projectId", id).delete(); + //删除需要删除资产的归属图片 const assetsData = await u.db("o_assets").where("projectId", id).select("id"); const assetsIds = assetsData.map((item: any) => item.id); - - await u.db("o_project").where("id", id).delete(); - await u.db("o_novel").where("projectId", id).delete(); - await u.db("o_outline").where("projectId", id).delete(); - await u.db("o_tasks").where("projectId", id).delete(); - - await u.db("o_script").where("projectId", id).delete(); - await u.db("o_assets").where("projectId", id).delete(); - if (assetsIds.length > 0) { - await u.db("o_image").where("projectId", id).orWhereIn("assetsId", assetsIds).delete(); + // 先将 o_assets.imageId 置空,解除对 o_image 的外键引用 + await u.db("o_assets").whereIn("id", assetsIds).update({ imageId: null }); + await u.db("o_image").whereIn("assetsId", assetsIds).delete(); } - - await u.db("o_video").whereIn("scriptId", scriptIds).delete(); - + // 删除项目下的资产 + await u.db("o_assets").where("projectId", id).delete(); + //删除项目下的视频轨道和视频 + await u.db("o_videoTrack").where("projectId", id).delete(); + await u.db("o_video").where("projectId", id).delete(); + //删除项目下的资源 try { await u.oss.deleteDirectory(`${id}/`); console.log(`项目 ${id} 的OSS文件夹删除成功`); diff --git a/src/routes/project/editVisualManual.ts b/src/routes/project/editVisualManual.ts index efbaa09..27bab04 100644 --- a/src/routes/project/editVisualManual.ts +++ b/src/routes/project/editVisualManual.ts @@ -51,10 +51,10 @@ export default router.post( { 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: "director_storyboard", subDir: "driector_skills" }, { value: "art_storyboard_video", subDir: "art_prompt" }, - { value: "director_planning", subDir: "driector_skills" }, - { value: "director_storyboard_table", subDir: "driector_skills" }, + { value: "director_planning_style", subDir: "driector_skills" }, + { value: "director_storyboard_table_style", subDir: "driector_skills" }, ]; // 根据 DATA_MAP 构建 value -> subDir 的映射 diff --git a/src/routes/project/getVisualManual.ts b/src/routes/project/getVisualManual.ts index 9d13410..72e27cb 100644 --- a/src/routes/project/getVisualManual.ts +++ b/src/routes/project/getVisualManual.ts @@ -15,10 +15,10 @@ const DATA_MAP: { label: string; value: string; subDir?: string }[] = [ { 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: "director_storyboard", subDir: "driector_skills" }, { label: "分镜视频", value: "art_storyboard_video", subDir: "art_prompt" }, - { label: "技法-导演规划", value: "director_planning", subDir: "driector_skills" }, - { label: "技法-分镜表设计", value: "director_storyboard_table", subDir: "driector_skills" }, + { label: "技法-导演规划", value: "director_planning_style", subDir: "driector_skills" }, + { label: "技法-分镜表设计", value: "director_storyboard_table_style", subDir: "driector_skills" }, ]; // 读取 md 文件内容,文件不存在时返回空字符串 diff --git a/src/routes/setting/about/downloadApp.ts b/src/routes/setting/about/downloadApp.ts index 1a01072..267269d 100644 --- a/src/routes/setting/about/downloadApp.ts +++ b/src/routes/setting/about/downloadApp.ts @@ -51,11 +51,11 @@ export default router.post( } const tempSkillsPath = u.getPath(["temp", "skills"]); if (fs.existsSync(tempSkillsPath)) { - fs.cpSync(tempSkillsPath, u.getPath(["skills"]), { recursive: true, force: false }); + fs.cpSync(tempSkillsPath, u.getPath(["skills"]), { recursive: true }); } const tempModelsPath = u.getPath(["temp", "models"]); if (fs.existsSync(tempModelsPath)) { - fs.cpSync(tempModelsPath, u.getPath(["models"]), { recursive: true, force: false }); + fs.cpSync(tempModelsPath, u.getPath(["models"]), { recursive: true }); } fs.rmSync(rootDir, { recursive: true, force: true }); res.status(200).send(success("更新成功,5秒后重启")); diff --git a/src/routes/setting/agentDeploy/agentSetKey.ts b/src/routes/setting/agentDeploy/agentSetKey.ts index e12e657..f7c5e4f 100644 --- a/src/routes/setting/agentDeploy/agentSetKey.ts +++ b/src/routes/setting/agentDeploy/agentSetKey.ts @@ -11,65 +11,48 @@ export default router.post( key: z.string().optional(), }), async (req, res) => { - await u.db("o_agentDeploy").where("key", "scriptAgent").update({ - model: "claude-sonnet-4-6", - modelName: "toonflow:claude-sonnet-4-6", - vendorId: "toonflow", - }); - await u.db("o_agentDeploy").where("key", "productionAgent").update({ - model: "claude-sonnet-4-6", - modelName: "toonflow:claude-sonnet-4-6", - vendorId: "toonflow", - }); - await u.db("o_agentDeploy").where("key", "universalAi").update({ - model: "claude-haiku-4-5", - modelName: "toonflow:claude-haiku-4-5-20251001", - vendorId: "toonflow", - }); - res.status(200).send(success("一键填入成功")); - - // const { key } = req.body; - // const vendorConfigData = await u.db("o_vendorConfig").where("id", "toonflow").first(); - // if (!vendorConfigData) return res.status(500).send(error("未找到该供应商配置")); - // if (!vendorConfigData.inputValues) return res.status(500).send(error("未找到模型配置数据")); - // const inputValue = JSON.parse(vendorConfigData.inputValues!); - // inputValue.apiKey = key; - // await u - // .db("o_vendorConfig") - // .where("id", "toonflow") - // .update({ - // inputValues: JSON.stringify(inputValue), - // }); - // try { - // const resText = await u.Ai.Text(`toonflow:gpt-4.1`).invoke({ - // prompt: "1+1等于几?", - // }); - // if (resText.text) { - // await u.db("o_agentDeploy").where("key", "scriptAgent").update({ - // model: "claude-sonnet-4-6", - // modelName: "toonflow:claude-sonnet-4-6", - // vendorId: "toonflow", - // }); - // await u.db("o_agentDeploy").where("key", "productionAgent").update({ - // model: "claude-sonnet-4-6", - // modelName: "toonflow:claude-sonnet-4-6", - // vendorId: "toonflow", - // }); - // await u.db("o_agentDeploy").where("key", "universalAi").update({ - // model: "claude-haiku-4-5", - // modelName: "toonflow:claude-haiku-4-5-20251001", - // vendorId: "toonflow", - // }); - // res.status(200).send(success("一键填入成功")); - // } - // } catch (err) { - // console.error(err); - // inputValue.apiKey = ""; - // await u - // .db("o_vendorConfig") - // .where("id", "toonflow") - // .update({ inputValues: JSON.stringify(inputValue) }); - // res.status(400).send(error("KEY无效,请重新输入")); - // } + const { key } = req.body; + const vendorConfigData = await u.db("o_vendorConfig").where("id", "toonflow").first(); + if (!vendorConfigData) return res.status(500).send(error("未找到该供应商配置")); + if (!vendorConfigData.inputValues) return res.status(500).send(error("未找到模型配置数据")); + const inputValue = JSON.parse(vendorConfigData.inputValues!); + inputValue.apiKey = key; + await u + .db("o_vendorConfig") + .where("id", "toonflow") + .update({ + inputValues: JSON.stringify(inputValue), + }); + try { + const resText = await u.Ai.Text(`toonflow:claude-haiku-4-5-20251001`).invoke({ + prompt: "1+1等于几?,请直接回答2,不要解释", + }); + if (resText.text) { + await u.db("o_agentDeploy").where("key", "scriptAgent").update({ + model: "claude-sonnet-4-6", + modelName: "toonflow:claude-sonnet-4-6", + vendorId: "toonflow", + }); + await u.db("o_agentDeploy").where("key", "productionAgent").update({ + model: "claude-sonnet-4-6", + modelName: "toonflow:claude-sonnet-4-6", + vendorId: "toonflow", + }); + await u.db("o_agentDeploy").where("key", "universalAi").update({ + model: "claude-haiku-4-5", + modelName: "toonflow:claude-haiku-4-5-20251001", + vendorId: "toonflow", + }); + res.status(200).send(success("一键填入成功")); + } + } catch (err) { + console.error(err); + inputValue.apiKey = ""; + await u + .db("o_vendorConfig") + .where("id", "toonflow") + .update({ inputValues: JSON.stringify(inputValue) }); + res.status(400).send(error("KEY无效,请重新输入")); + } }, ); diff --git a/src/routes/setting/vendorConfig/enableVendor.ts b/src/routes/setting/vendorConfig/enableVendor.ts index fc8be90..8536504 100644 --- a/src/routes/setting/vendorConfig/enableVendor.ts +++ b/src/routes/setting/vendorConfig/enableVendor.ts @@ -8,6 +8,7 @@ export default router.post( "/", validateFields({ id: z.string(), + enable: z.number(), }), async (req, res) => { const { id, enable } = req.body; diff --git a/src/routes/setting/vendorConfig/updateCode.ts b/src/routes/setting/vendorConfig/updateCode.ts index 58b6ca7..d0ab2c1 100644 --- a/src/routes/setting/vendorConfig/updateCode.ts +++ b/src/routes/setting/vendorConfig/updateCode.ts @@ -95,7 +95,6 @@ export default router.post( inputValues: JSON.stringify(vendor.inputValues ?? {}), models: JSON.stringify(vendor.models ?? []), code: tsCode, - enable: 0, createTime: Date.now(), }); res.status(200).send(success(result.data)); diff --git a/src/routes/setting/vendorConfig/updateVendor.ts b/src/routes/setting/vendorConfig/updateVendor.ts index 6313450..0d066b8 100644 --- a/src/routes/setting/vendorConfig/updateVendor.ts +++ b/src/routes/setting/vendorConfig/updateVendor.ts @@ -67,7 +67,6 @@ export default router.post( inputs: JSON.stringify(inputs), inputValues: JSON.stringify(inputValues), models: JSON.stringify(models), - enable: id == "toonflow" ? 1 : 0, }); res.status(200).send(success("更新成功")); }, diff --git a/src/socket/routes/productionAgent.ts b/src/socket/routes/productionAgent.ts index c2b183d..bfd18d6 100644 --- a/src/socket/routes/productionAgent.ts +++ b/src/socket/routes/productionAgent.ts @@ -124,4 +124,7 @@ export default (nsp: Namespace) => { abortController = null; }); }); + nsp.on("disconnect", (socket: Socket) => { + console.log("[productionAgent] 已断开连接:", socket.id); + }); }; diff --git a/src/socket/routes/scriptAgent.ts b/src/socket/routes/scriptAgent.ts index 8450881..8a0bb72 100644 --- a/src/socket/routes/scriptAgent.ts +++ b/src/socket/routes/scriptAgent.ts @@ -112,4 +112,7 @@ export default (nsp: Namespace) => { abortController = null; }); }); + nsp.on("disconnect", (socket: Socket) => { + console.log("[scriptAgent] 已断开连接:", socket.id); + }); };