This commit is contained in:
Connor
2026-01-12 13:17:11 +08:00
parent 95851f8e69
commit 9600fc542c
132 changed files with 35734 additions and 5 deletions

496
migrations/init.sql Normal file
View File

@@ -0,0 +1,496 @@
-- AI短剧生成平台 - SQLite数据库初始化脚本 (开源版本 - 无用户认证)
-- 创建时间: 2026-01-07
-- 说明: 此版本适配SQLite移除外键约束适合单机部署
-- ======================================
-- 1. 剧本相关表
-- ======================================
-- 剧本表
CREATE TABLE IF NOT EXISTS dramas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
description TEXT,
genre TEXT,
style TEXT NOT NULL DEFAULT 'realistic',
total_episodes INTEGER NOT NULL DEFAULT 1,
total_duration INTEGER NOT NULL DEFAULT 0, -- 总时长(秒)
status TEXT NOT NULL DEFAULT 'draft', -- draft, in_progress, completed
thumbnail TEXT,
tags TEXT, -- JSON存储
metadata TEXT, -- JSON存储
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_dramas_status ON dramas(status);
CREATE INDEX IF NOT EXISTS idx_dramas_deleted_at ON dramas(deleted_at);
-- 章节表
CREATE TABLE IF NOT EXISTS episodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
episode_number INTEGER NOT NULL,
title TEXT NOT NULL,
script_content TEXT,
description TEXT,
duration INTEGER NOT NULL DEFAULT 0, -- 时长(秒)
status TEXT NOT NULL DEFAULT 'draft',
video_url TEXT,
thumbnail TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_episodes_drama_id ON episodes(drama_id);
CREATE INDEX IF NOT EXISTS idx_episodes_status ON episodes(status);
CREATE INDEX IF NOT EXISTS idx_episodes_deleted_at ON episodes(deleted_at);
-- 角色表
CREATE TABLE IF NOT EXISTS characters (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
name TEXT NOT NULL,
role TEXT,
description TEXT,
appearance TEXT,
personality TEXT,
voice_style TEXT,
image_url TEXT,
reference_images TEXT, -- JSON存储
seed_value TEXT,
sort_order INTEGER NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_characters_drama_id ON characters(drama_id);
CREATE INDEX IF NOT EXISTS idx_characters_deleted_at ON characters(deleted_at);
-- 场景表
CREATE TABLE IF NOT EXISTS scenes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
location TEXT NOT NULL,
time TEXT NOT NULL,
prompt TEXT NOT NULL,
storyboard_count INTEGER NOT NULL DEFAULT 1,
image_url TEXT,
status TEXT NOT NULL DEFAULT 'pending', -- pending, generated, failed
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_scenes_drama_id ON scenes(drama_id);
CREATE INDEX IF NOT EXISTS idx_scenes_status ON scenes(status);
CREATE INDEX IF NOT EXISTS idx_scenes_deleted_at ON scenes(deleted_at);
-- 分镜表
CREATE TABLE IF NOT EXISTS storyboards (
id INTEGER PRIMARY KEY AUTOINCREMENT,
episode_id INTEGER NOT NULL,
scene_id INTEGER,
storyboard_number INTEGER NOT NULL,
title TEXT,
description TEXT,
location TEXT,
time TEXT,
duration INTEGER NOT NULL DEFAULT 0, -- 时长(秒)
dialogue TEXT,
action TEXT,
atmosphere TEXT,
image_prompt TEXT,
video_prompt TEXT,
characters TEXT, -- JSON存储
composed_image TEXT,
video_url TEXT,
status TEXT NOT NULL DEFAULT 'pending', -- pending, processing, completed, failed
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_storyboards_episode_id ON storyboards(episode_id);
CREATE INDEX IF NOT EXISTS idx_storyboards_scene_id ON storyboards(scene_id);
CREATE INDEX IF NOT EXISTS idx_storyboards_storyboard_number ON storyboards(storyboard_number);
CREATE INDEX IF NOT EXISTS idx_storyboards_status ON storyboards(status);
CREATE INDEX IF NOT EXISTS idx_storyboards_deleted_at ON storyboards(deleted_at);
-- ======================================
-- 2. AI生成相关表
-- ======================================
-- 图片生成记录表
CREATE TABLE IF NOT EXISTS image_generations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
storyboard_id INTEGER, -- 修正引用storyboards表
drama_id INTEGER NOT NULL,
provider TEXT NOT NULL, -- openai, midjourney, stable_diffusion
prompt TEXT NOT NULL,
negative_prompt TEXT,
model TEXT,
size TEXT,
quality TEXT,
style TEXT,
steps INTEGER,
cfg_scale REAL,
seed INTEGER,
image_url TEXT,
minio_url TEXT,
local_path TEXT,
status TEXT NOT NULL DEFAULT 'pending', -- pending, processing, completed, failed
task_id TEXT,
error_msg TEXT,
width INTEGER,
height INTEGER,
reference_images TEXT, -- JSON存储
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
completed_at DATETIME,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_image_generations_storyboard_id ON image_generations(storyboard_id);
CREATE INDEX IF NOT EXISTS idx_image_generations_drama_id ON image_generations(drama_id);
CREATE INDEX IF NOT EXISTS idx_image_generations_status ON image_generations(status);
CREATE INDEX IF NOT EXISTS idx_image_generations_task_id ON image_generations(task_id);
CREATE INDEX IF NOT EXISTS idx_image_generations_deleted_at ON image_generations(deleted_at);
-- 视频生成记录表
CREATE TABLE IF NOT EXISTS video_generations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
storyboard_id INTEGER, -- 修正引用storyboards表
drama_id INTEGER NOT NULL,
provider TEXT NOT NULL, -- runway, pika, doubao, openai
prompt TEXT NOT NULL,
model TEXT,
image_gen_id INTEGER,
image_url TEXT,
first_frame_url TEXT,
duration INTEGER, -- 时长(秒)
fps INTEGER,
resolution TEXT,
aspect_ratio TEXT,
style TEXT,
motion_level INTEGER,
camera_motion TEXT,
seed INTEGER,
video_url TEXT,
minio_url TEXT,
local_path TEXT,
status TEXT NOT NULL DEFAULT 'pending', -- pending, processing, completed, failed
task_id TEXT,
error_msg TEXT,
completed_at DATETIME,
width INTEGER,
height INTEGER,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_video_generations_storyboard_id ON video_generations(storyboard_id);
CREATE INDEX IF NOT EXISTS idx_video_generations_drama_id ON video_generations(drama_id);
CREATE INDEX IF NOT EXISTS idx_video_generations_provider ON video_generations(provider);
CREATE INDEX IF NOT EXISTS idx_video_generations_status ON video_generations(status);
CREATE INDEX IF NOT EXISTS idx_video_generations_task_id ON video_generations(task_id);
CREATE INDEX IF NOT EXISTS idx_video_generations_image_gen_id ON video_generations(image_gen_id);
CREATE INDEX IF NOT EXISTS idx_video_generations_deleted_at ON video_generations(deleted_at);
-- 视频合成记录表
CREATE TABLE IF NOT EXISTS video_merges (
id INTEGER PRIMARY KEY AUTOINCREMENT,
episode_id INTEGER NOT NULL,
drama_id INTEGER NOT NULL,
title TEXT,
provider TEXT NOT NULL,
model TEXT,
status TEXT NOT NULL DEFAULT 'pending', -- pending, processing, completed, failed
scenes TEXT NOT NULL, -- JSON存储场景片段列表
merged_url TEXT,
duration INTEGER, -- 总时长(秒)
task_id TEXT,
error_msg TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
completed_at DATETIME,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_video_merges_episode_id ON video_merges(episode_id);
CREATE INDEX IF NOT EXISTS idx_video_merges_drama_id ON video_merges(drama_id);
CREATE INDEX IF NOT EXISTS idx_video_merges_status ON video_merges(status);
CREATE INDEX IF NOT EXISTS idx_video_merges_deleted_at ON video_merges(deleted_at);
-- ======================================
-- 3. 角色库表
-- ======================================
-- 角色库表 (开源版本 - 全局共享)
CREATE TABLE IF NOT EXISTS character_libraries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
category TEXT,
image_url TEXT NOT NULL,
description TEXT,
tags TEXT,
source_type TEXT NOT NULL DEFAULT 'generated', -- generated, uploaded
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_character_libraries_category ON character_libraries(category);
CREATE INDEX IF NOT EXISTS idx_character_libraries_deleted_at ON character_libraries(deleted_at);
-- ======================================
-- 4. 时间线相关表
-- ======================================
-- 时间线表
CREATE TABLE IF NOT EXISTS timelines (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER NOT NULL,
episode_id INTEGER,
name TEXT NOT NULL,
description TEXT,
duration INTEGER NOT NULL DEFAULT 0, -- 总时长(秒)
fps INTEGER NOT NULL DEFAULT 30,
resolution TEXT,
status TEXT NOT NULL DEFAULT 'draft', -- draft, editing, completed, exporting
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_timelines_drama_id ON timelines(drama_id);
CREATE INDEX IF NOT EXISTS idx_timelines_episode_id ON timelines(episode_id);
CREATE INDEX IF NOT EXISTS idx_timelines_status ON timelines(status);
CREATE INDEX IF NOT EXISTS idx_timelines_deleted_at ON timelines(deleted_at);
-- 时间线轨道表
CREATE TABLE IF NOT EXISTS timeline_tracks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timeline_id INTEGER NOT NULL,
name TEXT NOT NULL,
type TEXT NOT NULL, -- video, audio, text
track_order INTEGER NOT NULL DEFAULT 0,
is_locked INTEGER NOT NULL DEFAULT 0,
is_muted INTEGER NOT NULL DEFAULT 0,
volume INTEGER DEFAULT 100,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_timeline_tracks_timeline_id ON timeline_tracks(timeline_id);
CREATE INDEX IF NOT EXISTS idx_timeline_tracks_type ON timeline_tracks(type);
CREATE INDEX IF NOT EXISTS idx_timeline_tracks_deleted_at ON timeline_tracks(deleted_at);
-- 时间线片段表
CREATE TABLE IF NOT EXISTS timeline_clips (
id INTEGER PRIMARY KEY AUTOINCREMENT,
track_id INTEGER NOT NULL,
asset_id INTEGER,
storyboard_id INTEGER, -- 修正引用storyboards而非scenes
name TEXT,
start_time INTEGER NOT NULL, -- 开始时间(毫秒)
end_time INTEGER NOT NULL, -- 结束时间(毫秒)
duration INTEGER NOT NULL, -- 时长(毫秒)
trim_start INTEGER, -- 裁剪开始(毫秒)
trim_end INTEGER, -- 裁剪结束(毫秒)
speed REAL DEFAULT 1.0,
volume INTEGER,
is_muted INTEGER NOT NULL DEFAULT 0,
fade_in INTEGER, -- 淡入时长(毫秒)
fade_out INTEGER, -- 淡出时长(毫秒)
transition_in_id INTEGER,
transition_out_id INTEGER,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_timeline_clips_track_id ON timeline_clips(track_id);
CREATE INDEX IF NOT EXISTS idx_timeline_clips_asset_id ON timeline_clips(asset_id);
CREATE INDEX IF NOT EXISTS idx_timeline_clips_storyboard_id ON timeline_clips(storyboard_id);
CREATE INDEX IF NOT EXISTS idx_timeline_clips_transition_in ON timeline_clips(transition_in_id);
CREATE INDEX IF NOT EXISTS idx_timeline_clips_transition_out ON timeline_clips(transition_out_id);
CREATE INDEX IF NOT EXISTS idx_timeline_clips_deleted_at ON timeline_clips(deleted_at);
-- 片段转场表
CREATE TABLE IF NOT EXISTS clip_transitions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL, -- fade, crossfade, slide, wipe, zoom, dissolve
duration INTEGER NOT NULL DEFAULT 500, -- 转场时长(毫秒)
easing TEXT,
config TEXT, -- JSON存储
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_clip_transitions_type ON clip_transitions(type);
CREATE INDEX IF NOT EXISTS idx_clip_transitions_deleted_at ON clip_transitions(deleted_at);
-- 片段效果表
CREATE TABLE IF NOT EXISTS clip_effects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
clip_id INTEGER NOT NULL,
type TEXT NOT NULL, -- filter, color, blur, brightness, contrast, saturation
name TEXT,
is_enabled INTEGER NOT NULL DEFAULT 1,
effect_order INTEGER NOT NULL DEFAULT 0,
config TEXT, -- JSON存储
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_clip_effects_clip_id ON clip_effects(clip_id);
CREATE INDEX IF NOT EXISTS idx_clip_effects_type ON clip_effects(type);
CREATE INDEX IF NOT EXISTS idx_clip_effects_deleted_at ON clip_effects(deleted_at);
-- ======================================
-- 5. 资源管理相关表
-- ======================================
-- 资源表
CREATE TABLE IF NOT EXISTS assets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
name TEXT NOT NULL,
description TEXT,
type TEXT NOT NULL, -- image, video, audio
category TEXT,
url TEXT NOT NULL,
thumbnail_url TEXT,
local_path TEXT,
file_size INTEGER,
mime_type TEXT,
width INTEGER,
height INTEGER,
duration INTEGER, -- 时长(秒)
format TEXT,
image_gen_id INTEGER,
video_gen_id INTEGER,
is_favorite INTEGER NOT NULL DEFAULT 0,
view_count INTEGER NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_assets_drama_id ON assets(drama_id);
CREATE INDEX IF NOT EXISTS idx_assets_type ON assets(type);
CREATE INDEX IF NOT EXISTS idx_assets_category ON assets(category);
CREATE INDEX IF NOT EXISTS idx_assets_image_gen_id ON assets(image_gen_id);
CREATE INDEX IF NOT EXISTS idx_assets_video_gen_id ON assets(video_gen_id);
CREATE INDEX IF NOT EXISTS idx_assets_deleted_at ON assets(deleted_at);
-- 资源标签表
CREATE TABLE IF NOT EXISTS asset_tags (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
color TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_asset_tags_deleted_at ON asset_tags(deleted_at);
-- 资源集合表
CREATE TABLE IF NOT EXISTS asset_collections (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drama_id INTEGER,
name TEXT NOT NULL,
description TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_asset_collections_drama_id ON asset_collections(drama_id);
CREATE INDEX IF NOT EXISTS idx_asset_collections_deleted_at ON asset_collections(deleted_at);
-- 资源标签关系表(多对多)
CREATE TABLE IF NOT EXISTS asset_tag_relations (
asset_id INTEGER NOT NULL,
asset_tag_id INTEGER NOT NULL,
PRIMARY KEY (asset_id, asset_tag_id)
);
CREATE INDEX IF NOT EXISTS idx_asset_tag_relations_asset_id ON asset_tag_relations(asset_id);
CREATE INDEX IF NOT EXISTS idx_asset_tag_relations_tag_id ON asset_tag_relations(asset_tag_id);
-- 资源集合关系表(多对多)
CREATE TABLE IF NOT EXISTS asset_collection_relations (
asset_id INTEGER NOT NULL,
asset_collection_id INTEGER NOT NULL,
PRIMARY KEY (asset_id, asset_collection_id)
);
CREATE INDEX IF NOT EXISTS idx_asset_collection_relations_asset_id ON asset_collection_relations(asset_id);
CREATE INDEX IF NOT EXISTS idx_asset_collection_relations_collection_id ON asset_collection_relations(asset_collection_id);
-- ======================================
-- 6. AI服务配置表 (开源版本 - 全局配置)
-- ======================================
-- AI服务配置表 (全局配置,无用户隔离)
CREATE TABLE IF NOT EXISTS ai_service_configs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
service_type TEXT NOT NULL, -- text, image, video
name TEXT NOT NULL,
base_url TEXT NOT NULL,
api_key TEXT NOT NULL,
model TEXT,
endpoint TEXT,
query_endpoint TEXT,
is_default INTEGER NOT NULL DEFAULT 0,
is_active INTEGER NOT NULL DEFAULT 1,
settings TEXT, -- JSON存储
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_ai_service_configs_service_type ON ai_service_configs(service_type);
CREATE INDEX IF NOT EXISTS idx_ai_service_configs_deleted_at ON ai_service_configs(deleted_at);
-- AI服务提供商表
CREATE TABLE IF NOT EXISTS ai_service_providers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
display_name TEXT NOT NULL,
service_type TEXT NOT NULL, -- text, image, video
default_url TEXT,
description TEXT,
is_active INTEGER NOT NULL DEFAULT 1,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted_at DATETIME
);
CREATE INDEX IF NOT EXISTS idx_ai_service_providers_service_type ON ai_service_providers(service_type);
CREATE INDEX IF NOT EXISTS idx_ai_service_providers_deleted_at ON ai_service_providers(deleted_at);
-- ======================================
-- 7. 初始数据
-- ======================================
-- 插入默认AI服务提供商
INSERT OR IGNORE INTO ai_service_providers (name, display_name, service_type, default_url, description) VALUES
('openai', 'OpenAI', 'text', 'https://api.openai.com/v1', 'OpenAI GPT模型'),
('openai-dalle', 'OpenAI DALL-E', 'image', 'https://api.openai.com/v1', 'OpenAI DALL-E图片生成'),
('openai-sora', 'OpenAI Sora', 'video', 'https://api.openai.com/v1', 'OpenAI Sora视频生成'),
('midjourney', 'Midjourney', 'image', '', 'Midjourney图片生成'),
('stable-diffusion', 'Stable Diffusion', 'image', '', 'Stable Diffusion图片生成'),
('runway', 'Runway', 'video', '', 'Runway视频生成'),
('pika', 'Pika Labs', 'video', '', 'Pika视频生成'),
('doubao', '豆包(火山引擎)', 'video', 'https://ark.cn-beijing.volces.com', '火山引擎豆包视频生成'),
('minimax', 'MiniMax', 'video', '', 'MiniMax视频生成');