This commit is contained in:
2026-06-30 15:02:20 +08:00
commit 3948b5a48a
306 changed files with 77275 additions and 0 deletions
+300
View File
@@ -0,0 +1,300 @@
-- 最小初始表结构,与 backend-node 业务代码对齐(若无 backend-node/migrations 则使用本文件)
CREATE TABLE IF NOT EXISTS dramas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL DEFAULT '',
description TEXT,
genre TEXT,
style TEXT DEFAULT 'realistic',
tags TEXT,
thumbnail TEXT,
total_episodes INTEGER DEFAULT 1,
total_duration INTEGER DEFAULT 0,
status TEXT DEFAULT 'draft',
metadata TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS episodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
episode_number INTEGER DEFAULT 0,
title TEXT DEFAULT '',
script_content TEXT,
description TEXT,
duration INTEGER DEFAULT 0,
video_url TEXT,
thumbnail TEXT,
status TEXT DEFAULT 'draft',
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS storyboards (
id INTEGER PRIMARY KEY AUTOINCREMENT,
episode_id INTEGER NOT NULL,
scene_id INTEGER,
storyboard_number INTEGER DEFAULT 0,
title TEXT,
description TEXT,
location TEXT,
time TEXT,
duration REAL,
dialogue TEXT,
action TEXT,
atmosphere TEXT,
image_prompt TEXT,
video_prompt TEXT,
characters TEXT,
shot_type TEXT,
angle TEXT,
movement TEXT,
video_url TEXT,
status TEXT DEFAULT 'draft',
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS characters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
name TEXT NOT NULL DEFAULT '',
role TEXT,
description TEXT,
personality TEXT,
appearance TEXT,
image_url TEXT,
local_path TEXT,
voice_style TEXT,
sort_order INTEGER DEFAULT 0,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS episode_characters (
episode_id INTEGER NOT NULL,
character_id INTEGER NOT NULL,
PRIMARY KEY (episode_id, character_id)
);
CREATE TABLE IF NOT EXISTS scenes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
episode_id INTEGER,
location TEXT,
time TEXT,
prompt TEXT,
image_url TEXT,
local_path TEXT,
storyboard_count INTEGER DEFAULT 0,
status TEXT DEFAULT 'draft',
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS props (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
name TEXT NOT NULL DEFAULT '',
type TEXT,
description TEXT,
prompt TEXT,
image_url TEXT,
local_path TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS storyboard_props (
storyboard_id INTEGER NOT NULL,
prop_id INTEGER NOT NULL,
PRIMARY KEY (storyboard_id, prop_id)
);
CREATE TABLE IF NOT EXISTS frame_prompts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
storyboard_id INTEGER NOT NULL,
frame_type TEXT,
prompt TEXT,
description TEXT,
layout TEXT,
created_at TEXT,
updated_at TEXT
);
CREATE TABLE IF NOT EXISTS ai_service_configs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
service_type TEXT NOT NULL,
provider TEXT DEFAULT '',
name TEXT DEFAULT '',
base_url TEXT DEFAULT '',
api_key TEXT,
model TEXT,
default_model TEXT,
endpoint TEXT,
query_endpoint TEXT,
priority INTEGER DEFAULT 0,
is_default INTEGER DEFAULT 0,
is_active INTEGER DEFAULT 1,
settings TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS async_tasks (
id TEXT PRIMARY KEY,
type TEXT NOT NULL,
status TEXT NOT NULL,
progress INTEGER DEFAULT 0,
message TEXT,
resource_id TEXT,
created_at TEXT,
updated_at TEXT,
completed_at TEXT,
error TEXT,
result TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS image_generations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
storyboard_id INTEGER,
drama_id INTEGER,
scene_id INTEGER,
character_id INTEGER,
provider TEXT,
prompt TEXT,
negative_prompt TEXT,
model TEXT,
frame_type TEXT,
reference_images TEXT,
size TEXT,
quality TEXT,
image_url TEXT,
local_path TEXT,
status TEXT,
task_id TEXT,
completed_at TEXT,
error_msg TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS video_generations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
storyboard_id INTEGER,
provider TEXT,
prompt TEXT,
model TEXT,
duration REAL,
aspect_ratio TEXT,
image_url TEXT,
first_frame_url TEXT,
last_frame_url TEXT,
reference_image_urls TEXT,
video_url TEXT,
local_path TEXT,
status TEXT,
task_id TEXT,
scene_id INTEGER,
completed_at TEXT,
error_msg TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS video_merges (
id INTEGER PRIMARY KEY AUTOINCREMENT,
episode_id INTEGER,
drama_id INTEGER,
title TEXT,
provider TEXT,
model TEXT,
status TEXT,
scenes TEXT,
task_id TEXT,
created_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS character_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
name TEXT NOT NULL DEFAULT '',
category TEXT,
image_url TEXT,
local_path TEXT,
description TEXT,
tags TEXT,
source_type TEXT,
source_id TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS scene_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
location TEXT NOT NULL DEFAULT '',
time TEXT,
prompt TEXT,
description TEXT,
image_url TEXT,
local_path TEXT,
category TEXT,
tags TEXT,
source_type TEXT,
source_id TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS prop_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
name TEXT NOT NULL DEFAULT '',
description TEXT,
prompt TEXT,
image_url TEXT,
local_path TEXT,
category TEXT,
tags TEXT,
source_type TEXT,
source_id TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS assets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
name TEXT,
type TEXT,
category TEXT,
url TEXT,
local_path TEXT,
file_size INTEGER,
mime_type TEXT,
width INTEGER,
height INTEGER,
duration REAL,
image_gen_id INTEGER,
video_gen_id INTEGER,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
@@ -0,0 +1,2 @@
-- 生成时使用的默认模型(在该配置的 model 列表中选一个)
ALTER TABLE ai_service_configs ADD COLUMN default_model TEXT;
@@ -0,0 +1,2 @@
-- 道具归属集:从某集剧本提取的道具记入该集,本集资源列表会展示
ALTER TABLE props ADD COLUMN episode_id INTEGER;
@@ -0,0 +1,4 @@
-- async_tasks 缺少 completed_at、error、result 时补上(与 taskService 一致)
ALTER TABLE async_tasks ADD COLUMN completed_at TEXT;
ALTER TABLE async_tasks ADD COLUMN error TEXT;
ALTER TABLE async_tasks ADD COLUMN result TEXT;
@@ -0,0 +1,3 @@
-- image_generations 缺少 completed_at / error_msg 时补上(imageClient 更新完成状态与错误信息用)
ALTER TABLE image_generations ADD COLUMN completed_at TEXT;
ALTER TABLE image_generations ADD COLUMN error_msg TEXT;
@@ -0,0 +1,2 @@
-- characters 表缺少 local_path 时补上(角色本地图片路径)
ALTER TABLE characters ADD COLUMN local_path TEXT;
@@ -0,0 +1,3 @@
-- scenes 表缺少 image_url / local_path 时补上(场景上传/生成图用)
ALTER TABLE scenes ADD COLUMN image_url TEXT;
ALTER TABLE scenes ADD COLUMN local_path TEXT;
@@ -0,0 +1,3 @@
-- video_generations 缺少 completed_at / error_msg 时补上(videoService 更新完成状态用)
ALTER TABLE video_generations ADD COLUMN completed_at TEXT;
ALTER TABLE video_generations ADD COLUMN error_msg TEXT;
@@ -0,0 +1,35 @@
-- 公共场景库、公共道具库(仿 character_libraries
CREATE TABLE IF NOT EXISTS scene_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
location TEXT NOT NULL DEFAULT '',
time TEXT,
prompt TEXT,
description TEXT,
image_url TEXT,
local_path TEXT,
category TEXT,
tags TEXT,
source_type TEXT,
source_id TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
CREATE TABLE IF NOT EXISTS prop_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
name TEXT NOT NULL DEFAULT '',
description TEXT,
prompt TEXT,
image_url TEXT,
local_path TEXT,
category TEXT,
tags TEXT,
source_type TEXT,
source_id TEXT,
created_at TEXT,
updated_at TEXT,
deleted_at TEXT
);
@@ -0,0 +1,6 @@
CREATE TABLE IF NOT EXISTS prompt_overrides (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT UNIQUE NOT NULL,
content TEXT NOT NULL,
updated_at TEXT NOT NULL
);
@@ -0,0 +1,4 @@
-- 新增 api_protocol 字段:显式指定接口规范,独立于 provider(厂商名)。
-- 优先级高于 provider 推断,便于中转站/自定义厂商明确接口格式。
-- 可选值:openai / volcengine / dashscope / gemini / nano_banana
ALTER TABLE ai_service_configs ADD COLUMN api_protocol TEXT DEFAULT '' NOT NULL;
@@ -0,0 +1,8 @@
-- 图床上传缓存表:记录本地文件与中转图床 URL 的对应关系,避免重复上传。
-- cache_key: 本地相对路径(如 scenes/ig_xxx.png)或 data URL 内容的 sha256 hash 前缀
CREATE TABLE IF NOT EXISTS image_proxy_cache (
id INTEGER PRIMARY KEY AUTOINCREMENT,
cache_key TEXT NOT NULL UNIQUE,
proxy_url TEXT NOT NULL,
created_at TEXT NOT NULL
);
@@ -0,0 +1,12 @@
-- character_libraries 补充外貌字段(分镜生成时引用)
ALTER TABLE character_libraries ADD COLUMN appearance TEXT;
ALTER TABLE character_libraries ADD COLUMN identity_anchors TEXT;
ALTER TABLE character_libraries ADD COLUMN style_tokens TEXT;
ALTER TABLE character_libraries ADD COLUMN color_palette TEXT;
ALTER TABLE character_libraries ADD COLUMN four_view_image_url TEXT;
-- characters 补充锚点字段(AI 角色生成时提炼)
ALTER TABLE characters ADD COLUMN identity_anchors TEXT;
ALTER TABLE characters ADD COLUMN style_tokens TEXT;
ALTER TABLE characters ADD COLUMN color_palette TEXT;
ALTER TABLE characters ADD COLUMN four_view_image_url TEXT;
@@ -0,0 +1,19 @@
-- storyboards 表新增段落分组字段
ALTER TABLE storyboards ADD COLUMN segment_index INTEGER DEFAULT 0;
ALTER TABLE storyboards ADD COLUMN segment_title TEXT;
-- 模型路由表:按业务场景配置不同 AI 模型
-- key: 业务键(storyboard_gen / character_gen / frame_prompt / image_polish 等)
-- service_type: text / image
-- config_id: 对应 ai_service_configs.idNULL = 使用默认配置)
-- model_override: 可选,在该配置下使用指定模型名(NULL = 用配置默认模型)
CREATE TABLE IF NOT EXISTS ai_model_map (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT NOT NULL UNIQUE,
service_type TEXT NOT NULL DEFAULT 'text',
config_id INTEGER,
model_override TEXT,
description TEXT,
created_at TEXT NOT NULL DEFAULT '',
updated_at TEXT NOT NULL DEFAULT ''
);
@@ -0,0 +1,8 @@
-- storyboards 表新增结构化视角字段(三元组)
-- angle_h: 水平方向(front / front_left / left / back_left / back / back_right / right / front_right
-- angle_v: 俯仰角度(worm / low / eye_level / high
-- angle_s: 景别 close_up / medium / wide
-- 保留原 angle 字段(旧文本)以兼容存量数据,新数据优先使用三元组字段
ALTER TABLE storyboards ADD COLUMN angle_h TEXT;
ALTER TABLE storyboards ADD COLUMN angle_v TEXT;
ALTER TABLE storyboards ADD COLUMN angle_s TEXT;
@@ -0,0 +1,3 @@
-- characters 表新增预生成的四视图图片提示词字段
-- polished_prompt: 经文字AI润色后的完整图片生成提示词,可由用户编辑,生成图片时直接使用
ALTER TABLE characters ADD COLUMN polished_prompt TEXT;
@@ -0,0 +1,2 @@
-- 角色多阶段造型支持(不同集不同外貌)
ALTER TABLE characters ADD COLUMN stages TEXT;
@@ -0,0 +1,2 @@
-- 分镜解说/旁白文案(TTS、成片旁轨),与角色对白 dialogue 分离
ALTER TABLE storyboards ADD COLUMN narration TEXT;
@@ -0,0 +1,3 @@
-- 分镜:经典参考图模式 / 全能创建模式(片段描述,独立字段)
ALTER TABLE storyboards ADD COLUMN creation_mode TEXT DEFAULT 'classic';
ALTER TABLE storyboards ADD COLUMN universal_segment_text TEXT;
@@ -0,0 +1,2 @@
-- Seedance 2.0 / 即梦素材库认证信息(JSON),与官方业务素材 API 字段一致
ALTER TABLE characters ADD COLUMN seedance2_asset TEXT;
@@ -0,0 +1,4 @@
-- 角色 / 场景 / 道具:可选负面提示词(显式指定生图 model 时与图生 API 合并传入)
ALTER TABLE characters ADD COLUMN negative_prompt TEXT;
ALTER TABLE scenes ADD COLUMN negative_prompt TEXT;
ALTER TABLE props ADD COLUMN negative_prompt TEXT;
@@ -0,0 +1,70 @@
ALTER TABLE character_libraries ADD COLUMN drama_id INTEGER;
ALTER TABLE scene_libraries ADD COLUMN drama_id INTEGER;
ALTER TABLE prop_libraries ADD COLUMN drama_id INTEGER;
ALTER TABLE character_libraries ADD COLUMN source_id TEXT;
ALTER TABLE scene_libraries ADD COLUMN source_id TEXT;
ALTER TABLE prop_libraries ADD COLUMN source_id TEXT;
UPDATE character_libraries
SET source_id = (
SELECT CAST(c.id AS TEXT)
FROM characters c
WHERE c.deleted_at IS NULL
AND character_libraries.source_type = 'character'
AND (character_libraries.drama_id IS NULL OR c.drama_id = character_libraries.drama_id)
AND (
(c.local_path IS NOT NULL AND c.local_path <> '' AND (
c.local_path = character_libraries.local_path
OR '/static/' || c.local_path = character_libraries.image_url
))
OR (c.image_url IS NOT NULL AND c.image_url <> '' AND c.image_url = character_libraries.image_url)
)
ORDER BY c.id ASC
LIMIT 1
)
WHERE source_id IS NULL
AND deleted_at IS NULL
AND source_type = 'character';
UPDATE scene_libraries
SET source_id = (
SELECT CAST(s.id AS TEXT)
FROM scenes s
WHERE s.deleted_at IS NULL
AND scene_libraries.source_type = 'scene'
AND (scene_libraries.drama_id IS NULL OR s.drama_id = scene_libraries.drama_id)
AND (
(s.local_path IS NOT NULL AND s.local_path <> '' AND (
s.local_path = scene_libraries.local_path
OR '/static/' || s.local_path = scene_libraries.image_url
))
OR (s.image_url IS NOT NULL AND s.image_url <> '' AND s.image_url = scene_libraries.image_url)
)
ORDER BY s.id ASC
LIMIT 1
)
WHERE source_id IS NULL
AND deleted_at IS NULL
AND source_type = 'scene';
UPDATE prop_libraries
SET source_id = (
SELECT CAST(p.id AS TEXT)
FROM props p
WHERE p.deleted_at IS NULL
AND prop_libraries.source_type = 'prop'
AND (prop_libraries.drama_id IS NULL OR p.drama_id = prop_libraries.drama_id)
AND (
(p.local_path IS NOT NULL AND p.local_path <> '' AND (
p.local_path = prop_libraries.local_path
OR '/static/' || p.local_path = prop_libraries.image_url
))
OR (p.image_url IS NOT NULL AND p.image_url <> '' AND p.image_url = prop_libraries.image_url)
)
ORDER BY p.id ASC
LIMIT 1
)
WHERE source_id IS NULL
AND deleted_at IS NULL
AND source_type = 'prop';