feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1): - Database: Add user_modules table for fine-grained module permissions - Database: Add 4 user permissions (view/create/edit/delete) to role_permissions - Backend: UserService (780 lines) - CRUD with tenant isolation - Backend: UserController + UserRoutes (648 lines) - 13 API endpoints - Backend: Batch import users from Excel - Frontend: UserListPage (412 lines) - list/filter/search/pagination - Frontend: UserFormPage (341 lines) - create/edit with module config - Frontend: UserDetailPage (393 lines) - details/tenant/module management - Frontend: 3 modal components (592 lines) - import/assign/configure - API: GET/POST/PUT/DELETE /api/admin/users/* endpoints Architecture Upgrade - Module Permission System: - Backend: Add getUserModules() method in auth.service - Backend: Login API returns modules array in user object - Frontend: AuthContext adds hasModule() method - Frontend: Navigation filters modules based on user.modules - Frontend: RouteGuard checks requiredModule instead of requiredVersion - Frontend: Remove deprecated version-based permission system - UX: Only show accessible modules in navigation (clean UI) - UX: Smart redirect after login (avoid 403 for regular users) Fixes: - Fix UTF-8 encoding corruption in ~100 docs files - Fix pageSize type conversion in userService (String to Number) - Fix authUser undefined error in TopNavigation - Fix login redirect logic with role-based access check - Update Git commit guidelines v1.2 with UTF-8 safety rules Database Changes: - CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled) - ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code) - INSERT 4 permissions + role assignments - UPDATE PUBLIC tenant with 8 module subscriptions Technical: - Backend: 5 new files (~2400 lines) - Frontend: 10 new files (~2500 lines) - Docs: 1 development record + 2 status updates + 1 guideline update - Total: ~4900 lines of code Status: User management 100% complete, module permission system operational
This commit is contained in:
@@ -1,32 +1,32 @@
|
||||
# API设计规范
|
||||
|
||||
> **<EFBFBD><EFBFBD>𧋦嚗?* v2.0
|
||||
> **版本:** v2.0
|
||||
> **最后更新:** 2025-11-06
|
||||
> **API憌擧聢嚗?* RESTful API
|
||||
> **<EFBFBD>箇<EFBFBD>URL嚗?* `http://localhost:3001/api/v1`
|
||||
> **<EFBFBD><EFBFBD>鍂<EFBFBD><EFBFBD>凒嚗?* 撟喳蝱撅?+ <20>賢<EFBFBD>撅?+ 銝𡁜𦛚璅∪<E79285>撅?
|
||||
> **API风格:** RESTful API
|
||||
> **基础URL:** `http://localhost:3001/api/v1`
|
||||
> **适用范围:** 平台层 + 能力层 + 业务模块层
|
||||
|
||||
---
|
||||
|
||||
## 📋 设计原则
|
||||
|
||||
### API First原则
|
||||
- <EFBFBD>?<3F><>挽霈,PI嚗<49><E59A97>摰䂿緵<E482BF>蠘<EFBFBD>
|
||||
- <EFBFBD>?API<EFBFBD>臬<EFBFBD><EFBFBD>𡒊垢<EFBFBD><EFBFBD><EFBFBD>蝥?
|
||||
- <EFBFBD>?API<EFBFBD>䀹凒<EFBFBD><EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>祆綉<EFBFBD>?
|
||||
- <EFBFBD>?<3F><><EFBFBD>𡅅PI<50>質<EFBFBD><E8B3AA>㗇<EFBFBD>獢?
|
||||
- ✅ 先设计API,再实现功能
|
||||
- ✅ API是前后端的契约
|
||||
- ✅ API变更需要版本控制
|
||||
- ✅ 所有API都要有文档
|
||||
|
||||
### RESTful设计
|
||||
- <EFBFBD>?雿輻鍂HTTP<54>刻<EFBFBD>銵函內<E587BD>滢<EFBFBD>嚗𠃑ET<45><54>OST<53><54>UT<55><54>ELETE嚗?
|
||||
- <EFBFBD>?URL銵函內韏<EFBFBD><EFBFBD>嚗䔶<EFBFBD>銵函內<EFBFBD>其<EFBFBD>
|
||||
- <EFBFBD>?雿輻鍂憭齿㺭<E9BDBF>滩<EFBFBD>銵函內韏<E585A7><E99F8F><EFBFBD><EFBFBD><EFBFBD>
|
||||
- <EFBFBD>?撋<><E6928B>韏<EFBFBD><E99F8F>銝滩<E98A9D>餈?撅?
|
||||
- <EFBFBD>?雿輻鍂HTTP<54>嗆<EFBFBD><E59786><EFBFBD>銵函內蝏𤘪<E89D8F>
|
||||
- ✅ 使用HTTP动词表示操作(GET、POST、PUT、DELETE)
|
||||
- ✅ URL表示资源,不表示动作
|
||||
- ✅ 使用复数名词表示资源集合
|
||||
- ✅ 嵌套资源不超过2层
|
||||
- ✅ 使用HTTP状态码表示结果
|
||||
|
||||
### 命名规范
|
||||
- <EFBFBD>?URL雿輻鍂撠誩<EFBFBD>摮埈<EFBFBD><EFBFBD>諹<EFBFBD>摮㛖泵嚗ɑebab-case嚗?
|
||||
- <EFBFBD>?<3F>亥砭<E4BAA5><E7A0AD>㺭雿輻鍂撽澆陸<E6BE86>賢<EFBFBD>嚗ẾamelCase嚗?
|
||||
- <EFBFBD>?JSON摮埈挾雿輻鍂撽澆陸<EFBFBD>賢<EFBFBD>嚗ẾamelCase嚗?
|
||||
- ✅ URL使用小写字母和连字符(kebab-case)
|
||||
- ✅ 查询参数使用驼峰命名(camelCase)
|
||||
- ✅ JSON字段使用驼峰命名(camelCase)
|
||||
|
||||
---
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
```
|
||||
/api/v{version}/{module}/{resource}/{id?}/{action?}
|
||||
|
||||
蝷箔<EFBFBD>嚗?
|
||||
示例:
|
||||
/api/v1/literature/projects # 获取文献项目列表
|
||||
/api/v1/literature/projects/123 # <EFBFBD>瑕<EFBFBD>ID=123<EFBFBD><EFBFBD>★<EFBFBD>?
|
||||
/api/v1/literature/projects/123 # 获取ID=123的项目
|
||||
/api/v1/literature/projects/123/export # 导出项目(动作)
|
||||
```
|
||||
|
||||
@@ -50,19 +50,19 @@
|
||||
| 认证 | `/auth` | `/api/v1/auth/login` |
|
||||
| 用户 | `/users` | `/api/v1/users/me` |
|
||||
| AI问答 | `/chat` | `/api/v1/chat/conversations` |
|
||||
| <EFBFBD>箄<EFBFBD>雿?| `/agents` | `/api/v1/agents` |
|
||||
| 智能体 | `/agents` | `/api/v1/agents` |
|
||||
| AI文献 | `/literature` | `/api/v1/literature/projects` |
|
||||
| <EFBFBD>亥<EFBFBD>摨?| `/knowledge-bases` | `/api/v1/knowledge-bases` |
|
||||
| 知识库 | `/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` |
|
||||
| 蝞∠<EFBFBD>蝡?| `/admin` | `/api/v1/admin/users` |
|
||||
| 管理端 | `/admin` | `/api/v1/admin/users` |
|
||||
|
||||
### 资源命名
|
||||
|
||||
**<EFBFBD>?甇<>&蝷箔<E89DB7>嚗?*
|
||||
**✅ 正确示例:**
|
||||
```
|
||||
GET /api/v1/literature/projects # 获取列表
|
||||
GET /api/v1/literature/projects/:id # 获取详情
|
||||
@@ -72,10 +72,10 @@ 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 # <EFBFBD>扯<EFBFBD>蝑偦<EFBFBD>?
|
||||
POST /api/v1/literature/projects/:id/screening/execute # 执行筛选
|
||||
```
|
||||
|
||||
**<EFBFBD>?<3F>躰秤蝷箔<E89DB7>嚗?*
|
||||
**❌ 错误示例:**
|
||||
```
|
||||
POST /api/v1/literature/getProjects # 使用动词
|
||||
POST /api/v1/literature/createProject # 使用动词
|
||||
@@ -89,13 +89,13 @@ GET /api/v1/literatureProjectList # 驼峰命名
|
||||
|
||||
### 方法使用
|
||||
|
||||
| <EFBFBD>寞<EFBFBD> | <20>券<EFBFBD>?| <20>臬炏撟<E7828F><E6929F> | <20>臬炏摰匧<E691B0> |
|
||||
| 方法 | 用途 | 是否幂等 | 是否安全 |
|
||||
|------|------|---------|---------|
|
||||
| **GET** | <EFBFBD>瑕<EFBFBD>韏<EFBFBD><EFBFBD> | <20>?| <20>?|
|
||||
| **POST** | <EFBFBD>𥕦遣韏<EFBFBD><EFBFBD> | <20>?| <20>?|
|
||||
| **PUT** | 摰峕㟲<EFBFBD>湔鰵韏<EFBFBD><EFBFBD> | <20>?| <20>?|
|
||||
| **PATCH** | <EFBFBD>典<EFBFBD><EFBFBD>湔鰵韏<EFBFBD><EFBFBD> | <20>?| <20>?|
|
||||
| **DELETE** | <EFBFBD>𣳇膄韏<EFBFBD><EFBFBD> | <20>?| <20>?|
|
||||
| **GET** | 获取资源 | ✅ | ✅ |
|
||||
| **POST** | 创建资源 | ❌ | ❌ |
|
||||
| **PUT** | 完整更新资源 | ✅ | ❌ |
|
||||
| **PATCH** | 部分更新资源 | ❌ | ❌ |
|
||||
| **DELETE** | 删除资源 | ✅ | ❌ |
|
||||
|
||||
### 方法示例
|
||||
|
||||
@@ -109,7 +109,7 @@ GET /api/v1/literature/projects/123
|
||||
# 创建资源
|
||||
POST /api/v1/literature/projects
|
||||
Content-Type: application/json
|
||||
{ "name": "<EFBFBD>圈★<EFBFBD>?, "description": "..." }
|
||||
{ "name": "新项目", "description": "..." }
|
||||
|
||||
# 完整更新资源(所有字段)
|
||||
PUT /api/v1/literature/projects/123
|
||||
@@ -119,7 +119,7 @@ Content-Type: application/json
|
||||
# 部分更新资源(部分字段)
|
||||
PATCH /api/v1/literature/projects/123
|
||||
Content-Type: application/json
|
||||
{ "name": "<EFBFBD>芣凒<EFBFBD>啣<EFBFBD>蝘? }
|
||||
{ "name": "只更新名称" }
|
||||
|
||||
# 删除资源
|
||||
DELETE /api/v1/literature/projects/123
|
||||
@@ -135,15 +135,15 @@ DELETE /api/v1/literature/projects/123
|
||||
|--------|------|---------|
|
||||
| **200** | OK | 成功返回数据 |
|
||||
| **201** | Created | 成功创建资源 |
|
||||
| **204** | No Content | <EFBFBD>𣂼<EFBFBD>雿<EFBFBD><EFBFBD>餈𥪜<EFBFBD><EFBFBD>唳旿嚗<EFBFBD><EFBFBD><EFBFBD>𣳇膄嚗?|
|
||||
| **204** | No Content | 成功但无返回数据(如删除) |
|
||||
| **400** | Bad Request | 请求参数错误 |
|
||||
| **401** | Unauthorized | <EFBFBD>芾恕霂<EFBFBD><EFBFBD>瘝⊥<EFBFBD>Token<EFBFBD>巁oken餈<EFBFBD><EFBFBD>嚗?|
|
||||
| **403** | Forbidden | <EFBFBD>䭾<EFBFBD><EFBFBD>琜<EFBFBD>撌脰恕霂<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滩雲嚗?|
|
||||
| **404** | Not Found | 韏<EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>?|
|
||||
| **409** | Conflict | 韏<EFBFBD><EFBFBD><EFBFBD>脩<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>滚<EFBFBD><EFBFBD>𥕦遣嚗?|
|
||||
| **422** | Unprocessable Entity | 霂凋<EFBFBD><EFBFBD>躰秤嚗<EFBFBD><EFBFBD>撉諹<EFBFBD>憭梯揖嚗?|
|
||||
| **401** | Unauthorized | 未认证(没有Token或Token过期) |
|
||||
| **403** | Forbidden | 无权限(已认证但权限不足) |
|
||||
| **404** | Not Found | 资源不存在 |
|
||||
| **409** | Conflict | 资源冲突(如重复创建) |
|
||||
| **422** | Unprocessable Entity | 语义错误(如验证失败) |
|
||||
| **429** | Too Many Requests | 请求过于频繁(限流) |
|
||||
| **500** | Internal Server Error | <EFBFBD>滚𦛚<EFBFBD>券<EFBFBD>霂?|
|
||||
| **500** | Internal Server Error | 服务器错误 |
|
||||
|
||||
### 状态码使用示例
|
||||
|
||||
@@ -154,7 +154,7 @@ res.status(200).json({ success: true, data: projects });
|
||||
// 201 Created - 成功创建资源
|
||||
res.status(201).json({ success: true, data: newProject });
|
||||
|
||||
// 204 No Content - <EFBFBD>𣂼<EFBFBD><EFBFBD>𣳇膄嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>捆餈𥪜<EFBFBD>嚗?
|
||||
// 204 No Content - 成功删除(无内容返回)
|
||||
res.status(204).send();
|
||||
|
||||
// 400 Bad Request - 参数错误
|
||||
@@ -163,22 +163,22 @@ res.status(400).json({
|
||||
error: { code: 'INVALID_PARAMS', message: '参数错误' }
|
||||
});
|
||||
|
||||
// 401 Unauthorized - <EFBFBD>芾恕霂?
|
||||
// 401 Unauthorized - 未认证
|
||||
res.status(401).json({
|
||||
success: false,
|
||||
error: { code: 'UNAUTHORIZED', message: '请先登录' }
|
||||
});
|
||||
|
||||
// 403 Forbidden - <EFBFBD>䭾<EFBFBD><EFBFBD>?
|
||||
// 403 Forbidden - 无权限
|
||||
res.status(403).json({
|
||||
success: false,
|
||||
error: { code: 'FORBIDDEN', message: '无权访问' }
|
||||
});
|
||||
|
||||
// 404 Not Found - 韏<EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>?
|
||||
// 404 Not Found - 资源不存在
|
||||
res.status(404).json({
|
||||
success: false,
|
||||
error: { code: 'NOT_FOUND', message: '韏<EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>? }
|
||||
error: { code: 'NOT_FOUND', message: '资源不存在' }
|
||||
});
|
||||
|
||||
// 422 Unprocessable Entity - 验证失败
|
||||
@@ -196,9 +196,9 @@ res.status(422).json({
|
||||
|
||||
## 📝 响应格式规范
|
||||
|
||||
### 蝏煺<EFBFBD><EFBFBD>滚<EFBFBD><EFBFBD>澆<EFBFBD> 潃?敹<>◆<EFBFBD>萄<EFBFBD>
|
||||
### 统一响应格式 ⭐ 必须遵守
|
||||
|
||||
**<EFBFBD>𣂼<EFBFBD><EFBFBD>滚<EFBFBD>嚗?*
|
||||
**成功响应:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
@@ -209,7 +209,7 @@ res.status(422).json({
|
||||
}
|
||||
```
|
||||
|
||||
**<EFBFBD>躰秤<EFBFBD>滚<EFBFBD>嚗?*
|
||||
**错误响应:**
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
@@ -255,11 +255,11 @@ res.status(422).json({
|
||||
"details": [
|
||||
{
|
||||
"field": "email",
|
||||
"message": "<EFBFBD>桃拳<EFBFBD>澆<EFBFBD>銝齿迤蝖?
|
||||
"message": "邮箱格式不正确"
|
||||
},
|
||||
{
|
||||
"field": "password",
|
||||
"message": "撖<EFBFBD><EFBFBD><EFBFBD>踹漲敹<EFBFBD>◆憭找<EFBFBD>6雿?
|
||||
"message": "密码长度必须大于6位"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -268,7 +268,7 @@ res.status(422).json({
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 霈方<E99C88>銝擧<E98A9D><E693A7><EFBFBD><EFBFBD><EFBFBD>?
|
||||
## 🔑 认证与授权规范
|
||||
|
||||
### JWT认证
|
||||
|
||||
@@ -307,12 +307,12 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
|
||||
|
||||
**3. Token过期处理**
|
||||
```http
|
||||
# Token餈<EFBFBD><EFBFBD>嚗諹<EFBFBD><EFBFBD>?01
|
||||
# Token过期,返回401
|
||||
{
|
||||
"success": false,
|
||||
"error": {
|
||||
"code": "TOKEN_EXPIRED",
|
||||
"message": "Token撌脰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>霂琿<EFBFBD><EFBFBD>啁蒈敶?
|
||||
"message": "Token已过期,请重新登录"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -327,23 +327,23 @@ Content-Type: application/json
|
||||
|
||||
### 权限控制
|
||||
|
||||
| 蝡舐<EFBFBD>蝐餃<EFBFBD> | <20><>閬<EFBFBD>恕霂?| 閫坿𠧧閬<F0A0A7A7><E996AC> |
|
||||
| 端点类型 | 需要认证 | 角色要求 |
|
||||
|---------|---------|---------|
|
||||
| <EFBFBD>砍<EFBFBD>蝡舐<EFBFBD> | <20>?| <20>?|
|
||||
| <EFBFBD>冽<EFBFBD>蝡舐<EFBFBD> | <EFBFBD>?| user |
|
||||
| 蝞∠<EFBFBD>蝡舐<EFBFBD> | <EFBFBD>?| admin |
|
||||
| 公开端点 | ❌ | 无 |
|
||||
| 用户端点 | ✅ | user |
|
||||
| 管理端点 | ✅ | admin |
|
||||
|
||||
**蝷箔<EFBFBD>嚗?*
|
||||
**示例:**
|
||||
```typescript
|
||||
// <EFBFBD>砍<EFBFBD>蝡舐<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>霈方<EFBFBD>嚗?
|
||||
// 公开端点(无需认证)
|
||||
POST /api/v1/auth/login
|
||||
POST /api/v1/auth/register
|
||||
|
||||
// <EFBFBD>冽<EFBFBD>蝡舐<EFBFBD>嚗<EFBFBD><EFBFBD>閬<EFBFBD>恕霂<EFBFBD><EFBFBD>user閫坿𠧧嚗?
|
||||
// 用户端点(需要认证,user角色)
|
||||
GET /api/v1/literature/projects
|
||||
POST /api/v1/literature/projects
|
||||
|
||||
// 蝞∠<EFBFBD>蝡舐<EFBFBD>嚗<EFBFBD><EFBFBD>閬<EFBFBD>恕霂<EFBFBD><EFBFBD>admin閫坿𠧧嚗?
|
||||
// 管理端点(需要认证,admin角色)
|
||||
GET /api/v1/admin/users
|
||||
POST /api/v1/admin/users/:id/disable
|
||||
```
|
||||
@@ -357,11 +357,11 @@ POST /api/v1/admin/users/:id/disable
|
||||
```
|
||||
GET /api/v1/literature/projects?page=1&pageSize=20&sortBy=createdAt&sortOrder=desc
|
||||
|
||||
Query<EFBFBD><EFBFBD>㺭嚗?
|
||||
- page: 憿萇<EFBFBD>嚗<EFBFBD><EFBFBD>霈?嚗?
|
||||
- pageSize: 瘥誯△<EFBFBD>圈<EFBFBD>嚗<EFBFBD><EFBFBD>霈?0嚗峕<E59A97>憭?00嚗?
|
||||
- sortBy: <EFBFBD>鍦<EFBFBD>摮埈挾嚗<EFBFBD><EFBFBD>霈勺reatedAt嚗?
|
||||
- sortOrder: <EFBFBD>鍦<EFBFBD><EFBFBD>孵<EFBFBD>嚗Òsc/desc嚗屸<EFBFBD>霈千esc嚗?
|
||||
Query参数:
|
||||
- page: 页码(默认1)
|
||||
- pageSize: 每页数量(默认10,最大100)
|
||||
- sortBy: 排序字段(默认createdAt)
|
||||
- sortOrder: 排序方向(asc/desc,默认desc)
|
||||
```
|
||||
|
||||
### 响应格式
|
||||
@@ -387,16 +387,16 @@ Query参数
|
||||
|
||||
## 🔍 筛选与搜索规范
|
||||
|
||||
### 蝑偦<EFBFBD>匧<EFBFBD><EFBFBD>?
|
||||
### 筛选参数
|
||||
|
||||
```
|
||||
GET /api/v1/literature/projects?status=active&keyword=骨质疏松
|
||||
|
||||
Query<EFBFBD><EFBFBD>㺭嚗?
|
||||
- status: <EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㚁<EFBFBD>active/inactive嚗?
|
||||
- keyword: <EFBFBD>喲睸霂齿<EFBFBD>蝝g<EFBFBD><EFBFBD>𦦵揣name<EFBFBD>𩥇escription摮埈挾嚗?
|
||||
Query参数:
|
||||
- status: 状态筛选(active/inactive)
|
||||
- keyword: 关键词搜索(搜索name和description字段)
|
||||
- userId: 用户ID筛选(管理端)
|
||||
- startDate/endDate: <EFBFBD>交<EFBFBD><EFBFBD><EFBFBD>凒蝑偦<EFBFBD>?
|
||||
- startDate/endDate: 日期范围筛选
|
||||
```
|
||||
|
||||
### 搜索响应
|
||||
@@ -417,29 +417,29 @@ Query参数
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD>𩤃<EFBFBD> <20>躰秤<E8BAB0><E7A7A4>挽霈?
|
||||
## ⚠️ 错误码设计
|
||||
|
||||
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD>躰秤<EFBFBD>?
|
||||
### 标准错误码
|
||||
|
||||
| <EFBFBD>躰秤<EFBFBD>?| HTTP<EFBFBD>嗆<EFBFBD>?| 霂湔<E99C82> |
|
||||
| 错误码 | HTTP状态 | 说明 |
|
||||
|--------|---------|------|
|
||||
| `VALIDATION_ERROR` | 422 | 参数验证失败 |
|
||||
| `UNAUTHORIZED` | 401 | <EFBFBD>芾恕霂?|
|
||||
| `UNAUTHORIZED` | 401 | 未认证 |
|
||||
| `TOKEN_EXPIRED` | 401 | Token过期 |
|
||||
| `FORBIDDEN` | 403 | <EFBFBD>䭾<EFBFBD><EFBFBD>?|
|
||||
| `NOT_FOUND` | 404 | 韏<EFBFBD><EFBFBD>銝滚<EFBFBD><EFBFBD>?|
|
||||
| `ALREADY_EXISTS` | 409 | 韏<EFBFBD><EFBFBD>撌脣<EFBFBD><EFBFBD>?|
|
||||
| `FORBIDDEN` | 403 | 无权限 |
|
||||
| `NOT_FOUND` | 404 | 资源不存在 |
|
||||
| `ALREADY_EXISTS` | 409 | 资源已存在 |
|
||||
| `QUOTA_EXCEEDED` | 429 | 配额超限 |
|
||||
| `INTERNAL_ERROR` | 500 | <EFBFBD>滚𦛚<EFBFBD>券<EFBFBD>霂?|
|
||||
| `INTERNAL_ERROR` | 500 | 服务器错误 |
|
||||
|
||||
### 銝𡁜𦛚<EFBFBD>躰秤<EFBFBD>?
|
||||
### 业务错误码
|
||||
|
||||
```typescript
|
||||
// 璅∪<EFBFBD><EFBFBD>孵<EFBFBD><EFBFBD>躰秤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>滨<EFBFBD><EFBFBD>箏<EFBFBD>嚗?
|
||||
ASL_IMPORT_FAILED // AI<EFBFBD><EFBFBD>讃嚗𡁜紡<EFBFBD>亙仃韐?
|
||||
// 模块特定错误码(前缀区分)
|
||||
ASL_IMPORT_FAILED // AI文献:导入失败
|
||||
ASL_SCREENING_IN_PROGRESS // AI文献:筛选进行中
|
||||
PKB_QUOTA_EXCEEDED // 知识库:配额超限
|
||||
LLM_QUOTA_EXCEEDED // LLM嚗𡁻<EFBFBD>憸肽<EFBFBD><EFBFBD>?
|
||||
LLM_QUOTA_EXCEEDED // LLM:配额超限
|
||||
```
|
||||
|
||||
---
|
||||
@@ -452,7 +452,7 @@ LLM_QUOTA_EXCEEDED // LLM:配额超
|
||||
所有列表接口必须支持分页:
|
||||
- 默认pageSize=10
|
||||
- 最大pageSize=100
|
||||
- 蝳<EFBFBD>迫銝<EFBFBD>甈⊥<EFBFBD>扯<EFBFBD><EFBFBD>𧼮<EFBFBD><EFBFBD>冽㺭<EFBFBD>?
|
||||
- 禁止一次性返回全部数据
|
||||
```
|
||||
|
||||
### 2. 字段过滤
|
||||
@@ -460,13 +460,13 @@ LLM_QUOTA_EXCEEDED // LLM:配额超
|
||||
```
|
||||
GET /api/v1/users/me?fields=id,name,email
|
||||
|
||||
<EFBFBD>芾<EFBFBD><EFBFBD>鮋<EFBFBD>閬<EFBFBD><EFBFBD>摮埈挾嚗<EFBFBD><EFBFBD>撠烐㺭<EFBFBD>桐<EFBFBD>颲?
|
||||
只返回需要的字段,减少数据传输
|
||||
```
|
||||
|
||||
### 3. 缓存策略
|
||||
|
||||
```http
|
||||
# 霈曄蔭蝻枏<EFBFBD>憭?
|
||||
# 设置缓存头
|
||||
Cache-Control: public, max-age=300
|
||||
|
||||
# 使用ETag
|
||||
@@ -477,40 +477,40 @@ If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD>?璉<><E79289>交<EFBFBD><E4BAA4>?
|
||||
## ✅ 检查清单
|
||||
|
||||
**设计新API时必须检查:**
|
||||
- [ ] URL蝚血<EFBFBD>RESTful閫<EFBFBD><EFBFBD>嚗<EFBFBD>蝙<EFBFBD>典<EFBFBD>霂?憭齿㺭嚗?
|
||||
- [ ] 雿輻鍂甇<EFBFBD>&<EFBFBD><EFBFBD>TTP<EFBFBD>寞<EFBFBD>嚗𠃑ET/POST/PUT/DELETE嚗?
|
||||
- [ ] URL符合RESTful规范(使用名词+复数)
|
||||
- [ ] 使用正确的HTTP方法(GET/POST/PUT/DELETE)
|
||||
- [ ] 使用正确的HTTP状态码
|
||||
- [ ] <EFBFBD>滚<EFBFBD><EFBFBD>澆<EFBFBD>蝚血<EFBFBD>蝏煺<EFBFBD>閫<EFBFBD><EFBFBD>嚗ìuccess + data/error嚗?
|
||||
- [ ] 响应格式符合统一规范(success + data/error)
|
||||
- [ ] 需要认证的接口检查JWT Token
|
||||
- [ ] <EFBFBD><EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>鞟<EFBFBD><EFBFBD>亙藁璉<EFBFBD><EFBFBD>亦鍂<EFBFBD>瑁<EFBFBD><EFBFBD>?
|
||||
- [ ] 需要权限的接口检查用户角色
|
||||
- [ ] 列表接口支持分页
|
||||
- [ ] 列表接口支持排序
|
||||
- [ ] <EFBFBD>躰秤<EFBFBD>滚<EFBFBD><EFBFBD><EFBFBD>鉄<EFBFBD>𡒊&<EFBFBD><EFBFBD><EFBFBD>霂舐<EFBFBD><EFBFBD>屸<EFBFBD>霂臭縑<EFBFBD>?
|
||||
- [ ] 错误响应包含明确的错误码和错误信息
|
||||
- [ ] 所有API都有文档说明
|
||||
|
||||
---
|
||||
|
||||
## 🔗 相关文档
|
||||
|
||||
**<EFBFBD>餉<EFBFBD>嚗?*
|
||||
- [API頝舐眏<EFBFBD>餉<EFBFBD>](./04-API頝舐眏<EFBFBD>餉<EFBFBD>.md) 潃?<3F>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD>𡅅PI蝡舐<E89DA1>
|
||||
**总览:**
|
||||
- [API路由总览](./04-API路由总览.md) ⭐ 查看所有API端点
|
||||
|
||||
**璅⊥踎嚗?*
|
||||
**模板:**
|
||||
- [API设计模板](../_templates/API设计-模板.md)
|
||||
|
||||
**各模块设计:**
|
||||
- [撟喳蝱<EFBFBD>箇<EFBFBD>撅<EFBFBD>(../01-撟喳蝱<E596B3>箇<EFBFBD>撅?README.md)
|
||||
- [<EFBFBD>𡁶鍂<EFBFBD>賢<EFBFBD>撅<EFBFBD>(../02-<2D>𡁶鍂<F0A181B6>賢<EFBFBD>撅?README.md)
|
||||
- [平台基础层](../01-平台基础层/README.md)
|
||||
- [通用能力层](../02-通用能力层/README.md)
|
||||
- [业务模块层](../03-业务模块/README.md)
|
||||
|
||||
---
|
||||
|
||||
**最后更新:** 2025-11-06
|
||||
**维护人:** 技术架构师
|
||||
**<EFBFBD><EFBFBD>𧋦嚗?* v2.0
|
||||
**版本:** v2.0
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user