127 lines
4.9 KiB
PL/PgSQL
127 lines
4.9 KiB
PL/PgSQL
-- 初始化 MixVideo 数据库
|
||
-- 这个脚本会在 PostgreSQL 容器首次启动时自动执行
|
||
|
||
-- 创建扩展
|
||
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
||
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
|
||
|
||
-- 创建用户表
|
||
CREATE TABLE IF NOT EXISTS users (
|
||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||
username VARCHAR(50) UNIQUE NOT NULL,
|
||
email VARCHAR(100) UNIQUE NOT NULL,
|
||
password_hash VARCHAR(255) NOT NULL,
|
||
access_token VARCHAR(500),
|
||
token_expires_at TIMESTAMP WITH TIME ZONE,
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
is_active BOOLEAN DEFAULT true
|
||
);
|
||
|
||
-- 创建模板表
|
||
CREATE TABLE IF NOT EXISTS templates (
|
||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||
name VARCHAR(255) NOT NULL,
|
||
description TEXT,
|
||
thumbnail_path VARCHAR(500),
|
||
draft_content_path VARCHAR(500),
|
||
resources_path VARCHAR(500),
|
||
canvas_config JSONB DEFAULT '{}',
|
||
duration INTEGER DEFAULT 0,
|
||
material_count INTEGER DEFAULT 0,
|
||
track_count INTEGER DEFAULT 0,
|
||
tags TEXT[] DEFAULT '{}',
|
||
is_cloud BOOLEAN DEFAULT false,
|
||
user_id VARCHAR(100) NOT NULL DEFAULT 'default',
|
||
draft_content JSONB,
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建资源分类表
|
||
CREATE TABLE IF NOT EXISTS resource_categories (
|
||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||
title VARCHAR(255) NOT NULL,
|
||
ai_prompt TEXT NOT NULL,
|
||
color VARCHAR(7) NOT NULL DEFAULT '#FF6B6B',
|
||
is_active BOOLEAN DEFAULT true,
|
||
is_cloud BOOLEAN DEFAULT false,
|
||
user_id VARCHAR(100) NOT NULL DEFAULT 'default',
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建项目表
|
||
CREATE TABLE IF NOT EXISTS projects (
|
||
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
||
name VARCHAR(255) NOT NULL,
|
||
description TEXT,
|
||
project_directory VARCHAR(500),
|
||
thumbnail_path VARCHAR(500),
|
||
canvas_config JSONB DEFAULT '{}',
|
||
user_id VARCHAR(100) NOT NULL DEFAULT 'default',
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
);
|
||
|
||
-- 创建索引
|
||
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
||
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
||
CREATE INDEX IF NOT EXISTS idx_users_access_token ON users(access_token);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_templates_user_id ON templates(user_id);
|
||
CREATE INDEX IF NOT EXISTS idx_templates_name ON templates(name);
|
||
CREATE INDEX IF NOT EXISTS idx_templates_is_cloud ON templates(is_cloud);
|
||
CREATE INDEX IF NOT EXISTS idx_templates_created_at ON templates(created_at);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_resource_categories_user_id ON resource_categories(user_id);
|
||
CREATE INDEX IF NOT EXISTS idx_resource_categories_is_active ON resource_categories(is_active);
|
||
CREATE INDEX IF NOT EXISTS idx_resource_categories_is_cloud ON resource_categories(is_cloud);
|
||
|
||
CREATE INDEX IF NOT EXISTS idx_projects_user_id ON projects(user_id);
|
||
CREATE INDEX IF NOT EXISTS idx_projects_name ON projects(name);
|
||
|
||
-- 插入默认数据
|
||
INSERT INTO users (id, username, email, password_hash, access_token)
|
||
VALUES (
|
||
'default-user-id',
|
||
'default',
|
||
'default@mixvideo.com',
|
||
'default_hash',
|
||
'default_token'
|
||
) ON CONFLICT (username) DO NOTHING;
|
||
|
||
-- 插入默认分类
|
||
INSERT INTO resource_categories (title, ai_prompt, color, user_id) VALUES
|
||
('开场介绍', '视频开头的介绍部分,包括标题、logo等', '#FF6B6B', 'default'),
|
||
('主要内容', '视频的核心内容部分', '#4ECDC4', 'default'),
|
||
('转场过渡', '视频片段之间的过渡效果', '#45B7D1', 'default'),
|
||
('结尾总结', '视频结尾的总结和结束语', '#96CEB4', 'default'),
|
||
('背景音乐', '视频的背景音乐和音效', '#FFEAA7', 'default'),
|
||
('字幕文本', '视频中的字幕和文字说明', '#DDA0DD', 'default'),
|
||
('特效动画', '视频中的特效和动画效果', '#98D8C8', 'default'),
|
||
('产品展示', '产品或服务的展示片段', '#F7DC6F', 'default')
|
||
ON CONFLICT DO NOTHING;
|
||
|
||
-- 创建更新时间触发器函数
|
||
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
||
RETURNS TRIGGER AS $$
|
||
BEGIN
|
||
NEW.updated_at = CURRENT_TIMESTAMP;
|
||
RETURN NEW;
|
||
END;
|
||
$$ language 'plpgsql';
|
||
|
||
-- 为所有表创建更新时间触发器
|
||
CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
|
||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||
|
||
CREATE TRIGGER update_templates_updated_at BEFORE UPDATE ON templates
|
||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||
|
||
CREATE TRIGGER update_resource_categories_updated_at BEFORE UPDATE ON resource_categories
|
||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
||
|
||
CREATE TRIGGER update_projects_updated_at BEFORE UPDATE ON projects
|
||
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|