docs: complete documentation system (250+ files)

- System architecture and design documentation
- Business module docs (ASL/AIA/PKB/RVW/DC/SSA/ST)
- ASL module complete design (quality assurance, tech selection)
- Platform layer and common capabilities docs
- Development standards and API specifications
- Deployment and operations guides
- Project management and milestone tracking
- Architecture implementation reports
- Documentation templates and guides
This commit is contained in:
2025-11-16 15:43:55 +08:00
parent 0fe6821a89
commit e52020409c
173 changed files with 46227 additions and 11964 deletions

View File

@@ -0,0 +1,497 @@
# 数据库设计规范
> **版本:** v2.0
> **最后更新:** 2025-11-06
> **数据库:** PostgreSQL 15+
> **ORM** Prisma
> **适用范围:** 平台层 + 能力层 + 业务模块层
---
## 📋 核心原则
本规范是所有模块数据库设计的基础规范,必须严格遵守。
**设计原则:**
- ✅ 遵循第三范式3NF
- ✅ 使用SERIAL作为主键整数自增性能更好
- ✅ 所有表包含created_at和updated_at时间戳
- ✅ 重要表使用软删除保留deleted_at字段
- ✅ 外键约束使用ON DELETE CASCADE
- ✅ 敏感字段加密存储密码使用bcrypt
---
## 🏗️ Schema隔离策略 ⭐ 最重要
### 为什么需要Schema隔离
**核心原因:**
1.**模块独立性**每个业务模块有独立的Schema
2.**支持独立部署**:可以单独导出某个模块的数据
3.**支持独立销售**:可以单独交付某个模块
4.**权限隔离**可以为不同Schema设置不同权限
5.**避免命名冲突**:不同模块可以有相同的表名
### Schema命名规范
```
platform_schema # 平台基础层(全局共享)
aia_schema # AI智能问答
asl_schema # AI智能文献
pkb_schema # 个人知识库
dc_schema # 数据清洗整理
ssa_schema # 智能统计分析
st_schema # 统计分析工具
rvw_schema # 稿件审查系统
```
### Schema创建
```sql
-- 创建Schema
CREATE SCHEMA IF NOT EXISTS platform_schema;
CREATE SCHEMA IF NOT EXISTS asl_schema;
CREATE SCHEMA IF NOT EXISTS aia_schema;
-- ...其他Schema
```
### 跨Schema依赖规则 ⭐ 必须遵守
**允许的依赖:**
```sql
-- ✅ 允许业务模块引用platform_schema
CREATE TABLE asl_schema.literature_projects (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES platform_schema.users(id) ON DELETE CASCADE,
...
);
-- ✅ 允许通用能力引用platform_schema
CREATE TABLE platform_schema.llm_usage (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES platform_schema.users(id) ON DELETE CASCADE,
...
);
```
**禁止的依赖:**
```sql
-- ❌ 禁止:业务模块之间互相引用
CREATE TABLE ssa_schema.analysis_projects (
id SERIAL PRIMARY KEY,
-- 错误!不能引用其他业务模块
literature_project_id INTEGER REFERENCES asl_schema.literature_projects(id)
);
-- ❌ 禁止platform_schema反向依赖业务模块
CREATE TABLE platform_schema.users (
id SERIAL PRIMARY KEY,
-- 错误platform_schema不能依赖业务模块
current_project_id INTEGER REFERENCES asl_schema.literature_projects(id)
);
```
**正确做法:**
```
跨模块数据关联在应用层处理,不在数据库层!
方式1通过user_id关联
- 两个模块都引用platform_schema.users
- 在应用层通过user_id查询两个模块的数据
- 在应用层组装数据
方式2存储业务ID字符串
- 在表中存储其他模块的业务IDVARCHAR
- 不建立外键关系
- 在应用层验证ID的有效性
```
---
## 📝 命名规范
### 表命名
**规则:**
- 小写字母
- 下划线分隔
- 复数形式
- Schema前缀查询时使用
**示例:**
```sql
-- ✅ 正确
CREATE TABLE asl_schema.literature_projects (...);
CREATE TABLE platform_schema.users (...);
CREATE TABLE pkb_schema.knowledge_bases (...);
-- ❌ 错误
CREATE TABLE ASLSchema.LiteratureProject (...); -- 驼峰
CREATE TABLE asl_schema.project (...); -- 单数
CREATE TABLE literature-projects (...); -- 使用连字符
```
### 字段命名
**规则:**
- 小写字母
- 下划线分隔
- 语义清晰
**示例:**
```sql
-- ✅ 正确
user_id
created_at
project_name
is_active
-- ❌ 错误
userId -- 驼峰
createdat -- 没有下划线
prjName -- 缩写不清晰
```
### 索引命名
**规则:** `idx_表名_字段名`
**示例:**
```sql
-- ✅ 正确
CREATE INDEX idx_users_email ON platform_schema.users(email);
CREATE INDEX idx_projects_user_id ON asl_schema.literature_projects(user_id);
CREATE INDEX idx_projects_user_status ON asl_schema.literature_projects(user_id, status);
-- ❌ 错误
CREATE INDEX user_email_idx ... -- 顺序错误
CREATE INDEX index_on_email ... -- 名称不清晰
```
### 外键命名
**规则:** `fk_表名_关联表名`
**示例:**
```sql
-- ✅ 正确
CONSTRAINT fk_projects_users
FOREIGN KEY (user_id) REFERENCES platform_schema.users(id);
CONSTRAINT fk_items_projects
FOREIGN KEY (project_id) REFERENCES asl_schema.literature_projects(id);
-- ❌ 错误
CONSTRAINT user_fk ... -- 名称不清晰
CONSTRAINT foreign_key_users ... -- 太长
```
---
## 📊 通用字段 ⭐ 必须包含
### 所有表必须包含
```sql
CREATE TABLE xxx_schema.table_name (
-- 主键(必须)
id SERIAL PRIMARY KEY,
-- 业务字段
...
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
updated_at TIMESTAMP DEFAULT NOW() NOT NULL
);
```
### 重要表应包含(软删除)
```sql
CREATE TABLE xxx_schema.important_table (
id SERIAL PRIMARY KEY,
-- 业务字段
...
-- 软删除字段(可选,重要表建议添加)
deleted_at TIMESTAMP,
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
updated_at TIMESTAMP DEFAULT NOW() NOT NULL
);
-- 查询时过滤已删除数据
SELECT * FROM xxx_schema.important_table WHERE deleted_at IS NULL;
```
### 用户关联表必须包含
```sql
CREATE TABLE xxx_schema.user_related_table (
id SERIAL PRIMARY KEY,
-- 用户外键(必须)
user_id INTEGER REFERENCES platform_schema.users(id) ON DELETE CASCADE NOT NULL,
-- 业务字段
...
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
updated_at TIMESTAMP DEFAULT NOW() NOT NULL
);
```
---
## 🔍 索引设计规范
### 必须添加索引的字段
**1. 主键**
```sql
-- 自动创建,无需手动添加
id SERIAL PRIMARY KEY
```
**2. 外键字段**
```sql
-- 必须添加提高JOIN性能
CREATE INDEX idx_projects_user_id ON asl_schema.literature_projects(user_id);
```
**3. 常用查询字段**
```sql
-- status状态字段常用于WHERE
CREATE INDEX idx_projects_status ON asl_schema.literature_projects(status);
-- created_at时间字段常用于排序
CREATE INDEX idx_projects_created_at ON asl_schema.literature_projects(created_at DESC);
```
**4. 唯一约束字段**
```sql
-- email等唯一字段
CREATE UNIQUE INDEX idx_users_email ON platform_schema.users(email);
```
### 复合索引
**规则:**
- 高频组合查询使用复合索引
- 最常查询的字段放在前面
- 复合索引最多3个字段
**示例:**
```sql
-- ✅ 正确user_id + status 组合查询
CREATE INDEX idx_projects_user_status
ON asl_schema.literature_projects(user_id, status);
-- 可以优化以下查询:
-- WHERE user_id = ? AND status = ?
-- WHERE user_id = ? (只用前缀)
-- ❌ 错误:字段过多
CREATE INDEX idx_projects_complex
ON asl_schema.literature_projects(user_id, status, created_at, updated_at);
```
---
## 🔗 外键约束规范
### ON DELETE策略
**规则:**
```sql
-- 用户删除时,级联删除关联数据
FOREIGN KEY (user_id)
REFERENCES platform_schema.users(id)
ON DELETE CASCADE;
-- 父记录删除时,级联删除子记录
FOREIGN KEY (project_id)
REFERENCES asl_schema.literature_projects(id)
ON DELETE CASCADE;
-- 特殊情况:不能删除
FOREIGN KEY (parent_id)
REFERENCES xxx_schema.parent_table(id)
ON DELETE RESTRICT; -- 有子记录时禁止删除
```
### 外键索引
**规则:** 所有外键必须添加索引
```sql
-- 创建外键
ALTER TABLE asl_schema.literature_items
ADD CONSTRAINT fk_items_projects
FOREIGN KEY (project_id) REFERENCES asl_schema.literature_projects(id)
ON DELETE CASCADE;
-- 必须添加索引
CREATE INDEX idx_items_project_id ON asl_schema.literature_items(project_id);
```
---
## ⚡ 性能优化规范
### 大表分区(可选)
**适用场景:** 年增长 > 100万记录
```sql
-- 按月分区如llm_usage表
CREATE TABLE platform_schema.llm_usage (
id SERIAL,
user_id INTEGER NOT NULL,
created_at TIMESTAMP NOT NULL,
...
) PARTITION BY RANGE (created_at);
-- 创建分区
CREATE TABLE platform_schema.llm_usage_2025_11
PARTITION OF platform_schema.llm_usage
FOR VALUES FROM ('2025-11-01') TO ('2025-12-01');
```
### 数据归档策略
```sql
-- 历史数据归档如1年前的日志
CREATE TABLE platform_schema.admin_logs_archive (
LIKE platform_schema.admin_logs INCLUDING ALL
);
-- 定期归档
INSERT INTO platform_schema.admin_logs_archive
SELECT * FROM platform_schema.admin_logs
WHERE created_at < NOW() - INTERVAL '1 year';
DELETE FROM platform_schema.admin_logs
WHERE created_at < NOW() - INTERVAL '1 year';
```
---
## 🔒 安全规范
### 敏感字段加密
```sql
-- 密码字段
password VARCHAR(255) NOT NULL -- 使用bcrypt加密存储哈希值
-- API Key字段
api_key_encrypted TEXT NOT NULL -- 使用AES-256加密
-- 个人敏感信息
phone_encrypted VARCHAR(255) -- 手机号加密
id_card_encrypted VARCHAR(255) -- 身份证号加密
```
### 数据脱敏
```sql
-- 日志中不记录敏感字段
-- 开发/测试环境使用脱敏数据
UPDATE platform_schema.users
SET
email = CONCAT('user', id, '@example.com'),
phone = '138****0000'
WHERE environment = 'development';
```
---
## 📋 数据类型选择
### 常用字段类型
| 用途 | 推荐类型 | 说明 |
|------|---------|------|
| 主键 | SERIAL | 整数自增 |
| 外键 | INTEGER | 与主键类型一致 |
| 短文本 | VARCHAR(N) | N<500如姓名、标题 |
| 长文本 | TEXT | 无长度限制,如描述、内容 |
| 布尔值 | BOOLEAN | true/false |
| 日期时间 | TIMESTAMP | 精确到毫秒 |
| 金额 | DECIMAL(10,2) | 避免精度问题 |
| JSON | JSONB | 支持索引,性能更好 |
### 字段长度建议
```sql
-- 短文本
name VARCHAR(100) -- 姓名
title VARCHAR(200) -- 标题
email VARCHAR(255) -- 邮箱
phone VARCHAR(20) -- 手机号
-- 状态枚举
status VARCHAR(20) -- active, inactive, deleted
role VARCHAR(20) -- user, admin
-- 长文本
description TEXT -- 描述
content TEXT -- 内容
```
---
## ✅ 检查清单
**设计新表时必须检查:**
- [ ] 表名符合命名规范(小写+下划线+复数)
- [ ] 使用正确的Schemaplatform/aia/asl/pkb等
- [ ] 包含id主键SERIAL PRIMARY KEY
- [ ] 包含created_at和updated_at时间戳
- [ ] 用户关联表包含user_id外键
- [ ] 所有外键都有ON DELETE策略
- [ ] 所有外键都添加了索引
- [ ] 常用查询字段添加了索引
- [ ] 外键约束符合跨Schema依赖规则
- [ ] 敏感字段已加密存储
---
## 🔗 相关文档
**总览:**
- [数据库全局视图](./03-数据库全局视图.md) ⭐ 查看所有Schema和表
**模板:**
- [数据库设计模板](../_templates/数据库设计-模板.md)
**各模块设计:**
- [平台基础层](../01-平台基础层/README.md)
- [通用能力层](../02-通用能力层/README.md)
- [业务模块层](../03-业务模块/README.md)
---
**最后更新:** 2025-11-06
**维护人:** 技术架构师
**版本:** v2.0

