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()) |