122 lines
5.0 KiB
Python
122 lines
5.0 KiB
Python
|
|
# 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())
|