View File

@@ -0,0 +1,527 @@
# API设计规范
> **版本:** v2.0
> **最后更新:** 2025-11-06
> **API风格** RESTful API
> **基础URL** `http://localhost:3001/api/v1`
> **适用范围:** 平台层 + 能力层 + 业务模块层
---
## 📋 设计原则
### API First原则
- ✅ 先设计API再实现功能
- ✅ API是前后端的契约
- ✅ API变更需要版本控制
- ✅ 所有API都要有文档
### RESTful设计
- ✅ 使用HTTP动词表示操作GET、POST、PUT、DELETE
- ✅ URL表示资源不表示动作
- ✅ 使用复数名词表示资源集合
- ✅ 嵌套资源不超过2层
- ✅ 使用HTTP状态码表示结果
### 命名规范
- ✅ URL使用小写字母和连字符kebab-case
- ✅ 查询参数使用驼峰命名camelCase
- ✅ JSON字段使用驼峰命名camelCase
---
## 🎯 URL设计规范
### 路径格式
```
/api/v{version}/{module}/{resource}/{id?}/{action?}
示例:
/api/v1/literature/projects # 获取文献项目列表
/api/v1/literature/projects/123 # 获取ID=123的项目
/api/v1/literature/projects/123/export # 导出项目(动作)
```
### 模块前缀
| 模块 | 路由前缀 | 示例 |
|------|---------|------|
| 认证 | `/auth` | `/api/v1/auth/login` |
| 用户 | `/users` | `/api/v1/users/me` |
| AI问答 | `/chat` | `/api/v1/chat/conversations` |
| 智能体 | `/agents` | `/api/v1/agents` |
| AI文献 | `/literature` | `/api/v1/literature/projects` |
| 知识库 | `/knowledge-bases` | `/api/v1/knowledge-bases` |
| 数据清洗 | `/data-cleaning` | `/api/v1/data-cleaning/projects` |
| 统计分析 | `/analysis` | `/api/v1/analysis/projects` |
| 统计工具 | `/tools` | `/api/v1/tools` |
| 稿件审查 | `/review` | `/api/v1/review/tasks` |
| LLM网关 | `/llm` | `/api/v1/llm/chat` |
| 管理端 | `/admin` | `/api/v1/admin/users` |
### 资源命名
**✅ 正确示例:**
```
GET /api/v1/literature/projects # 获取列表
GET /api/v1/literature/projects/:id # 获取详情
POST /api/v1/literature/projects # 创建
PUT /api/v1/literature/projects/:id # 更新
DELETE /api/v1/literature/projects/:id # 删除
GET /api/v1/literature/projects/:id/items # 获取项目下的文献
POST /api/v1/literature/projects/:id/items/import # 导入文献
POST /api/v1/literature/projects/:id/screening/execute # 执行筛选
```
**❌ 错误示例:**
```
POST /api/v1/literature/getProjects # 使用动词
POST /api/v1/literature/createProject # 使用动词
GET /api/v1/literature/project # 单数形式
GET /api/v1/literatureProjectList # 驼峰命名
```
---
## 🔧 HTTP方法规范
### 方法使用
| 方法 | 用途 | 是否幂等 | 是否安全 |
|------|------|---------|---------|
| **GET** | 获取资源 | ✅ | ✅ |
| **POST** | 创建资源 | ❌ | ❌ |
| **PUT** | 完整更新资源 | ✅ | ❌ |
| **PATCH** | 部分更新资源 | ❌ | ❌ |
| **DELETE** | 删除资源 | ✅ | ❌ |
### 方法示例
```http
#
GET /api/v1/literature/projects
#
GET /api/v1/literature/projects/123
#
POST /api/v1/literature/projects
Content-Type: application/json
{ "name": "", "description": "..." }
#
PUT /api/v1/literature/projects/123
Content-Type: application/json
{ "name": "", "description": "..." }
#
PATCH /api/v1/literature/projects/123
Content-Type: application/json
{ "name": "" }
#
DELETE /api/v1/literature/projects/123
```
---
## 📊 状态码规范
### 标准状态码
| 状态码 | 含义 | 使用场景 |
|--------|------|---------|
| **200** | OK | 成功返回数据 |
| **201** | Created | 成功创建资源 |
| **204** | No Content | 成功但无返回数据(如删除) |
| **400** | Bad Request | 请求参数错误 |
| **401** | Unauthorized | 未认证没有Token或Token过期 |
| **403** | Forbidden | 无权限(已认证但权限不足) |
| **404** | Not Found | 资源不存在 |
| **409** | Conflict | 资源冲突(如重复创建) |
| **422** | Unprocessable Entity | 语义错误(如验证失败) |
| **429** | Too Many Requests | 请求过于频繁(限流) |
| **500** | Internal Server Error | 服务器错误 |
### 状态码使用示例
```typescript
// 200 OK - 成功获取数据
res.status(200).json({ success: true, data: projects });
// 201 Created - 成功创建资源
res.status(201).json({ success: true, data: newProject });
// 204 No Content - 成功删除(无内容返回)
res.status(204).send();
// 400 Bad Request - 参数错误
res.status(400).json({
success: false,
error: { code: 'INVALID_PARAMS', message: '参数错误' }
});
// 401 Unauthorized - 未认证
res.status(401).json({
success: false,
error: { code: 'UNAUTHORIZED', message: '请先登录' }
});
// 403 Forbidden - 无权限
res.status(403).json({
success: false,
error: { code: 'FORBIDDEN', message: '无权访问' }
});
// 404 Not Found - 资源不存在
res.status(404).json({
success: false,
error: { code: 'NOT_FOUND', message: '资源不存在' }
});
// 422 Unprocessable Entity - 验证失败
res.status(422).json({
success: false,
error: {
code: 'VALIDATION_ERROR',
message: '参数验证失败',
details: [...]
}
});
```
---
## 📝 响应格式规范
### 统一响应格式 ⭐ 必须遵守
**成功响应:**
```json
{
"success": true,
"data": {
// 实际数据
},
"message": "操作成功"
}
```
**错误响应:**
```json
{
"success": false,
"error": {
"code": "ERROR_CODE",
"message": "错误信息",
"details": [...] // 可选,详细错误信息
}
}
```
### 列表数据响应
```json
{
"success": true,
"data": {
"items": [
{ "id": 1, "name": "项目1" },
{ "id": 2, "name": "项目2" }
],
"pagination": {
"page": 1,
"pageSize": 10,
"total": 100,
"totalPages": 10,
"hasNext": true,
"hasPrev": false
}
},
"message": "获取成功"
}
```
### 验证错误响应
```json
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "参数验证失败",
"details": [
{
"field": "email",
"message": "邮箱格式不正确"
},
{
"field": "password",
"message": "密码长度必须大于6位"
}
]
}
}
```
---
## 🔑 认证与授权规范
### JWT认证
**1. 登录获取Token**
```http
POST /api/v1/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password123"
}
# Response
{
"success": true,
"data": {
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresIn": 604800, // 7
"user": {
"id": 123,
"email": "user@example.com",
"name": "",
"role": "user"
}
}
}
```
**2. 使用Token访问API**
```http
GET /api/v1/literature/projects
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
```
**3. Token过期处理**
```http
# Token401
{
"success": false,
"error": {
"code": "TOKEN_EXPIRED",
"message": "Token"
}
}
# 使refreshToken
POST /api/v1/auth/refresh
Content-Type: application/json
{
"refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
```
### 权限控制
| 端点类型 | 需要认证 | 角色要求 |
|---------|---------|---------|
| 公开端点 | ❌ | 无 |
| 用户端点 | ✅ | user |
| 管理端点 | ✅ | admin |
**示例:**
```typescript
// 公开端点(无需认证)
POST /api/v1/auth/login
POST /api/v1/auth/register
// 用户端点需要认证user角色
GET /api/v1/literature/projects
POST /api/v1/literature/projects
// 管理端点需要认证admin角色
GET /api/v1/admin/users
POST /api/v1/admin/users/:id/disable
```
---
## 📄 分页规范
### 请求参数
```
GET /api/v1/literature/projects?page=1&pageSize=20&sortBy=createdAt&sortOrder=desc
Query参数
- page: 页码默认1
- pageSize: 每页数量默认10最大100
- sortBy: 排序字段默认createdAt
- sortOrder: 排序方向asc/desc默认desc
```
### 响应格式
```json
{
"success": true,
"data": {
"items": [...],
"pagination": {
"page": 1,
"pageSize": 20,
"total": 100,
"totalPages": 5,
"hasNext": true,
"hasPrev": false
}
}
}
```
---
## 🔍 筛选与搜索规范
### 筛选参数
```
GET /api/v1/literature/projects?status=active&keyword=骨质疏松
Query参数
- status: 状态筛选active/inactive
- keyword: 关键词搜索搜索name和description字段
- userId: 用户ID筛选管理端
- startDate/endDate: 日期范围筛选
```
### 搜索响应
```json
{
"success": true,
"data": {
"items": [...],
"pagination": {...},
"filters": {
"status": "active",
"keyword": "骨质疏松"
}
}
}
```
---
## ⚠️ 错误码设计
### 标准错误码
| 错误码 | HTTP状态 | 说明 |
|--------|---------|------|
| `VALIDATION_ERROR` | 422 | 参数验证失败 |
| `UNAUTHORIZED` | 401 | 未认证 |
| `TOKEN_EXPIRED` | 401 | Token过期 |
| `FORBIDDEN` | 403 | 无权限 |
| `NOT_FOUND` | 404 | 资源不存在 |
| `ALREADY_EXISTS` | 409 | 资源已存在 |
| `QUOTA_EXCEEDED` | 429 | 配额超限 |
| `INTERNAL_ERROR` | 500 | 服务器错误 |
### 业务错误码
```typescript
// 模块特定错误码(前缀区分)
ASL_IMPORT_FAILED // AI文献导入失败
ASL_SCREENING_IN_PROGRESS // AI文献筛选进行中
PKB_QUOTA_EXCEEDED // 知识库:配额超限
LLM_QUOTA_EXCEEDED // LLM配额超限
```
---
## 🚀 性能优化规范
### 1. 分页必须
```
所有列表接口必须支持分页:
- 默认pageSize=10
- 最大pageSize=100
- 禁止一次性返回全部数据
```
### 2. 字段过滤
```
GET /api/v1/users/me?fields=id,name,email
只返回需要的字段,减少数据传输
```
### 3. 缓存策略
```http
#
Cache-Control: public, max-age=300
# 使ETag
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
# 304 Not Modified
```
---
## ✅ 检查清单
**设计新API时必须检查**
- [ ] URL符合RESTful规范使用名词+复数)
- [ ] 使用正确的HTTP方法GET/POST/PUT/DELETE
- [ ] 使用正确的HTTP状态码
- [ ] 响应格式符合统一规范success + data/error
- [ ] 需要认证的接口检查JWT Token
- [ ] 需要权限的接口检查用户角色
- [ ] 列表接口支持分页
- [ ] 列表接口支持排序
- [ ] 错误响应包含明确的错误码和错误信息
- [ ] 所有API都有文档说明
---
## 🔗 相关文档
**总览:**
- [API路由总览](./04-API路由总览.md) ⭐ 查看所有API端点
**模板:**
- [API设计模板](../_templates/API设计-模板.md)
**各模块设计:**
- [平台基础层](../01-平台基础层/README.md)
- [通用能力层](../02-通用能力层/README.md)
- [业务模块层](../03-业务模块/README.md)
---
**最后更新:** 2025-11-06
**维护人:** 技术架构师
**版本:** v2.0

