新增分镜工作流接口

This commit is contained in:
zhishi 2026-03-21 10:01:21 +08:00
parent b989085ef5
commit e44974964c
9 changed files with 297 additions and 66 deletions

View File

@ -55,6 +55,7 @@
"express-ws": "^5.0.2",
"fast-glob": "^3.3.3",
"form-data": "^4.0.5",
"graphlib": "^2.1.8",
"is-path-inside": "^4.0.0",
"js-md5": "^0.8.3",
"jsonwebtoken": "^9.0.3",

View File

@ -276,7 +276,7 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
table.text("remark");
table.text("type");
table.text("describe");
table.integer("scriptId");//剧本id
table.integer("scriptId"); //剧本id
table.integer("imageId").unsigned().references("id").inTable("o_image");
table.integer("sonId");
table.integer("projectId");
@ -307,7 +307,11 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
name: "o_storyboard",
builder: (table) => {
table.integer("id").notNullable();
table.string("name");
table.text("name");
table.text("detail");
table.text("prompt");
table.text("seconds");
table.integer("imageId");
table.integer("createTime");
table.primary(["id"]);
table.unique(["id"]);
@ -420,6 +424,17 @@ export default async (knex: Knex, forceInit: boolean = false): Promise<void> =>
table.index(["isolationKey", "summarized"]);
},
},
//分镜工作流表
{
name: "o_storyboardFlow",
builder: (table) => {
table.integer("id").notNullable();
table.text("flowData").notNullable();
table.integer("stroryboardId").notNullable();
table.primary(["id"]);
table.unique(["id"]);
},
},
];
for (const t of tables) {

View File

@ -1,4 +1,4 @@
// @routes-hash 45e23a536a13265ff62fe92b1cb71fe3
// @routes-hash 84d4d9cf99aad5cde060895dad6ed2b1
import { Express } from "express";
import route1 from "./routes/agents/clearMemory";
@ -35,34 +35,38 @@ import route31 from "./routes/novel/getNovel";
import route32 from "./routes/novel/updateNovel";
import route33 from "./routes/other/deleteAllData";
import route34 from "./routes/other/getCaptcha";
import route35 from "./routes/production/getProductionData";
import route36 from "./routes/production/workbench/getVideoModelDetail";
import route37 from "./routes/project/addProject";
import route38 from "./routes/project/delProject";
import route39 from "./routes/project/editProject";
import route40 from "./routes/project/getProject";
import route41 from "./routes/script/addScript";
import route42 from "./routes/script/delScript";
import route43 from "./routes/script/getScrptApi";
import route44 from "./routes/script/updateScript";
import route45 from "./routes/setting/agentDeploy/deployAgentModel";
import route46 from "./routes/setting/agentDeploy/getAgentDeploy";
import route47 from "./routes/setting/agentDeploy/updateKey";
import route48 from "./routes/setting/dbConfig/clearData";
import route49 from "./routes/setting/getTextModel";
import route50 from "./routes/setting/loginConfig/getUser";
import route51 from "./routes/setting/loginConfig/updateUserPwd";
import route52 from "./routes/setting/memoryConfig/getMemory";
import route53 from "./routes/setting/memoryConfig/sureMemory";
import route54 from "./routes/setting/vendorConfig/addVendor";
import route55 from "./routes/setting/vendorConfig/deleteVendor";
import route56 from "./routes/setting/vendorConfig/getVendorList";
import route57 from "./routes/setting/vendorConfig/modelTest";
import route58 from "./routes/setting/vendorConfig/updateVendor";
import route59 from "./routes/task/getMyTaskApi";
import route60 from "./routes/task/getTaskCategories";
import route61 from "./routes/task/taskDetails";
import route62 from "./routes/test/test";
import route35 from "./routes/production/editStoryboard/generateStoryboardImage";
import route36 from "./routes/production/editStoryboard/getStoryboardFlow";
import route37 from "./routes/production/editStoryboard/saveStoryboardFlow";
import route38 from "./routes/production/editStoryboard/updateStoryboardFlow";
import route39 from "./routes/production/getProductionData";
import route40 from "./routes/production/workbench/getVideoModelDetail";
import route41 from "./routes/project/addProject";
import route42 from "./routes/project/delProject";
import route43 from "./routes/project/editProject";
import route44 from "./routes/project/getProject";
import route45 from "./routes/script/addScript";
import route46 from "./routes/script/delScript";
import route47 from "./routes/script/getScrptApi";
import route48 from "./routes/script/updateScript";
import route49 from "./routes/setting/agentDeploy/deployAgentModel";
import route50 from "./routes/setting/agentDeploy/getAgentDeploy";
import route51 from "./routes/setting/agentDeploy/updateKey";
import route52 from "./routes/setting/dbConfig/clearData";
import route53 from "./routes/setting/getTextModel";
import route54 from "./routes/setting/loginConfig/getUser";
import route55 from "./routes/setting/loginConfig/updateUserPwd";
import route56 from "./routes/setting/memoryConfig/getMemory";
import route57 from "./routes/setting/memoryConfig/sureMemory";
import route58 from "./routes/setting/vendorConfig/addVendor";
import route59 from "./routes/setting/vendorConfig/deleteVendor";
import route60 from "./routes/setting/vendorConfig/getVendorList";
import route61 from "./routes/setting/vendorConfig/modelTest";
import route62 from "./routes/setting/vendorConfig/updateVendor";
import route63 from "./routes/task/getMyTaskApi";
import route64 from "./routes/task/getTaskCategories";
import route65 from "./routes/task/taskDetails";
import route66 from "./routes/test/test";
export default async (app: Express) => {
app.use("/api/agents/clearMemory", route1);
@ -99,32 +103,36 @@ export default async (app: Express) => {
app.use("/api/novel/updateNovel", route32);
app.use("/api/other/deleteAllData", route33);
app.use("/api/other/getCaptcha", route34);
app.use("/api/production/getProductionData", route35);
app.use("/api/production/workbench/getVideoModelDetail", route36);
app.use("/api/project/addProject", route37);
app.use("/api/project/delProject", route38);
app.use("/api/project/editProject", route39);
app.use("/api/project/getProject", route40);
app.use("/api/script/addScript", route41);
app.use("/api/script/delScript", route42);
app.use("/api/script/getScrptApi", route43);
app.use("/api/script/updateScript", route44);
app.use("/api/setting/agentDeploy/deployAgentModel", route45);
app.use("/api/setting/agentDeploy/getAgentDeploy", route46);
app.use("/api/setting/agentDeploy/updateKey", route47);
app.use("/api/setting/dbConfig/clearData", route48);
app.use("/api/setting/getTextModel", route49);
app.use("/api/setting/loginConfig/getUser", route50);
app.use("/api/setting/loginConfig/updateUserPwd", route51);
app.use("/api/setting/memoryConfig/getMemory", route52);
app.use("/api/setting/memoryConfig/sureMemory", route53);
app.use("/api/setting/vendorConfig/addVendor", route54);
app.use("/api/setting/vendorConfig/deleteVendor", route55);
app.use("/api/setting/vendorConfig/getVendorList", route56);
app.use("/api/setting/vendorConfig/modelTest", route57);
app.use("/api/setting/vendorConfig/updateVendor", route58);
app.use("/api/task/getMyTaskApi", route59);
app.use("/api/task/getTaskCategories", route60);
app.use("/api/task/taskDetails", route61);
app.use("/api/test/test", route62);
app.use("/api/production/editStoryboard/generateStoryboardImage", route35);
app.use("/api/production/editStoryboard/getStoryboardFlow", route36);
app.use("/api/production/editStoryboard/saveStoryboardFlow", route37);
app.use("/api/production/editStoryboard/updateStoryboardFlow", route38);
app.use("/api/production/getProductionData", route39);
app.use("/api/production/workbench/getVideoModelDetail", route40);
app.use("/api/project/addProject", route41);
app.use("/api/project/delProject", route42);
app.use("/api/project/editProject", route43);
app.use("/api/project/getProject", route44);
app.use("/api/script/addScript", route45);
app.use("/api/script/delScript", route46);
app.use("/api/script/getScrptApi", route47);
app.use("/api/script/updateScript", route48);
app.use("/api/setting/agentDeploy/deployAgentModel", route49);
app.use("/api/setting/agentDeploy/getAgentDeploy", route50);
app.use("/api/setting/agentDeploy/updateKey", route51);
app.use("/api/setting/dbConfig/clearData", route52);
app.use("/api/setting/getTextModel", route53);
app.use("/api/setting/loginConfig/getUser", route54);
app.use("/api/setting/loginConfig/updateUserPwd", route55);
app.use("/api/setting/memoryConfig/getMemory", route56);
app.use("/api/setting/memoryConfig/sureMemory", route57);
app.use("/api/setting/vendorConfig/addVendor", route58);
app.use("/api/setting/vendorConfig/deleteVendor", route59);
app.use("/api/setting/vendorConfig/getVendorList", route60);
app.use("/api/setting/vendorConfig/modelTest", route61);
app.use("/api/setting/vendorConfig/updateVendor", route62);
app.use("/api/task/getMyTaskApi", route63);
app.use("/api/task/getTaskCategories", route64);
app.use("/api/task/taskDetails", route65);
app.use("/api/test/test", route66);
}

View File

@ -0,0 +1,41 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
model: z.string(),
references: z.array(z.string()).optional(),
quality: z.string(),
ratio: z.string(),
prompt: z.string(),
projectId: z.number(),
}),
async (req, res) => {
const { model, references = [], quality, ratio, prompt, projectId } = req.body;
const imageClass = await u.Ai.Image(model).run({
prompt: prompt,
imageBase64: references,
size: quality,
aspectRatio: ratio,
taskClass: "分镜生成",
describe: "生成分镜图片",
relatedObjects: JSON.stringify(req.body),
projectId: projectId,
});
const savePath = `${projectId}/storyboard/${u.uuid()}.jpg`;
await imageClass.save(savePath);
const url = await u.oss.getFileUrl(savePath);
const [imageId] = await u.db("o_image").insert({
filePath: savePath,
state: "1",
type: "storyFlow",
});
return res.status(200).send(success({ imageId, url }));
},
);

