# database/models.py - 数据模型定义(SQLite 建表 DDL) from dataclasses import dataclass, field from datetime import datetime from typing import Optional # ══════════════════════════════════════════════════════ # DDL 建表语句 # ══════════════════════════════════════════════════════ CREATE_TABLES_SQL = """ PRAGMA foreign_keys = ON; -- 项目表 CREATE TABLE IF NOT EXISTS projects ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, -- 项目名称 description TEXT, -- 项目描述 language TEXT NOT NULL DEFAULT 'python', -- 目标代码语言 output_dir TEXT NOT NULL, -- 输出目录路径 created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); -- 原始需求表 CREATE TABLE IF NOT EXISTS raw_requirements ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER NOT NULL, -- 关联项目 content TEXT NOT NULL, -- 需求原文 source_type TEXT NOT NULL DEFAULT 'text', -- text | file source_name TEXT, -- 文件名(文件输入时) knowledge TEXT, -- 合并后的知识库内容 created_at TEXT NOT NULL, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE ); -- 功能需求表 CREATE TABLE IF NOT EXISTS functional_requirements ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER NOT NULL, raw_req_id INTEGER NOT NULL, -- 关联原始需求 index_no INTEGER NOT NULL, -- 序号 title TEXT NOT NULL, -- 功能标题 description TEXT NOT NULL, -- 功能描述 function_name TEXT NOT NULL, -- 对应函数名 priority TEXT NOT NULL DEFAULT 'medium', -- high|medium|low status TEXT NOT NULL DEFAULT 'pending', -- pending|generated|skipped is_custom INTEGER NOT NULL DEFAULT 0, -- 是否用户自定义 (0/1) created_at TEXT NOT NULL, updated_at TEXT NOT NULL, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, FOREIGN KEY (raw_req_id) REFERENCES raw_requirements(id) ON DELETE CASCADE ); -- 代码文件表 CREATE TABLE IF NOT EXISTS code_files ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id INTEGER NOT NULL, func_req_id INTEGER NOT NULL UNIQUE, -- 关联功能需求(1对1) file_name TEXT NOT NULL, -- 文件名 file_path TEXT NOT NULL, -- 完整路径 language TEXT NOT NULL, -- 代码语言 content TEXT NOT NULL, -- 代码内容 created_at TEXT NOT NULL, updated_at TEXT NOT NULL, FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, FOREIGN KEY (func_req_id) REFERENCES functional_requirements(id) ON DELETE CASCADE ); """ # ══════════════════════════════════════════════════════ # 数据类(Python 对象映射) # ══════════════════════════════════════════════════════ @dataclass class Project: name: str output_dir: str language: str = "python" description: str = "" id: Optional[int] = None created_at: str = field(default_factory=lambda: datetime.now().isoformat()) updated_at: str = field(default_factory=lambda: datetime.now().isoformat()) @dataclass class RawRequirement: project_id: int content: str source_type: str = "text" # text | file source_name: Optional[str] = None knowledge: Optional[str] = None id: Optional[int] = None created_at: str = field(default_factory=lambda: datetime.now().isoformat()) @dataclass class FunctionalRequirement: project_id: int raw_req_id: int index_no: int title: str description: str function_name: str priority: str = "medium" status: str = "pending" is_custom: bool = False id: Optional[int] = None created_at: str = field(default_factory=lambda: datetime.now().isoformat()) updated_at: str = field(default_factory=lambda: datetime.now().isoformat()) @dataclass class CodeFile: project_id: int func_req_id: int file_name: str file_path: str language: str content: str id: Optional[int] = None created_at: str = field(default_factory=lambda: datetime.now().isoformat()) updated_at: str = field(default_factory=lambda: datetime.now().isoformat())