-- 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 provider TEXT, -- openai, gemini, volcengine, etc. name TEXT NOT NULL, base_url TEXT NOT NULL, api_key TEXT NOT NULL, model TEXT, endpoint TEXT, query_endpoint TEXT, priority INTEGER NOT NULL DEFAULT 0, 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图片生成'), ('doubao-image', '豆包(火山引擎)', 'image', 'https://ark.cn-beijing.volces.com', '火山引擎豆包图片生成'), ('gemini-image', 'Google Gemini', 'image', 'https://generativelanguage.googleapis.com', 'Google Gemini原生图片生成(base64)'), ('runway', 'Runway', 'video', '', 'Runway视频生成'), ('pika', 'Pika Labs', 'video', '', 'Pika视频生成'), ('doubao', '豆包(火山引擎)', 'video', 'https://ark.cn-beijing.volces.com', '火山引擎豆包视频生成'), ('minimax', 'MiniMax', 'video', '', 'MiniMax视频生成');