"""数据库表结构 DDL(Sprint 1:users / preferences / ppt_records / versions / chat_messages)。""" SCHEMA_SQL = """ CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')) ); CREATE TABLE IF NOT EXISTS preferences ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, default_scene TEXT NOT NULL DEFAULT 'training', default_color TEXT NOT NULL DEFAULT 'blue', default_language TEXT NOT NULL DEFAULT 'zh', default_canvas TEXT NOT NULL DEFAULT 'ppt169', default_image_strategy TEXT NOT NULL DEFAULT 'web', default_page_min INTEGER NOT NULL DEFAULT 10, default_page_max INTEGER NOT NULL DEFAULT 15, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE UNIQUE INDEX IF NOT EXISTS idx_preferences_user ON preferences(user_id); CREATE TABLE IF NOT EXISTS ppt_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, title TEXT NOT NULL, content TEXT NOT NULL, scene TEXT NOT NULL, language TEXT NOT NULL DEFAULT 'zh', canvas TEXT NOT NULL DEFAULT 'ppt169', image_strategy TEXT NOT NULL DEFAULT 'web', color_scheme TEXT NOT NULL, page_min INTEGER NOT NULL, page_max INTEGER NOT NULL, status TEXT NOT NULL DEFAULT 'processing', file_size INTEGER, page_count INTEGER, generate_duration INTEGER, created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_records_user_time ON ppt_records(user_id, created_at DESC); CREATE INDEX IF NOT EXISTS idx_records_user_scene ON ppt_records(user_id, scene); CREATE TABLE IF NOT EXISTS versions ( id INTEGER PRIMARY KEY AUTOINCREMENT, record_id INTEGER NOT NULL, version_no INTEGER NOT NULL, file_path TEXT NOT NULL, svg_dir TEXT, change_note TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')), FOREIGN KEY (record_id) REFERENCES ppt_records(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_versions_record ON versions(record_id); CREATE TABLE IF NOT EXISTS chat_messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, record_id INTEGER NOT NULL, role TEXT NOT NULL, content TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now', 'localtime')), FOREIGN KEY (record_id) REFERENCES ppt_records(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_chat_record ON chat_messages(record_id, created_at); """ def init_db() -> None: """执行全部 DDL,幂等可重复调用。""" from .conn import get_connection conn = get_connection() try: conn.executescript(SCHEMA_SQL) conn.commit() finally: conn.close()