View File

@@ -0,0 +1,349 @@
# 数据库全局视图
> **目的:** 提供所有Schema和表的快速索引便于查找和理解全局数据架构
> **详细设计:** 请查看各模块的 `01-数据库设计.md`
> **数据库:** PostgreSQL 15+
> **最后更新:** 2025-11-06
---
## 📊 Schema划分策略
### Schema隔离原则 ⭐
**为什么需要Schema隔离**
1.**模块独立性**每个业务模块有独立的Schema
2.**支持独立部署**:可以单独导出某个模块的数据
3.**权限隔离**可以为不同Schema设置不同权限
4.**避免命名冲突**:不同模块可以有相同的表名
**Schema命名规范**
```
platform_schema # 平台基础层(全局共享)
aia_schema # AI智能问答
asl_schema # AI智能文献
pkb_schema # 个人知识库
dc_schema # 数据清洗整理
ssa_schema # 智能统计分析
st_schema # 统计分析工具
rvw_schema # 稿件审查系统
admin_schema # 运营管理端可选可合并到platform_schema
```
---
## 📋 Schema一览表
| Schema | 说明 | 表数量 | 状态 | 详细设计 |
|--------|------|--------|------|---------|
| **platform_schema** | 平台基础层 | ~15个 | ✅ 使用中 | [查看](#platform_schema-平台基础层) |
| **aia_schema** | AI智能问答 | ~8个 | ✅ 使用中 | [查看](#aia_schema-ai智能问答) |
| **pkb_schema** | 个人知识库 | ~5个 | ✅ 使用中 | [查看](#pkb_schema-个人知识库) |
| **rvw_schema** | 稿件审查系统 | ~6个 | ✅ 使用中 | [查看](#rvw_schema-稿件审查系统) |
| **asl_schema** | AI智能文献 | ~10个 | ⏳ 设计中 | [ASL/01-数据库设计](../03-业务模块/ASL-AI智能文献/01-数据库设计.md) |
| **dc_schema** | 数据清洗整理 | ~8个 | ⏳ 规划中 | 待设计 |
| **ssa_schema** | 智能统计分析 | ~10个 | ⏳ 规划中 | 待设计 |
| **st_schema** | 统计分析工具 | ~5个 | ⏳ 规划中 | 待设计 |
**总表数:** ~70个预估
---
## 🔍 platform_schema平台基础层
**职责:** 存储全局共享的平台数据,所有业务模块都依赖
**详细设计:** [UAM/01-数据库设计](../01-平台基础层/01-用户与权限中心(UAM)/01-数据库设计.md)
### 核心表(用户与权限)
| 表名 | 说明 | 记录数预估 | 详细设计 |
|------|------|-----------|---------|
| **users** | 用户基础信息 | 10万/年 | [UAM/01-数据库设计](../01-平台基础层/01-用户与权限中心(UAM)/01-数据库设计.md) |
| **roles** | 角色定义 | <100 | 同上 |
| **permissions** | 权限定义 | <500 | 同上 |
| **user_roles** | 用户-角色关联 | 10万/年 | 同上 |
| **feature_flags** | Feature Flag配置 ⭐ | <100 | 同上 |
| **user_feature_flags** | 用户-Feature Flag关联 ⭐ | 10万/年 | 同上 |
### LLM相关表
| 表名 | 说明 | 记录数预估 | 详细设计 |
|------|------|-----------|---------|
| **llm_models** | LLM模型配置 | <20 | [LLM网关/01-数据库设计](../02-通用能力层/01-LLM大模型网关/01-数据库设计.md) |
| **llm_usage** | LLM使用记录 ⭐ | 1000万/年 | 同上 |
| **llm_quotas** | LLM配额管理 | 10万/年 | 同上 |
### 监控与日志
| 表名 | 说明 | 记录数预估 | 详细设计 |
|------|------|-----------|---------|
| **admin_logs** | 管理员操作日志 | 10万/年 | [监控与日志/01-数据库设计](../01-平台基础层/04-监控与日志/01-数据库设计.md) |
| **error_logs** | 错误日志 | 100万/年 | 同上 |
| **audit_logs** | 审计日志 | 100万/年 | 同上 |
### 系统配置
| 表名 | 说明 | 记录数预估 | 详细设计 |
|------|------|-----------|---------|
| **system_configs** | 系统配置 | <100 | [系统配置/01-数据库设计](../01-平台基础层/05-系统配置/01-数据库设计.md) |
| **prompt_templates** | Prompt模板 | <500 | 同上 |
| **announcements** | 系统公告 | <1000 | 同上 |
---
## 🤖 aia_schemaAI智能问答
**职责:** 存储AI智能问答相关数据12个智能体、对话历史
**状态:** ✅ 已实现
**详细设计:** [AIA/01-数据库设计](../03-业务模块/AIA-AI智能问答/01-数据库设计.md)(待创建)
### 核心表
| 表名 | 说明 | 记录数预估 |
|------|------|-----------|
| **conversations** | 对话会话 | 100万/年 |
| **messages** | 对话消息 | 1000万/年 |
| **agents** | 智能体配置 | <20 |
| **conversation_contexts** | 对话上下文 | 100万/年 |
---
## 📚 pkb_schema个人知识库
**职责:** 存储个人知识库、文档、RAG问答相关数据
**状态:** ✅ 已实现
**详细设计:** [PKB/01-数据库设计](../03-业务模块/PKB-个人知识库/01-数据库设计.md)(待创建)
### 核心表
| 表名 | 说明 | 记录数预估 |
|------|------|-----------|
| **knowledge_bases** | 知识库 | 30万/年 |
| **documents** | 文档 | 300万/年 |
| **document_chunks** | 文档分块(向量化) | 3000万/年 |
| **kb_conversations** | 知识库对话 | 100万/年 |
| **kb_messages** | 知识库对话消息 | 1000万/年 |
---
## 📄 rvw_schema稿件审查系统
**职责:** 存储稿件审查、评估报告相关数据
**状态:** ✅ 已实现(独立系统)
**详细设计:** [RVW/01-数据库设计](../03-业务模块/RVW-稿件审查系统/01-数据库设计.md)(待创建)
### 核心表
| 表名 | 说明 | 记录数预估 |
|------|------|-----------|
| **review_tasks** | 审查任务 | 10万/年 |
| **manuscripts** | 稿件信息 | 10万/年 |
| **review_results** | 审查结果 | 10万/年 |
| **methodology_assessments** | 方法学评估 | 10万/年 |
| **guideline_assessments** | 稿约规范性评估 | 10万/年 |
---
## 📖 asl_schemaAI智能文献
**职责:** 存储文献筛选、提取、分析相关数据
**状态:** ⏳ 设计中P0优先级
**详细设计:** [ASL/01-数据库设计](../03-业务模块/ASL-AI智能文献/01-数据库设计.md)
### 核心表(预览)
| 表名 | 说明 | 记录数预估 |
|------|------|-----------|
| **literature_projects** | 文献项目 | 10万/年 |
| **literature_items** | 文献条目 | 1000万/年 |
| **pico_configs** | PICO纳入排除标准 | 10万/年 |
| **screening_results** | 筛选结果 | 1000万/年 |
| **screening_history** | 筛选历史(可回溯) | 1000万/年 |
| **extraction_tasks** | 提取任务 | 100万/年 |
| **extraction_results** | 提取结果 | 100万/年 |
---
## 🧹 dc_schema数据清洗整理
**职责:** 存储数据清洗任务、ETL配置、NER结果
**状态:** ⏳ 规划中P1优先级
**详细设计:** 待设计
### 核心表(预览)
| 表名 | 说明 | 记录数预估 |
|------|------|-----------|
| **cleaning_projects** | 清洗项目 | 10万/年 |
| **data_sources** | 数据源 | 100万/年 |
| **etl_configs** | ETL配置 | 10万/年 |
| **ner_tasks** | NER任务 | 100万/年 |
| **ner_results** | NER结果 | 1000万/年 |
---
## 🔗 跨Schema依赖关系
### 依赖规则 ⭐ 重要
**允许的依赖:**
```
✅ 业务模块 → platform_schema允许外键
✅ 通用能力 → platform_schema允许外键
❌ 业务模块之间(禁止直接依赖)
❌ platform_schema → 业务模块(反向依赖)
```
### 依赖关系图
```
platform_schema.users (1)
↓ (N) 所有业务模块都依赖用户表
├── aia_schema.conversations
├── asl_schema.literature_projects
├── pkb_schema.knowledge_bases
├── dc_schema.cleaning_projects
├── ssa_schema.analysis_projects
├── st_schema.tool_usage
└── rvw_schema.review_tasks
platform_schema.llm_usage (独立)
- 记录所有模块的LLM调用
- 通过module字段区分'AIA', 'ASL', 'PKB'等
```
### 外键示例
```sql
-- ✅ 允许业务模块引用platform_schema
CREATE TABLE asl_schema.literature_projects (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES platform_schema.users(id) ON DELETE CASCADE
);
-- ❌ 禁止:业务模块之间互相引用
CREATE TABLE ssa_schema.analysis_projects (
id SERIAL PRIMARY KEY,
-- 错误:不能引用其他业务模块
literature_project_id INTEGER REFERENCES asl_schema.literature_projects(id)
);
-- ✅ 正确做法通过user_id关联
-- 在应用层处理跨模块关联,不在数据库层
```
---
## 📊 数据量统计(预估)
### 按Schema统计
| Schema | 表数量 | 年增长记录数 | 存储预估5年 |
|--------|--------|------------|---------------|
| platform_schema | 15 | 1000万 | 50GB |
| aia_schema | 8 | 1100万 | 30GB |
| pkb_schema | 5 | 3300万 | 200GB向量 |
| rvw_schema | 6 | 50万 | 5GB |
| asl_schema | 10 | 2100万 | 50GB |
| dc_schema | 8 | 1100万 | 100GB |
| ssa_schema | 10 | 500万 | 50GB |
| st_schema | 5 | 100万 | 10GB |
| **总计** | **~70** | **~4000万/年** | **~500GB5年** |
### 大表监控(年增长>100万
| 表名 | Schema | 年增长 | 索引策略 |
|------|--------|--------|---------|
| llm_usage | platform | 1000万 | 按月分区 |
| messages | aia | 1000万 | 按created_at索引 |
| document_chunks | pkb | 3000万 | 向量索引 |
| literature_items | asl | 1000万 | 按project_id索引 |
| screening_results | asl | 1000万 | 复合索引 |
---
## 🔍 快速查找指南
### 场景1我要开发某个模块
1. 在上面的表格中找到对应的Schema
2. 点击"详细设计"链接
3. 查看该模块的完整表结构
### 场景2我要查看某个表的结构
1. 先确定表属于哪个Schema根据功能判断
2. 转到对应模块的数据库设计文档
3. 搜索表名
### 场景3我要设计跨模块功能
1. 查看本文档的"跨Schema依赖关系"
2. 遵循依赖规则
3. 在应用层处理跨模块关联,不在数据库层
### 场景4我要查看全局数据架构
1. 阅读本文档快速了解所有Schema
2. 查看[架构设计全景图](../00-系统总体设计/08-架构设计全景图.md)
---
## ⚠️ 重要提醒
### Schema隔离的注意事项
**✅ 正确做法:**
- 业务模块只引用 `platform_schema.users`
- 跨模块数据关联在应用层处理
- 使用 `user_id + 业务ID` 的方式
**❌ 错误做法:**
- 业务模块之间直接外键关联
-`platform_schema` 中存储业务数据
- 不同模块使用相同的表名虽然Schema隔离了但容易混淆
### 性能优化建议
1. **大表必须分页查询**(如 `llm_usage``messages`
2. **热点字段必须加索引**(如 `user_id``created_at`
3. **考虑表分区**(按月/按年,如 `llm_usage`
4. **定期归档历史数据**如1年前的日志
---
## 🔗 相关文档
**规范:**
- [数据库设计规范](./01-数据库设计规范.md) ⭐ 必读
- [数据库架构说明](../00-系统总体设计/03-数据库架构说明.md)
**模块设计:**
- [平台基础层](../01-平台基础层/README.md)
- [通用能力层](../02-通用能力层/README.md)
- [业务模块层](../03-业务模块/README.md)
**模板:**
- [数据库设计模板](../_templates/数据库设计-模板.md)
---
**最后更新:** 2025-11-06
**维护人:** 技术架构师
**版本:** v1.0

View File

@@ -0,0 +1,393 @@
# API路由总览
> **目的:** 提供所有API端点的快速索引便于查找和避免路由冲突
> **详细设计:** 请查看各模块的 `02-API设计.md`
> **基础URL** `http://localhost:3001/api/v1`
> **最后更新:** 2025-11-06
---
## 📋 路由命名规范
### 路径格式
```
/api/v{version}/{module}/{resource}/{id?}/{action?}
示例:
/api/v1/literature/projects # 获取文献项目列表
/api/v1/literature/projects/123 # 获取ID=123的项目
/api/v1/literature/projects/123/export # 导出项目
```
### 模块名称规范
| 模块代码 | 路由前缀 | 说明 |
|---------|---------|------|
| 平台基础层 | `/auth`, `/users`, `/admin` | 认证、用户、管理 |
| LLM网关 | `/llm` | LLM调用 |
| AIA | `/chat`, `/agents` | AI智能问答 |
| ASL | `/literature` | AI智能文献 |
| PKB | `/knowledge-bases`, `/kb` | 个人知识库 |
| DC | `/data-cleaning` | 数据清洗 |
| SSA | `/analysis` | 智能统计分析 |
| ST | `/tools` | 统计工具 |
| RVW | `/review` | 稿件审查 |
| ADMIN | `/admin` | 运营管理端 |
---
## 🔐 认证与用户管理(/api/v1/auth, /api/v1/users
**状态:** ✅ 已实现
**详细设计:** [UAM/02-API设计](../01-平台基础层/01-用户与权限中心(UAM)/02-API设计.md)(待创建)
### 认证相关
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/auth/register` | POST | 用户注册 | ❌ |
| `/api/v1/auth/login` | POST | 用户登录 | ❌ |
| `/api/v1/auth/logout` | POST | 用户登出 | ✅ |
| `/api/v1/auth/refresh` | POST | 刷新Token | ✅ |
| `/api/v1/auth/profile` | GET | 获取当前用户信息 | ✅ |
| `/api/v1/auth/profile` | PUT | 更新当前用户信息 | ✅ |
### 用户管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/users` | GET | 用户列表(分页) | ✅ ADMIN |
| `/api/v1/users/:id` | GET | 用户详情 | ✅ ADMIN |
| `/api/v1/users/:id` | PUT | 更新用户 | ✅ ADMIN |
| `/api/v1/users/:id` | DELETE | 删除用户 | ✅ ADMIN |
---
## 🤖 LLM大模型网关/api/v1/llm
**状态:** ❌ 待实现P0优先级
**详细设计:** [LLM网关/02-API设计](../02-通用能力层/01-LLM大模型网关/02-API设计.md)
### LLM调用
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/llm/chat` | POST | LLM对话非流式 | ✅ |
| `/api/v1/llm/chat/stream` | POST | LLM对话流式SSE | ✅ |
| `/api/v1/llm/quota` | GET | 查询当前用户配额 | ✅ |
| `/api/v1/llm/usage` | GET | 查询使用统计 | ✅ |
| `/api/v1/llm/models` | GET | 获取可用模型列表 | ✅ |
---
## 💬 AI智能问答/api/v1/chat, /api/v1/agents
**状态:** ✅ 已实现
**详细设计:** [AIA/02-API设计](../03-业务模块/AIA-AI智能问答/02-API设计.md)(待创建)
### 对话管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/chat/conversations` | GET | 对话列表 | ✅ |
| `/api/v1/chat/conversations` | POST | 创建对话 | ✅ |
| `/api/v1/chat/conversations/:id` | GET | 对话详情 | ✅ |
| `/api/v1/chat/conversations/:id` | DELETE | 删除对话 | ✅ |
| `/api/v1/chat/conversations/:id/messages` | GET | 对话消息列表 | ✅ |
| `/api/v1/chat/conversations/:id/messages` | POST | 发送消息 | ✅ |
### 智能体管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/agents` | GET | 智能体列表12个 | ✅ |
| `/api/v1/agents/:id` | GET | 智能体详情 | ✅ |
---
## 📖 AI智能文献/api/v1/literature
**状态:** ⏳ 设计中P0优先级
**详细设计:** [ASL/02-API设计](../03-业务模块/ASL-AI智能文献/02-API设计.md)
### 项目管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/literature/projects` | GET | 文献项目列表 | ✅ |
| `/api/v1/literature/projects` | POST | 创建文献项目 | ✅ |
| `/api/v1/literature/projects/:id` | GET | 项目详情 | ✅ |
| `/api/v1/literature/projects/:id` | PUT | 更新项目 | ✅ |
| `/api/v1/literature/projects/:id` | DELETE | 删除项目 | ✅ |
### 文献筛选(标题摘要初筛)⭐
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/literature/projects/:id/items/import` | POST | 导入CSV文件 | ✅ |
| `/api/v1/literature/projects/:id/pico` | POST | 配置PICO标准 | ✅ |
| `/api/v1/literature/projects/:id/pico` | GET | 获取PICO配置 | ✅ |
| `/api/v1/literature/projects/:id/screening/title` | POST | 执行标题摘要初筛 | ✅ |
| `/api/v1/literature/projects/:id/screening/status` | GET | 查询筛选进度 | ✅ |
| `/api/v1/literature/projects/:id/screening/results` | GET | 获取筛选结果 | ✅ |
| `/api/v1/literature/projects/:id/screening/export` | POST | 导出Excel | ✅ |
### 文献筛选(全文复筛)
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/literature/projects/:id/screening/fulltext` | POST | 执行全文筛选 | ✅ |
| `/api/v1/literature/projects/:id/screening/fulltext/status` | GET | 查询进度 | ✅ |
---
## 📚 个人知识库(/api/v1/knowledge-bases
**状态:** ✅ 已实现
**详细设计:** [PKB/02-API设计](../03-业务模块/PKB-个人知识库/02-API设计.md)(待创建)
### 知识库管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/knowledge-bases` | GET | 知识库列表 | ✅ |
| `/api/v1/knowledge-bases` | POST | 创建知识库 | ✅ |
| `/api/v1/knowledge-bases/:id` | GET | 知识库详情 | ✅ |
| `/api/v1/knowledge-bases/:id` | PUT | 更新知识库 | ✅ |
| `/api/v1/knowledge-bases/:id` | DELETE | 删除知识库 | ✅ |
### 文档管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/knowledge-bases/:id/documents` | GET | 文档列表 | ✅ |
| `/api/v1/knowledge-bases/:id/documents` | POST | 上传文档 | ✅ |
| `/api/v1/knowledge-bases/:id/documents/:docId` | GET | 文档详情 | ✅ |
| `/api/v1/knowledge-bases/:id/documents/:docId` | DELETE | 删除文档 | ✅ |
### RAG问答
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/knowledge-bases/:id/chat` | POST | 知识库问答 | ✅ |
| `/api/v1/knowledge-bases/:id/search` | GET | 语义检索 | ✅ |
---
## 🧹 数据清洗整理(/api/v1/data-cleaning
**状态:** ⏳ 规划中P1优先级
**详细设计:** 待设计
### 清洗项目
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/data-cleaning/projects` | GET | 清洗项目列表 | ✅ |
| `/api/v1/data-cleaning/projects` | POST | 创建清洗项目 | ✅ |
| `/api/v1/data-cleaning/projects/:id` | GET | 项目详情 | ✅ |
### ETL配置
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/data-cleaning/projects/:id/etl` | POST | 配置ETL规则 | ✅ |
| `/api/v1/data-cleaning/projects/:id/execute` | POST | 执行清洗任务 | ✅ |
---
## 📊 智能统计分析(/api/v1/analysis
**状态:** ⏳ 规划中P2优先级
**详细设计:** 待设计
### 分析项目
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/analysis/projects` | GET | 分析项目列表 | ✅ |
| `/api/v1/analysis/projects` | POST | 创建分析项目 | ✅ |
| `/api/v1/analysis/projects/:id/execute` | POST | 执行分析 | ✅ |
---
## 🔧 统计分析工具(/api/v1/tools
**状态:** ⏳ 规划中P2优先级
**详细设计:** 待设计
### 工具调用
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/tools` | GET | 工具列表100+ | ✅ |
| `/api/v1/tools/:id` | GET | 工具详情 | ✅ |
| `/api/v1/tools/:id/execute` | POST | 执行工具 | ✅ |
---
## 📄 稿件审查系统(/api/v1/review
**状态:** ✅ 已实现(独立系统)
**详细设计:** [RVW/02-API设计](../03-业务模块/RVW-稿件审查系统/02-API设计.md)(待创建)
### 审查任务
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/review/tasks` | GET | 审查任务列表 | ✅ |
| `/api/v1/review/tasks` | POST | 创建审查任务 | ✅ |
| `/api/v1/review/tasks/:id` | GET | 任务详情 | ✅ |
| `/api/v1/review/tasks/:id/execute` | POST | 执行审查 | ✅ |
| `/api/v1/review/tasks/:id/report` | GET | 生成报告PDF | ✅ |
---
## 🛠️ 运营管理端(/api/v1/admin
**状态:** ⏳ 规划中P1优先级
**详细设计:** [ADMIN/02-API设计](../03-业务模块/ADMIN-运营管理端/02-API设计.md)
### 用户管理 ⭐
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/admin/users` | GET | 用户列表 | ✅ ADMIN |
| `/api/v1/admin/users/:id` | GET | 用户详情 | ✅ ADMIN |
| `/api/v1/admin/users/:id` | PUT | 更新用户 | ✅ ADMIN |
| `/api/v1/admin/users/:id/plan` | PUT | 修改套餐 | ✅ ADMIN |
| `/api/v1/admin/users/:id/disable` | POST | 禁用用户 | ✅ ADMIN |
### Feature Flag管理 ⭐
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/admin/feature-flags` | GET | Flag列表 | ✅ ADMIN |
| `/api/v1/admin/feature-flags` | POST | 创建Flag | ✅ ADMIN |
| `/api/v1/admin/feature-flags/:id` | PUT | 更新Flag | ✅ ADMIN |
| `/api/v1/admin/users/:id/flags` | GET | 用户Flag | ✅ ADMIN |
| `/api/v1/admin/users/:id/flags` | PUT | 更新用户Flag | ✅ ADMIN |
### LLM模型管理 ⭐
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/admin/llm/models` | GET | 模型列表 | ✅ ADMIN |
| `/api/v1/admin/llm/models` | POST | 添加模型 | ✅ ADMIN |
| `/api/v1/admin/llm/models/:id` | PUT | 更新模型 | ✅ ADMIN |
| `/api/v1/admin/llm/usage` | GET | LLM使用统计 | ✅ ADMIN |
| `/api/v1/admin/llm/cost-analysis` | GET | 成本分析 | ✅ ADMIN |
### Prompt管理
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/admin/prompts` | GET | Prompt列表 | ✅ ADMIN |
| `/api/v1/admin/prompts` | POST | 创建Prompt | ✅ ADMIN |
| `/api/v1/admin/prompts/:id` | PUT | 更新Prompt | ✅ ADMIN |
### 日志查询
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/admin/logs` | GET | 日志列表 | ✅ ADMIN |
| `/api/v1/admin/logs/errors` | GET | 错误日志 | ✅ ADMIN |
| `/api/v1/admin/logs/operations` | GET | 操作日志 | ✅ ADMIN |
### 数据报表
| 端点 | 方法 | 说明 | 认证 |
|------|------|------|------|
| `/api/v1/admin/reports/overview` | GET | 总览数据 | ✅ ADMIN |
| `/api/v1/admin/reports/users` | GET | 用户活跃度 | ✅ ADMIN |
| `/api/v1/admin/reports/features` | GET | 功能使用率 | ✅ ADMIN |
| `/api/v1/admin/reports/llm` | GET | LLM统计 | ✅ ADMIN |
---
## 📊 路由统计
### 按模块统计
| 模块 | 端点数量 | 状态 |
|------|---------|------|
| 认证与用户 | 10 | ✅ 已实现 |
| LLM网关 | 5 | ❌ 待实现 |
| AI智能问答 | 8 | ✅ 已实现 |
| AI智能文献 | 15 | ⏳ 设计中 |
| 个人知识库 | 10 | ✅ 已实现 |
| 数据清洗 | 5 | ⏳ 规划中 |
| 智能统计分析 | 3 | ⏳ 规划中 |
| 统计工具 | 3 | ⏳ 规划中 |
| 稿件审查 | 5 | ✅ 已实现 |
| 运营管理端 | 20 | ⏳ 规划中 |
| **总计** | **~85** | - |
---
## ⚠️ 路由冲突检查
### 潜在冲突
**❌ 避免冲突:**
```
# 错误:模块名称冲突
/api/v1/admin/users # 管理端的用户管理
/api/v1/users # 平台层的用户管理
# 正确:明确区分
/api/v1/auth/profile # 当前用户信息
/api/v1/admin/users # 管理端用户CRUD
```
---
## 🔍 快速查找指南
### 场景1查找某个模块的所有API
1. 在上面的表格中找到对应模块
2. 点击"详细设计"链接
3. 查看该模块的完整API文档
### 场景2设计新API端点
1. 查看本文档,确保路由不冲突
2. 参考[API设计规范](./02-API设计规范.md)
3. 使用[API设计模板](../_templates/API设计-模板.md)
### 场景3查看全局API架构
1. 阅读本文档(快速了解所有端点)
2. 查看[架构设计全景图](../00-系统总体设计/08-架构设计全景图.md)
---
## 🔗 相关文档
**规范:**
- [API设计规范](./02-API设计规范.md) ⭐ 必读
- [认证与授权规范](./02-API设计规范.md#认证与授权)
**模板:**
- [API设计模板](../_templates/API设计-模板.md)
**数据库:**
- [数据库全局视图](./03-数据库全局视图.md)
---
**最后更新:** 2025-11-06
**维护人:** 技术架构师
**版本:** v1.0

View File

@@ -0,0 +1,827 @@
# 代码规范
> **版本:** v1.0
> **创建日期:** 2025-10-10
> **适用范围:** 前端React/TypeScript+ 后端Node.js/TypeScript
---
## 📋 目录
1. [通用规范](#通用规范)
2. [TypeScript规范](#typescript规范)
3. [React规范](#react规范)
4. [Node.js后端规范](#nodejs后端规范)
5. [命名规范](#命名规范)
6. [注释规范](#注释规范)
7. [Git提交规范](#git提交规范)
---
## 通用规范
### 代码风格
- ✅ 使用ESLint和Prettier统一代码风格
- ✅ 缩进2个空格
- ✅ 字符串:优先使用单引号 `'`
- ✅ 行尾:不加分号(除非必要)
- ✅ 单行最大长度100字符
- ✅ 使用尾随逗号(对象、数组)
### 文件组织
- ✅ 一个文件一个组件/类
- ✅ 相关文件放在同一目录
- ✅ 使用barrel exportsindex.ts
- ✅ 测试文件与源文件同目录
```
src/
├── components/
│ ├── Button/
│ │ ├── Button.tsx
│ │ ├── Button.test.tsx
│ │ ├── Button.styles.ts
│ │ └── index.ts # export { Button } from './Button'
```
### 代码注释
- ✅ 复杂逻辑必须注释
- ✅ 公共API必须注释
- ✅ 避免无用注释
- ✅ 使用JSDoc格式
---
## TypeScript规范
### 类型定义
**✅ 推荐:**
```typescript
// 使用interface定义对象结构
interface User {
id: string
email: string
name?: string
}
// 使用type定义联合类型
type Status = 'active' | 'inactive' | 'suspended'
// 使用enum定义常量集合
enum UserRole {
USER = 'user',
ADMIN = 'admin',
}
```
**❌ 避免:**
```typescript
// 不要使用any
function process(data: any) { // ❌
// ...
}
// 应该明确类型
function process(data: ProcessData) { // ✅
// ...
}
```
### 类型导入导出
```typescript
// types.ts
export interface Project {
id: string
name: string
description: string
}
export type ProjectStatus = 'active' | 'archived'
// project.service.ts
import type { Project, ProjectStatus } from './types'
```
### 严格模式
```json
// tsconfig.json
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true
}
}
```
---
## React规范
### 组件定义
**✅ 推荐:函数组件 + Hooks**
```tsx
import { useState } from 'react'
interface ButtonProps {
label: string
onClick: () => void
variant?: 'primary' | 'secondary'
disabled?: boolean
}
export function Button({
label,
onClick,
variant = 'primary',
disabled = false
}: ButtonProps) {
const [isLoading, setIsLoading] = useState(false)
const handleClick = async () => {
setIsLoading(true)
try {
await onClick()
} finally {
setIsLoading(false)
}
}
return (
<button
onClick={handleClick}
disabled={disabled || isLoading}
className={`btn btn-${variant}`}
>
{isLoading ? 'Loading...' : label}
</button>
)
}
```
**❌ 避免:类组件**
```tsx
// 除非有特殊需求,否则不使用类组件
class Button extends React.Component { ... } // ❌
```
### Hooks规范
**✅ 推荐自定义Hooks**
```typescript
// useProjects.ts
import { useState, useEffect } from 'react'
import { projectService } from '@/services'
import type { Project } from '@/types'
export function useProjects() {
const [projects, setProjects] = useState<Project[]>([])
const [loading, setLoading] = useState(false)
const [error, setError] = useState<Error | null>(null)
useEffect(() => {
loadProjects()
}, [])
const loadProjects = async () => {
setLoading(true)
setError(null)
try {
const data = await projectService.getProjects()
setProjects(data)
} catch (err) {
setError(err as Error)
} finally {
setLoading(false)
}
}
return { projects, loading, error, reload: loadProjects }
}
// 使用
function ProjectList() {
const { projects, loading, error } = useProjects()
if (loading) return <Loading />
if (error) return <Error message={error.message} />
return (
<ul>
{projects.map(project => (
<li key={project.id}>{project.name}</li>
))}
</ul>
)
}
```
### 组件组织
```tsx
// ✅ 推荐的组件结构
import { useState, useEffect, useMemo, useCallback } from 'react'
import { useNavigate } from 'react-router-dom'
import { SomeComponent } from '@/components'
import { useCustomHook } from '@/hooks'
import type { SomeType } from '@/types'
interface ComponentProps {
// props定义
}
export function Component({ prop1, prop2 }: ComponentProps) {
// 1. Hooks
const navigate = useNavigate()
const [state, setState] = useState()
const { data } = useCustomHook()
// 2. 派生状态useMemo
const computedValue = useMemo(() => {
return heavyComputation(data)
}, [data])
// 3. 事件处理useCallback
const handleClick = useCallback(() => {
// 处理逻辑
}, [])
// 4. Effects
useEffect(() => {
// 副作用
}, [])
// 5. 早期返回Loading/Error
if (!data) return <Loading />
// 6. 渲染
return (
<div>
{/* JSX */}
</div>
)
}
```
### 条件渲染
**✅ 推荐:**
```tsx
// 简单条件:使用 &&
{isLoggedIn && <UserMenu />}
// if-else使用三元运算符
{isLoggedIn ? <UserMenu /> : <LoginButton />}
// 多条件:提取为函数或组件
function renderContent() {
if (loading) return <Loading />
if (error) return <Error />
if (data.length === 0) return <Empty />
return <DataList data={data} />
}
return <div>{renderContent()}</div>
```
**❌ 避免:**
```tsx
// 避免复杂的嵌套三元运算符
{condition1 ? (
condition2 ? <A /> : <B />
) : (
condition3 ? <C /> : <D />
)} // ❌ 难以理解
```
---
## Node.js后端规范
### 文件组织
```
backend/src/
├── routes/ # 路由定义
│ ├── auth.routes.ts
│ └── project.routes.ts
├── services/ # 业务逻辑
│ ├── auth.service.ts
│ └── project.service.ts
├── controllers/ # 控制器(可选)
├── models/ # Prisma模型
├── utils/ # 工具函数
├── config/ # 配置加载
├── types/ # 类型定义
└── server.ts # 入口文件
```
### 路由定义
```typescript
// routes/project.routes.ts
import { FastifyInstance } from 'fastify'
import { projectService } from '../services/project.service'
import { authMiddleware } from '../middleware/auth'
export async function projectRoutes(server: FastifyInstance) {
// 获取项目列表
server.get(
'/api/v1/projects',
{
preHandler: [authMiddleware],
schema: {
querystring: {
type: 'object',
properties: {
page: { type: 'number' },
pageSize: { type: 'number' },
},
},
},
},
async (request, reply) => {
const { page = 1, pageSize = 20 } = request.query as any
const userId = request.user.id
const result = await projectService.getProjects(userId, {
page,
pageSize,
})
return reply.send({
success: true,
data: result,
})
}
)
// 创建项目
server.post(
'/api/v1/projects',
{
preHandler: [authMiddleware],
schema: {
body: {
type: 'object',
required: ['name', 'description'],
properties: {
name: { type: 'string', minLength: 1, maxLength: 200 },
description: { type: 'string', minLength: 1 },
},
},
},
},
async (request, reply) => {
const userId = request.user.id
const data = request.body as CreateProjectDto
const project = await projectService.createProject(userId, data)
return reply.code(201).send({
success: true,
data: project,
})
}
)
}
```
### Service层
```typescript
// services/project.service.ts
import { prisma } from '../lib/prisma'
import type { CreateProjectDto, UpdateProjectDto } from '../types'
export class ProjectService {
/**
* 获取用户的项目列表
*/
async getProjects(userId: string, options: PaginationOptions) {
const { page, pageSize } = options
const [items, total] = await Promise.all([
prisma.project.findMany({
where: { userId },
skip: (page - 1) * pageSize,
take: pageSize,
orderBy: { createdAt: 'desc' },
}),
prisma.project.count({ where: { userId } }),
])
return {
items,
pagination: {
page,
pageSize,
total,
totalPages: Math.ceil(total / pageSize),
hasNext: page * pageSize < total,
hasPrev: page > 1,
},
}
}
/**
* 创建项目
*/
async createProject(userId: string, data: CreateProjectDto) {
return prisma.project.create({
data: {
userId,
name: data.name,
description: data.description,
},
})
}
/**
* 更新项目
*/
async updateProject(
userId: string,
projectId: string,
data: UpdateProjectDto
) {
// 验证权限
const project = await prisma.project.findFirst({
where: { id: projectId, userId },
})
if (!project) {
throw new Error('Project not found or unauthorized')
}
return prisma.project.update({
where: { id: projectId },
data,
})
}
/**
* 删除项目
*/
async deleteProject(userId: string, projectId: string) {
// 验证权限
const project = await prisma.project.findFirst({
where: { id: projectId, userId },
})
if (!project) {
throw new Error('Project not found or unauthorized')
}
await prisma.project.delete({
where: { id: projectId },
})
}
}
export const projectService = new ProjectService()
```
### 错误处理
```typescript
// utils/errors.ts
export class AppError extends Error {
constructor(
public code: string,
public message: string,
public statusCode: number = 400,
public details?: any
) {
super(message)
this.name = 'AppError'
}
}
export class ValidationError extends AppError {
constructor(message: string, details?: any) {
super('VALIDATION_ERROR', message, 422, details)
}
}
export class UnauthorizedError extends AppError {
constructor(message: string = 'Unauthorized') {
super('UNAUTHORIZED', message, 401)
}
}
export class NotFoundError extends AppError {
constructor(resource: string) {
super('NOT_FOUND', `${resource} not found`, 404)
}
}
// 使用
async function getProject(id: string) {
const project = await prisma.project.findUnique({ where: { id } })
if (!project) {
throw new NotFoundError('Project')
}
return project
}
```
### 错误处理中间件
```typescript
// middleware/error-handler.ts
import { FastifyError, FastifyReply, FastifyRequest } from 'fastify'
import { AppError } from '../utils/errors'
export async function errorHandler(
error: FastifyError | AppError,
request: FastifyRequest,
reply: FastifyReply
) {
// 记录错误
request.log.error(error)
// 自定义错误
if (error instanceof AppError) {
return reply.code(error.statusCode).send({
success: false,
error: {
code: error.code,
message: error.message,
details: error.details,
},
timestamp: new Date().toISOString(),
})
}
// Prisma错误
if (error.name === 'PrismaClientKnownRequestError') {
// 处理Prisma特定错误
return reply.code(400).send({
success: false,
error: {
code: 'DATABASE_ERROR',
message: 'Database operation failed',
},
timestamp: new Date().toISOString(),
})
}
// 默认错误
return reply.code(500).send({
success: false,
error: {
code: 'INTERNAL_ERROR',
message: 'Internal server error',
},
timestamp: new Date().toISOString(),
})
}
```
---
## 命名规范
### 文件命名
| 类型 | 命名方式 | 示例 |
|------|---------|------|
| React组件 | PascalCase | `Button.tsx`, `ProjectList.tsx` |
| Hooks | camelCase + use前缀 | `useProjects.ts`, `useAuth.ts` |
| 工具函数 | camelCase | `formatDate.ts`, `api.ts` |
| 类型定义 | camelCase + .types | `user.types.ts`, `api.types.ts` |
| 常量 | camelCase + .constants | `routes.constants.ts` |
| 测试文件 | 同源文件 + .test | `Button.test.tsx` |
### 变量命名
```typescript
// ✅ 推荐
const userName = 'John' // camelCase
const USER_ROLE = 'admin' // 常量用UPPER_SNAKE_CASE
const isLoading = false // 布尔值用is/has/can前缀
const hasPermission = true
const canEdit = false
// ❌ 避免
const user_name = 'John' // 不用snake_case
const loading = false // 布尔值缺少is前缀
const x = 10 // 无意义的变量名
```
### 函数命名
```typescript
// ✅ 推荐
function getUser() { } // get: 获取数据
function fetchProjects() { } // fetch: 异步获取
function createProject() { } // create: 创建
function updateProject() { } // update: 更新
function deleteProject() { } // delete: 删除
function handleClick() { } // handle: 事件处理
function validateEmail() { } // validate: 验证
function formatDate() { } // format: 格式化
// ❌ 避免
function data() { } // 不清楚功能
function doSomething() { } // 太模糊
function process() { } // 不明确
```
### 组件命名
```typescript
// ✅ 推荐
<Button /> // 基础组件
<UserProfile /> // 业务组件
<ProjectList /> // 列表组件
<CreateProjectModal /> // 弹窗组件
// ❌ 避免
<button /> // 不用小写
<user_profile /> // 不用snake_case
<ListProjects /> // 动词不要在前
```
---
## 注释规范
### JSDoc注释
```typescript
/**
* 创建新项目
* @param userId - 用户ID
* @param data - 项目数据
* @returns 创建的项目对象
* @throws {ValidationError} 当数据验证失败时
*/
async function createProject(
userId: string,
data: CreateProjectDto
): Promise<Project> {
// 实现...
}
```
### 代码注释
```typescript
// ✅ 好的注释:解释为什么
// 使用setTimeout避免阻塞UI渲染
setTimeout(() => {
processLargeData()
}, 0)
// 等待Dify处理文档最多重试10次
for (let i = 0; i < 10; i++) {
const status = await checkStatus()
if (status === 'completed') break
await sleep(2000)
}
// ❌ 坏的注释:重复代码
// 设置loading为true
setLoading(true)
// 调用API
await api.getData()
```
---
## Git提交规范
### Commit Message格式
```
<type>(<scope>): <subject>
<body>
<footer>
```
### Type类型
| 类型 | 说明 |
|------|------|
| feat | 新功能 |
| fix | Bug修复 |
| docs | 文档更新 |
| style | 代码格式(不影响功能) |
| refactor | 重构 |
| perf | 性能优化 |
| test | 测试相关 |
| chore | 构建/工具变动 |
### 示例
```bash
# 好的提交
git commit -m "feat(auth): 实现用户登录功能"
git commit -m "fix(project): 修复项目删除权限问题"
git commit -m "docs(api): 更新API文档"
git commit -m "refactor(chat): 优化消息组件结构"
# 不好的提交
git commit -m "update" # ❌ 太模糊
git commit -m "fix bug" # ❌ 没有说明是什么bug
git commit -m "完成功能" # ❌ 没有说明是什么功能
```
---
## ESLint配置
```javascript
// .eslintrc.js
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'prettier',
],
rules: {
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
'react/react-in-jsx-scope': 'off',
'react/prop-types': 'off',
},
}
```
---
## Prettier配置
```json
{
"semi": false,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100,
"arrowParens": "avoid"
}
```
---
## 代码Review检查清单
### 功能
- [ ] 功能是否完整实现
- [ ] 是否有遗漏的边界情况
- [ ] 错误处理是否完善
### 代码质量
- [ ] 代码是否易读易理解
- [ ] 是否有重复代码
- [ ] 函数是否过长(建议<50行
- [ ] 是否遵守命名规范
### 性能
- [ ] 是否有性能问题
- [ ] 是否有不必要的重渲染
- [ ] 数据库查询是否优化
### 安全
- [ ] 是否有SQL注入风险
- [ ] 是否有XSS风险
- [ ] 权限验证是否完善
### 测试
- [ ] 是否有单元测试
- [ ] 测试覆盖率是否足够
---
**文档维护:** 规范更新需同步此文档
**最后更新:** 2025-10-10
**维护者:** 技术负责人

View File

@@ -0,0 +1,228 @@
# 04-开发规范
> **目标:** 统一团队开发规范,提高代码质量和协作效率
> **适用范围:** 平台层 + 能力层 + 业务模块层
> **强制等级:** ⭐⭐⭐⭐⭐ 必须遵守
---
## 📋 规范文档列表
### 1. 数据库设计规范 ⭐⭐⭐⭐⭐
**文件:** `01-数据库设计规范.md` ⏳ 待创建(从 `01-设计文档/数据库设计文档.md` 提取)
**核心内容:**
- Schema隔离策略platform_schema、asl_schema等
- 表命名规范(小写+下划线)
- 字段命名规范
- 索引设计规范
- 外键约束规范
- 通用字段created_at、updated_at等
**快速参考:** [数据库全局视图](./03-数据库全局视图.md) ⭐ 已创建
---
### 2. API设计规范 ⭐⭐⭐⭐⭐
**文件:** `02-API设计规范.md` ⏳ 待创建(从 `01-设计文档/API设计规范.md` 提取)
**核心内容:**
- RESTful API设计原则
- URL命名规范`/api/v1/模块/资源`
- HTTP方法使用规范
- 请求/响应格式规范
- 错误码设计
- 认证和权限
**快速参考:** [API路由总览](./04-API路由总览.md) ⭐ 已创建
---
### 3. 数据库全局视图 ⭐⭐⭐⭐⭐ ✅ 新增
**文件:** `03-数据库全局视图.md`
**用途:** 提供所有Schema和表的快速索引
**核心内容:**
- Schema划分策略8个Schema
- 所有表的总览和跳转链接
- 跨Schema依赖关系
- 数据量预估
**使用场景:**
- 查看全局数据架构
- 快速定位某个表属于哪个Schema
- 了解跨模块数据关系
---
### 4. API路由总览 ⭐⭐⭐⭐⭐ ✅ 新增
**文件:** `04-API路由总览.md`
**用途:** 提供所有API端点的快速索引
**核心内容:**
- 路由命名规范
- 所有模块的API端点总览
- 路由冲突检查
- 端点统计(~85个
**使用场景:**
- 查看全局API架构
- 避免路由冲突
- 快速查找某个功能的API端点
---
### 5. 代码规范 ⭐⭐⭐⭐
**文件:** `05-代码规范.md` → 重命名自 `代码规范.md`已存在818行
**核心内容:**
- TypeScript编码规范
- React组件规范
- 文件和目录命名
- 代码注释规范
- 错误处理规范
- 日志记录规范
**已有内容,包含:**
- ESLint配置
- Prettier配置
- 详细的编码规范
---
### 6. Git提交规范 ⭐⭐⭐⭐
**文件:** `06-Git提交规范.md` ⏳ 待创建
**核心内容:**
- Commit Message格式
- 分支管理策略
- PR/MR规范
- 代码审查流程
**Commit Message格式**
```
<type>(<scope>): <subject>
<body>
<footer>
```
**Type类型**
- `feat`: 新功能
- `fix`: Bug修复
- `docs`: 文档更新
- `style`: 代码格式(不影响逻辑)
- `refactor`: 重构
- `perf`: 性能优化
- `test`: 测试相关
- `chore`: 构建/工具相关
**示例:**
```
feat(asl): 实现标题摘要初筛功能
- 添加CSV文件导入
- 实现双模型AI判断
- 添加PICO配置功能
Closes #123
```
---
### 7. 测试规范 ⭐⭐⭐
**文件:** `07-测试规范.md` ⏳ 待创建
**核心内容:**
- 单元测试规范
- 集成测试规范
- E2E测试规范
- 测试覆盖率要求
**测试覆盖率要求:**
- 核心业务逻辑≥80%
- 工具函数≥90%
- API Controller≥70%
---
## 🎯 规范优先级
### P0 - 必须遵守
- ✅ 数据库设计规范
- ✅ API设计规范
- ✅ Git提交规范Commit Message
### P1 - 强烈建议
- ✅ 代码规范TypeScript/React
- ✅ 错误处理规范
- ✅ 日志记录规范
### P2 - 建议遵守
- ⚪ 测试规范
- ⚪ 文档注释规范
- ⚪ 性能优化规范
---
## 🔍 快速查找
**我要设计数据库表:**`01-数据库设计规范.md`
**我要设计API接口**`02-API设计规范.md`
**我要编写代码:**`03-代码规范.md`
**我要提交代码:**`04-Git提交规范.md`
**我要编写测试:**`05-测试规范.md`
---
## ⚠️ 违反规范的后果
### 数据库设计不规范
- ❌ Schema混乱模块耦合
- ❌ 无法实现模块独立部署
- ❌ 数据迁移困难
### API设计不规范
- ❌ 前后端对接困难
- ❌ API文档混乱
- ❌ 版本升级困难
### 代码不规范
- ❌ 代码可读性差
- ❌ 维护成本高
- ❌ Bug率上升
---
## 📝 规范更新流程
1. 提出规范变更需求Issue或PR
2. 团队讨论和评审
3. 更新规范文档
4. 通知全员
5. 逐步迁移旧代码
---
## 🔗 相关工具
**代码检查:**
- ESLintJavaScript/TypeScript
- Prettier代码格式化
- StylelintCSS
**提交检查:**
- HuskyGit Hooks
- CommitlintCommit Message检查
**数据库:**
- PrismaORM + Migration
- pgAdmin数据库管理
---
**最后更新:** 2025-11-06
**维护人:** 技术架构师