View File

@ -0,0 +1,27 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
id: z.number(),
}),
async (req, res) => {
const { id } = req.body;
console.log("%c Line:15 🥤 id", "background:#e41a6a", id);
const storyboardFlowData = await u.db("o_storyboardFlow").where("stroryboardId", id).first();
if (storyboardFlowData?.flowData) {
return res.status(200).send(success(JSON.parse(storyboardFlowData?.flowData)));
}
return res.status(200).send(
success({
nodes: [],
edges: [],
}),
);
},
);

View File

@ -0,0 +1,28 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
edges: z.any(),
nodes: z.any(),
imageId: z.number(),
}),
async (req, res) => {
const { edges, nodes, imageId } = req.body;
// if
const [id] = await u.db("o_storyboad").insert({
imageId,
});
await u.db("o_storyboardFlow").insert({
id: 1,
stroryboardId: id,
flowData: JSON.stringify({ edges, nodes }),
});
return res.status(200).send(success());
},
);

View File

@ -0,0 +1,28 @@
import express from "express";
import u from "@/utils";
import { z } from "zod";
import { success } from "@/lib/responseFormat";
import { validateFields } from "@/middleware/middleware";
const router = express.Router();
export default router.post(
"/",
validateFields({
edges: z.any(),
nodes: z.any(),
id: z.number(),
imageId: z.number(),
}),
async (req, res) => {
const { edges, nodes, id, imageId } = req.body;
// if
await u.db("o_storyboard").where("id", id).update({ imageId });
await u
.db("o_storyboardFlow")
.where("stroryboardId", id)
.update({
flowData: JSON.stringify({ edges, nodes }),
});
return res.status(200).send(success());
},
);

