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:
497
docs/04-开发规范/01-数据库设计规范.md
Normal file
497
docs/04-开发规范/01-数据库设计规范.md
Normal 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字符串
|
||||
- 在表中存储其他模块的业务ID(VARCHAR)
|
||||
- 不建立外键关系
|
||||
- 在应用层验证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 -- 内容
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ✅ 检查清单
|
||||
|
||||
**设计新表时必须检查:**
|
||||
- [ ] 表名符合命名规范(小写+下划线+复数)
|
||||
- [ ] 使用正确的Schema(platform/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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
527
docs/04-开发规范/02-API设计规范.md
Normal file
527
docs/04-开发规范/02-API设计规范.md
Normal 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
|
||||
# Token过期,返回401
|
||||
{
|
||||
"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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
349
docs/04-开发规范/03-数据库全局视图.md
Normal file
349
docs/04-开发规范/03-数据库全局视图.md
Normal 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_schema(AI智能问答)
|
||||
|
||||
**职责:** 存储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_schema(AI智能文献)
|
||||
|
||||
**职责:** 存储文献筛选、提取、分析相关数据
|
||||
|
||||
**状态:** ⏳ 设计中(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万/年** | **~500GB(5年)** |
|
||||
|
||||
### 大表监控(年增长>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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
393
docs/04-开发规范/04-API路由总览.md
Normal file
393
docs/04-开发规范/04-API路由总览.md
Normal 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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
827
docs/04-开发规范/05-代码规范.md
Normal file
827
docs/04-开发规范/05-代码规范.md
Normal 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 exports(index.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
|
||||
**维护者:** 技术负责人
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
228
docs/04-开发规范/README.md
Normal file
228
docs/04-开发规范/README.md
Normal 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. 逐步迁移旧代码
|
||||
|
||||
---
|
||||
|
||||
## 🔗 相关工具
|
||||
|
||||
**代码检查:**
|
||||
- ESLint(JavaScript/TypeScript)
|
||||
- Prettier(代码格式化)
|
||||
- Stylelint(CSS)
|
||||
|
||||
**提交检查:**
|
||||
- Husky(Git Hooks)
|
||||
- Commitlint(Commit Message检查)
|
||||
|
||||
**数据库:**
|
||||
- Prisma(ORM + Migration)
|
||||
- pgAdmin(数据库管理)
|
||||
|
||||
---
|
||||
|
||||
**最后更新:** 2025-11-06
|
||||
**维护人:** 技术架构师
|
||||
Reference in New Issue
Block a user