View File

@ -1,9 +1,9 @@
// @db-hash 04e1150a9773602183de5f660a52b092
// @db-hash 85366ab7662bd484810dcec778054957
//该文件由脚本自动生成,请勿手动修改
export interface memories {
'content': string;
'createTime': number;
'createdAt': number;
'embedding'?: string | null;
'id'?: string;
'isolationKey': string;
@ -35,12 +35,18 @@ export interface o_assets {
'projectId'?: number | null;
'prompt'?: string | null;
'remark'?: string | null;
'scriptId'?: number | null;
'sonId'?: number | null;
'startTime'?: number | null;
'state'?: string | null;
'type'?: string | null;
}
export interface o_chatHistory {
'data'?: string | null;
'id'?: number;
'novel'?: string | null;
'projectId'?: number | null;
'type'?: string | null;
}
export interface o_event {
'createTime'?: number | null;
'detail'?: string | null;
@ -61,10 +67,33 @@ export interface o_image {
'assetsId'?: number | null;
'filePath'?: string | null;
'id'?: number;
'model'?: string | null;
'resolution'?: string | null;
'projectId'?: number | null;
'scriptId'?: number | null;
'state'?: string | null;
'type'?: string | null;
'videoId'?: number | null;
}
export interface o_model {
'apiKey'?: string | null;
'baseUrl'?: string | null;
'createTime'?: number | null;
'id'?: number;
'index'?: number | null;
'manufacturer'?: string | null;
'model'?: string | null;
'modelType'?: string | null;
'type'?: string | null;
}
export interface o_myTasks {
'describe'?: string | null;
'id'?: number;
'model'?: string | null;
'projectId'?: number | null;
'reason'?: string | null;
'relatedObjects'?: string | null;
'startTime'?: number | null;
'state'?: string | null;
'taskClass'?: string | null;
}
export interface o_novel {
'chapter'?: string | null;
@ -97,6 +126,15 @@ export interface o_project {
'userId'?: number | null;
'videoRatio'?: string | null;
}
export interface o_prompts {
'code'?: string | null;
'customValue'?: string | null;
'defaultValue'?: string | null;
'id'?: number;
'name'?: string | null;
'parentCode'?: string | null;
'type'?: string | null;
}
export interface o_script {
'content'?: string | null;
'createTime'?: number | null;
@ -104,14 +142,43 @@ export interface o_script {
'name'?: string | null;
'projectId'?: number | null;
}
export interface o_scriptAssets {
'assetsId'?: number | null;
'id'?: number;
'scriptId'?: number | null;
}
export interface o_scriptOutline {
'id'?: number;
'outlineId'?: number | null;
'scriptId'?: number | null;
}
export interface o_setting {
'key'?: string | null;
'value'?: string | null;
}
export interface o_storyboard {
'createTime'?: number | null;
export interface o_skills {
'id'?: number;
'name'?: string | null;
'startTime'?: number | null;
}
export interface o_storyboard {
'createTime'?: number | null;
'detail'?: string | null;
'id'?: number;
'imageId'?: number | null;
'name'?: string | null;
'prompt'?: string | null;
'seconds'?: string | null;
}
export interface o_storyboardFlow {
'flowData': string;
'id'?: string;
'stroryboardId': string;
}
export interface o_storyboardScript {
'id'?: number;
'scriptId'?: number | null;
'storyboardId'?: number | null;
}
export interface o_tasks {
'describe'?: string | null;
@ -178,17 +245,26 @@ export interface DB {
"o_agentDeploy": o_agentDeploy;
"o_artStyle": o_artStyle;
"o_assets": o_assets;
"o_chatHistory": o_chatHistory;
"o_event": o_event;
"o_eventChapter": o_eventChapter;
"o_flowData": o_flowData;
"o_image": o_image;
"o_model": o_model;
"o_myTasks": o_myTasks;
"o_novel": o_novel;
"o_outline": o_outline;
"o_outlineNovel": o_outlineNovel;
"o_project": o_project;
"o_prompts": o_prompts;
"o_script": o_script;
"o_scriptAssets": o_scriptAssets;
"o_scriptOutline": o_scriptOutline;
"o_setting": o_setting;
"o_skills": o_skills;
"o_storyboard": o_storyboard;
"o_storyboardFlow": o_storyboardFlow;
"o_storyboardScript": o_storyboardScript;
"o_tasks": o_tasks;
"o_user": o_user;
"o_vendorConfig": o_vendorConfig;

View File

@ -2481,6 +2481,13 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11,
resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
graphlib@^2.1.8:
version "2.1.8"
resolved "https://registry.npmmirror.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da"
integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==
dependencies:
lodash "^4.17.15"
guid-typescript@^1.0.9:
version "1.0.9"
resolved "https://registry.npmmirror.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc"