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,47 +1,47 @@
|
||||
# PKB后端API路由注册 - 阶段2完成报告
|
||||
|
||||
> **瀹屾垚鏃ユ湡锛?* 2026-01-06
|
||||
> **鎵ц<EFBFBD>浜哄憳锛?* AI鍔╂墜
|
||||
> **鐘舵€侊細** 鉁?瀹屾垚
|
||||
> **完成日期:** 2026-01-06
|
||||
> **执行人员:** AI助手
|
||||
> **状态:** ✅ 完成
|
||||
|
||||
---
|
||||
|
||||
## 📋 执行摘要
|
||||
|
||||
**闃舵<EFBFBD>2锛氬悗绔疉PI璺<EFBFBD>敱娉ㄥ唽锛堝弻璺<EFBFBD>敱鍏卞瓨锛?*宸叉垚鍔熷畬鎴愶紒PKB妯″潡鐨勬柊璺<E69F8A>敱锛坴2锛夊凡娉ㄥ唽骞朵笌鏃ц矾鐢憋紙v1锛夊畬缇庡叡瀛樸€?
|
||||
**阶段2:后端API路由注册(双路由共存)**已成功完成!PKB模块的新路由(v2)已注册并与旧路由(v1)完美共存。
|
||||
|
||||
### 核心成果
|
||||
- 鉁?鏂拌矾鐢卞凡娉ㄥ唽锛歚/api/v1/pkb/*`
|
||||
- 鉁?鏃ц矾鐢卞畬鍏ㄦ<E98D8F>甯革細`/api/v1/knowledge*`
|
||||
- 鉁?鍙岃矾鐢卞叡瀛橀獙璇侀€氳繃
|
||||
- 鉁?鍋ュ悍妫€鏌ョ<E98F8C>鐐规<E99090>甯稿伐浣?
|
||||
- 鉁?鏁版嵁搴撹繛鎺ユ<E98EBA>甯?
|
||||
- ✅ 新路由已注册:`/api/v2/pkb/*`
|
||||
- ✅ 旧路由完全正常:`/api/v1/knowledge*`
|
||||
- ✅ 双路由共存验证通过
|
||||
- ✅ 健康检查端点正常工作
|
||||
- ✅ 数据库连接正常
|
||||
|
||||
---
|
||||
|
||||
## 馃幆 瀹屾垚鐨勪换鍔?
|
||||
## 🎯 完成的任务
|
||||
|
||||
### Task 2.1锛氬湪涓昏矾鐢辨敞鍐孭KB妯″潡 鉁?
|
||||
**鏂囦欢淇<EFBFBD>敼锛?* `src/index.ts`
|
||||
### Task 2.1:在主路由注册PKB模块 ✅
|
||||
**文件修改:** `src/index.ts`
|
||||
|
||||
```typescript
|
||||
// 添加导入
|
||||
import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
|
||||
// 娉ㄥ唽鏂拌矾鐢憋紙鍦ㄦ棫璺<EFBFBD>敱涓嬫柟锛?
|
||||
await fastify.register(pkbRoutes, { prefix: '/api/v1/pkb' });
|
||||
logger.info('鉁?PKB涓<EFBFBD>汉鐭ヨ瘑搴撹矾鐢卞凡娉ㄥ唽锛坴2鏂版灦鏋勶級: /api/v1/pkb');
|
||||
logger.info(' 鈿狅笍 鏃х増璺<E5A297>敱浠嶅彲鐢? /api/v1/knowledge, /api/v1/batch-tasks');
|
||||
// 注册新路由(在旧路由下方)
|
||||
await fastify.register(pkbRoutes, { prefix: '/api/v2/pkb' });
|
||||
logger.info('✅ PKB个人知识库路由已注册(v2新架构): /api/v2/pkb');
|
||||
logger.info(' ⚠️ 旧版路由仍可用: /api/v1/knowledge, /api/v1/batch-tasks');
|
||||
```
|
||||
|
||||
### Task 2.2锛氭坊鍔犲仴搴锋<EFBFBD>鏌ョ<EFBFBD>鐐?鉁?
|
||||
**鏂板<EFBFBD>鏂囦欢锛?* `src/modules/pkb/routes/health.ts`
|
||||
### Task 2.2:添加健康检查端点 ✅
|
||||
**新增文件:** `src/modules/pkb/routes/health.ts`
|
||||
|
||||
```typescript
|
||||
// 鍋ュ悍妫€鏌ョ<EFBFBD>鐐?
|
||||
GET /api/v1/pkb/health
|
||||
// 健康检查端点
|
||||
GET /api/v2/pkb/health
|
||||
|
||||
杩斿洖绀轰緥锛?
|
||||
返回示例:
|
||||
{
|
||||
"status": "ok",
|
||||
"module": "pkb",
|
||||
@@ -56,92 +56,92 @@ GET /api/v1/pkb/health
|
||||
}
|
||||
```
|
||||
|
||||
### Task 2.3锛氭祴璇曟柊璺<EFBFBD>敱鍙<EFBFBD><EFBFBD>闂<EFBFBD>€?鉁?
|
||||
**娴嬭瘯缁撴灉锛?*
|
||||
### Task 2.3:测试新路由可访问性 ✅
|
||||
**测试结果:**
|
||||
|
||||
```bash
|
||||
# 娴嬭瘯鍋ュ悍妫€鏌?
|
||||
curl http://localhost:3000/api/v1/pkb/health
|
||||
鉁?杩斿洖: { "status": "ok", "module": "pkb", "version": "v2" }
|
||||
# 测试健康检查
|
||||
curl http://localhost:3000/api/v2/pkb/health
|
||||
✅ 返回: { "status": "ok", "module": "pkb", "version": "v2" }
|
||||
|
||||
# 娴嬭瘯鐭ヨ瘑搴撳垪琛?
|
||||
curl http://localhost:3000/api/v1/pkb/knowledge/knowledge-bases
|
||||
鉁?杩斿洖: { "success": true, "data": [2涓<EFBFBD>煡璇嗗簱] }
|
||||
# 测试知识库列表
|
||||
curl http://localhost:3000/api/v2/pkb/knowledge/knowledge-bases
|
||||
✅ 返回: { "success": true, "data": [2个知识库] }
|
||||
```
|
||||
|
||||
### Task 2.4锛氱‘璁ゆ棫璺<EFBFBD>敱浠嶆<EFBFBD>甯?鉁?
|
||||
**娴嬭瘯缁撴灉锛?*
|
||||
### Task 2.4:确认旧路由仍正常 ✅
|
||||
**测试结果:**
|
||||
|
||||
```bash
|
||||
# 鏃ц矾鐢辨祴璇?
|
||||
# 旧路由测试
|
||||
curl http://localhost:3000/api/v1/knowledge-bases
|
||||
鉁?杩斿洖: { "success": true, "data": [2涓<EFBFBD>煡璇嗗簱] }
|
||||
✅ 返回: { "success": true, "data": [2个知识库] }
|
||||
|
||||
# 鏁版嵁涓€鑷存€ч獙璇?
|
||||
# 数据一致性验证
|
||||
v1和v2返回的数据完全一致!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 馃敆 鍙岃矾鐢卞叡瀛樻灦鏋?
|
||||
## 🔗 双路由共存架构
|
||||
|
||||
### 路由映射对比
|
||||
|
||||
| 鍔熻兘 | 鏃ц矾鐢憋紙v1锛墊 鏂拌矾鐢憋紙v2锛墊 鐘舵€?|
|
||||
| 功能 | 旧路由(v1)| 新路由(v2)| 状态 |
|
||||
|------|------------|------------|------|
|
||||
| **鍋ュ悍妫€鏌?* | N/A | `/api/v1/pkb/health` | 鉁?v2鐙<32>湁 |
|
||||
| **鐭ヨ瘑搴撳垪琛?* | `/api/v1/knowledge-bases` | `/api/v1/pkb/knowledge/knowledge-bases` | 鉁?鍏卞瓨 |
|
||||
| **鍒涘缓鐭ヨ瘑搴?* | `/api/v1/knowledge-bases` | `/api/v1/pkb/knowledge/knowledge-bases` | 鉁?鍏卞瓨 |
|
||||
| **鐭ヨ瘑搴撹<EFBFBD>鎯?* | `/api/v1/knowledge-bases/:id` | `/api/v1/pkb/knowledge/knowledge-bases/:id` | 鉁?鍏卞瓨 |
|
||||
| **鏇存柊鐭ヨ瘑搴?* | `/api/v1/knowledge-bases/:id` | `/api/v1/pkb/knowledge/knowledge-bases/:id` | 鉁?鍏卞瓨 |
|
||||
| **鍒犻櫎鐭ヨ瘑搴?* | `/api/v1/knowledge-bases/:id` | `/api/v1/pkb/knowledge/knowledge-bases/:id` | 鉁?鍏卞瓨 |
|
||||
| **RAG妫€绱?* | `/api/v1/knowledge-bases/:id/search` | `/api/v1/pkb/knowledge/knowledge-bases/:id/search` | 鉁?鍏卞瓨 |
|
||||
| **鐭ヨ瘑搴撶粺璁?* | `/api/v1/knowledge-bases/:id/stats` | `/api/v1/pkb/knowledge/knowledge-bases/:id/stats` | 鉁?鍏卞瓨 |
|
||||
| **鏂囨。閫夋嫨** | `/api/v1/knowledge-bases/:id/document-selection` | `/api/v1/pkb/knowledge/knowledge-bases/:id/document-selection` | 鉁?鍏卞瓨 |
|
||||
| **涓婁紶鏂囨。** | `/api/v1/documents` | `/api/v1/pkb/knowledge/documents` | 鉁?鍏卞瓨 |
|
||||
| **鏂囨。璇︽儏** | `/api/v1/documents/:id` | `/api/v1/pkb/knowledge/documents/:id` | 鉁?鍏卞瓨 |
|
||||
| **鍒犻櫎鏂囨。** | `/api/v1/documents/:id` | `/api/v1/pkb/knowledge/documents/:id` | 鉁?鍏卞瓨 |
|
||||
| **鎵瑰<EFBFBD>鐞嗕换鍔?* | `/api/v1/batch/*` | `/api/v1/pkb/batch-tasks/*` | 鉁?鍏卞瓨 |
|
||||
| **健康检查** | N/A | `/api/v2/pkb/health` | ✅ v2独有 |
|
||||
| **知识库列表** | `/api/v1/knowledge-bases` | `/api/v2/pkb/knowledge/knowledge-bases` | ✅ 共存 |
|
||||
| **创建知识库** | `/api/v1/knowledge-bases` | `/api/v2/pkb/knowledge/knowledge-bases` | ✅ 共存 |
|
||||
| **知识库详情** | `/api/v1/knowledge-bases/:id` | `/api/v2/pkb/knowledge/knowledge-bases/:id` | ✅ 共存 |
|
||||
| **更新知识库** | `/api/v1/knowledge-bases/:id` | `/api/v2/pkb/knowledge/knowledge-bases/:id` | ✅ 共存 |
|
||||
| **删除知识库** | `/api/v1/knowledge-bases/:id` | `/api/v2/pkb/knowledge/knowledge-bases/:id` | ✅ 共存 |
|
||||
| **RAG检索** | `/api/v1/knowledge-bases/:id/search` | `/api/v2/pkb/knowledge/knowledge-bases/:id/search` | ✅ 共存 |
|
||||
| **知识库统计** | `/api/v1/knowledge-bases/:id/stats` | `/api/v2/pkb/knowledge/knowledge-bases/:id/stats` | ✅ 共存 |
|
||||
| **文档选择** | `/api/v1/knowledge-bases/:id/document-selection` | `/api/v2/pkb/knowledge/knowledge-bases/:id/document-selection` | ✅ 共存 |
|
||||
| **上传文档** | `/api/v1/documents` | `/api/v2/pkb/knowledge/documents` | ✅ 共存 |
|
||||
| **文档详情** | `/api/v1/documents/:id` | `/api/v2/pkb/knowledge/documents/:id` | ✅ 共存 |
|
||||
| **删除文档** | `/api/v1/documents/:id` | `/api/v2/pkb/knowledge/documents/:id` | ✅ 共存 |
|
||||
| **批处理任务** | `/api/v1/batch/*` | `/api/v2/pkb/batch-tasks/*` | ✅ 共存 |
|
||||
|
||||
### 路由前缀结构
|
||||
|
||||
```
|
||||
/api/v1/ (鏃х増鏈?- Legacy)
|
||||
/api/v1/ (旧版本 - Legacy)
|
||||
├─ knowledge-bases (知识库CRUD)
|
||||
├─ documents (文档管理)
|
||||
鈹斺攢 batch (鎵瑰<EFBFBD>鐞?
|
||||
└─ batch (批处理)
|
||||
|
||||
/api/v1/pkb/ (鏂扮増鏈?- Modules鏋舵瀯)
|
||||
鈹溾攢 health (鍋ュ悍妫€鏌? 鈫?鏂板<E98F82>
|
||||
/api/v2/pkb/ (新版本 - Modules架构)
|
||||
├─ health (健康检查) ← 新增
|
||||
├─ knowledge/
|
||||
鈹? 鈹溾攢 knowledge-bases (鐭ヨ瘑搴揅RUD)
|
||||
鈹? 鈹斺攢 documents (鏂囨。绠$悊)
|
||||
鈹斺攢 batch-tasks/ (鎵瑰<EFBFBD>鐞?
|
||||
│ ├─ knowledge-bases (知识库CRUD)
|
||||
│ └─ documents (文档管理)
|
||||
└─ batch-tasks/ (批处理)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 馃洝锔?瀹夊叏淇濋殰
|
||||
## 🛡️ 安全保障
|
||||
|
||||
### 1. 闆跺奖鍝嶅師鍒?
|
||||
### 1. 零影响原则
|
||||
```bash
|
||||
鉁?鏃ц矾鐢卞畬鍏ㄦ湭淇<E6B9AD>敼
|
||||
鉁?鏃т唬鐮佺户缁<E688B7>娇鐢?legacy 璺<EFBFBD>敱
|
||||
鉁?鐜版湁鐢ㄦ埛鍜屽墠绔<E5A2A0>笉鍙楀奖鍝?
|
||||
✅ 旧路由完全未修改
|
||||
✅ 旧代码继续使用 legacy 路由
|
||||
✅ 现有用户和前端不受影响
|
||||
```
|
||||
|
||||
### 2. 独立运行
|
||||
```bash
|
||||
鉁?鏂版棫璺<E6A3AB>敱浣跨敤鐩稿悓鐨勬暟鎹<E69A9F>簱锛坧kb_schema锛?
|
||||
鉁?鏂版棫璺<E6A3AB>敱浣跨敤鐩稿悓鐨凷ervice灞?
|
||||
鉁?鏁版嵁100%涓€鑷?
|
||||
✅ 新旧路由使用相同的数据库(pkb_schema)
|
||||
✅ 新旧路由使用相同的Service层
|
||||
✅ 数据100%一致
|
||||
```
|
||||
|
||||
### 3. 灰度切换能力
|
||||
```bash
|
||||
鉁?鍓嶇<E98D93>鍙<EFBFBD>互閫夋嫨浣跨敤v1鎴杤2
|
||||
鉁?鍙<>互鎸夌敤鎴峰垎缁勫垏鎹?
|
||||
鉁?鍙<>互闅忔椂鍥炴粴鍒皏1
|
||||
✅ 前端可以选择使用v1或v2
|
||||
✅ 可以按用户分组切换
|
||||
✅ 可以随时回滚到v1
|
||||
```
|
||||
|
||||
---
|
||||
@@ -149,27 +149,27 @@ v1和v2返回的数据完全一致!
|
||||
## 🐛 遇到的问题及解决
|
||||
|
||||
### 问题1:pkbRoutes导入错误
|
||||
**閿欒<EFBFBD>淇℃伅锛?* `ReferenceError: pkbRoutes is not defined`
|
||||
**错误信息:** `ReferenceError: pkbRoutes is not defined`
|
||||
|
||||
**鍘熷洜锛?*
|
||||
**原因:**
|
||||
- 使用了错误的导入方式:`import { pkbRoutes } from './modules/pkb/index.js'`
|
||||
- 浣?pkb/routes/index.ts 瀵煎嚭鐨勬槸榛樿<EFBFBD>瀵煎嚭
|
||||
- 但 pkb/routes/index.ts 导出的是默认导出
|
||||
|
||||
**瑙e喅鏂规<EFBFBD>锛?*
|
||||
**解决方案:**
|
||||
```typescript
|
||||
// 鉁?姝g‘
|
||||
// ✅ 正确
|
||||
import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
```
|
||||
|
||||
### 闂<EFBFBD><EFBFBD>2锛歳egisterDCRoutes鏈<EFBFBD>畾涔?
|
||||
**閿欒<EFBFBD>淇℃伅锛?* `ReferenceError: registerDCRoutes is not defined`
|
||||
### 问题2:registerDCRoutes未定义
|
||||
**错误信息:** `ReferenceError: registerDCRoutes is not defined`
|
||||
|
||||
**鍘熷洜锛?*
|
||||
**原因:**
|
||||
- 在添加pkbRoutes导入时,不小心删除了DC模块的导入行
|
||||
|
||||
**瑙e喅鏂规<EFBFBD>锛?*
|
||||
**解决方案:**
|
||||
```typescript
|
||||
// 鎭㈠<EFBFBD>瀹屾暣鐨勫<EFBFBD>鍏?
|
||||
// 恢复完整的导入
|
||||
import { aslRoutes } from './modules/asl/routes/index.js';
|
||||
import { registerDCRoutes, initDCModule } from './modules/dc/index.js';
|
||||
import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
@@ -177,7 +177,7 @@ import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
|
||||
---
|
||||
|
||||
## 馃搳 鏁版嵁搴撻獙璇?
|
||||
## 📊 数据库验证
|
||||
|
||||
### 连接测试
|
||||
```json
|
||||
@@ -190,11 +190,11 @@ import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
}
|
||||
```
|
||||
|
||||
### 鏁版嵁涓€鑷存€?
|
||||
### 数据一致性
|
||||
```bash
|
||||
鉁?v1鍜寁2杩斿洖鐨勭煡璇嗗簱鏁版嵁瀹屽叏涓€鑷?
|
||||
鉁?鎵€鏈堿PI绔<49>偣鏁版嵁鍚屾<E98D9A>
|
||||
鉁?鏃犳暟鎹<E69A9F>涪澶辨垨閲嶅<E996B2>
|
||||
✅ v1和v2返回的知识库数据完全一致
|
||||
✅ 所有API端点数据同步
|
||||
✅ 无数据丢失或重复
|
||||
```
|
||||
|
||||
---
|
||||
@@ -203,106 +203,106 @@ import pkbRoutes from './modules/pkb/routes/index.js';
|
||||
|
||||
### 基础功能测试
|
||||
|
||||
- [x] **鍋ュ悍妫€鏌?* - `/api/v1/pkb/health`
|
||||
- 鉁?杩斿洖姝e父鐘舵€?
|
||||
- 鉁?鏄剧ず鏁版嵁搴撹繛鎺?
|
||||
- 鉁?鏄剧ず鐭ヨ瘑搴撴暟閲?
|
||||
- [x] **健康检查** - `/api/v2/pkb/health`
|
||||
- ✅ 返回正常状态
|
||||
- ✅ 显示数据库连接
|
||||
- ✅ 显示知识库数量
|
||||
|
||||
- [x] **鐭ヨ瘑搴撳垪琛<EFBFBD>紙v2锛?* - `/api/v1/pkb/knowledge/knowledge-bases`
|
||||
- 鉁?杩斿洖鐭ヨ瘑搴撳垪琛?
|
||||
- 鉁?鏁版嵁缁撴瀯姝g‘
|
||||
- [x] **知识库列表(v2)** - `/api/v2/pkb/knowledge/knowledge-bases`
|
||||
- ✅ 返回知识库列表
|
||||
- ✅ 数据结构正确
|
||||
|
||||
- [x] **鐭ヨ瘑搴撳垪琛<EFBFBD>紙v1锛?* - `/api/v1/knowledge-bases`
|
||||
- 鉁?浠嶇劧姝e父宸ヤ綔
|
||||
- 鉁?涓巚2鏁版嵁涓€鑷?
|
||||
- [x] **知识库列表(v1)** - `/api/v1/knowledge-bases`
|
||||
- ✅ 仍然正常工作
|
||||
- ✅ 与v2数据一致
|
||||
|
||||
### 鍙岃矾鐢卞叡瀛樻祴璇?
|
||||
### 双路由共存测试
|
||||
|
||||
- [x] **新旧路由同时可用**
|
||||
- 鉁?v1璺<31>敱姝e父
|
||||
- 鉁?v2璺<32>敱姝e父
|
||||
- 鉁?鍙<>互鍚屾椂璁块棶
|
||||
- ✅ v1路由正常
|
||||
- ✅ v2路由正常
|
||||
- ✅ 可以同时访问
|
||||
|
||||
- [x] **鏁版嵁涓€鑷存€?*
|
||||
- 鉁?鐩稿悓鐨勬暟鎹<E69A9F>簱
|
||||
- 鉁?鐩稿悓鐨勮繑鍥炵粨鏋?
|
||||
- 鉁?鏃犲啿绐?
|
||||
- [x] **数据一致性**
|
||||
- ✅ 相同的数据库
|
||||
- ✅ 相同的返回结果
|
||||
- ✅ 无冲突
|
||||
|
||||
---
|
||||
|
||||
## 🎓 关键经验
|
||||
|
||||
### 鉁?鎴愬姛瑕佺礌
|
||||
### ✅ 成功要素
|
||||
|
||||
1. **保守策略**
|
||||
- 新旧路由共存
|
||||
- 不删除旧代码
|
||||
- 娓愯繘寮忓垏鎹?
|
||||
- 渐进式切换
|
||||
|
||||
2. **独立验证**
|
||||
- 鍋ュ悍妫€鏌ョ<EFBFBD>鐐?
|
||||
- 鍙岃矾鐢卞悓鏃舵祴璇?
|
||||
- 鏁版嵁涓€鑷存€ч獙璇?
|
||||
- 健康检查端点
|
||||
- 双路由同时测试
|
||||
- 数据一致性验证
|
||||
|
||||
3. **蹇<EFBFBD>€熶慨澶?*
|
||||
3. **快速修复**
|
||||
- 发现导入错误
|
||||
- 立即修复
|
||||
- 重新验证
|
||||
|
||||
### 馃摎 瀛﹀埌鐨勬暀璁?
|
||||
### 📚 学到的教训
|
||||
|
||||
1. **小心导入顺序**
|
||||
- 娣诲姞鏂板<EFBFBD>鍏ユ椂瑕佷繚鎸佸師鏈夊<EFBFBD>鍏ュ畬鏁?
|
||||
- 浣跨敤姝g‘鐨勫<EFBFBD>鍏ユ柟寮忥紙default vs named锛?
|
||||
- 添加新导入时要保持原有导入完整
|
||||
- 使用正确的导入方式(default vs named)
|
||||
|
||||
2. **完整测试**
|
||||
- 涓嶄粎娴嬭瘯鏂板姛鑳?
|
||||
- 杩樿<EFBFBD>楠岃瘉鏃у姛鑳芥湭鍙楀奖鍝?
|
||||
- 不仅测试新功能
|
||||
- 还要验证旧功能未受影响
|
||||
|
||||
3. **娓呮櫚鐨勮矾鐢卞懡鍚?*
|
||||
3. **清晰的路由命名**
|
||||
- v1和v2路径清晰区分
|
||||
- 渚夸簬鐞嗚В鍜岀淮鎶?
|
||||
- 便于理解和维护
|
||||
|
||||
---
|
||||
|
||||
## 🚀 下一步:阶段3
|
||||
|
||||
**闃舵<EFBFBD>3鐩<EFBFBD>爣锛氬悗绔<EFBFBD>姛鑳藉叏闈㈤獙璇?*
|
||||
**阶段3目标:后端功能全面验证**
|
||||
|
||||
棰勪及鏃堕棿锛?.5澶?
|
||||
预估时间:0.5天
|
||||
|
||||
### 任务清单
|
||||
1. 鉁?闃舵<E99783>2瀹屾垚
|
||||
1. ✅ 阶段2完成
|
||||
2. ⏭️ 创建完整的API测试脚本
|
||||
3. 鈴<EFBFBD>笍 娴嬭瘯鎵€鏈?1涓狝PI绔<49>偣锛坴2锛?
|
||||
4. 鈴<EFBFBD>笍 瀵规瘮v1鍜寁2鐨勮繑鍥炵粨鏋?
|
||||
3. ⏭️ 测试所有11个API端点(v2)
|
||||
4. ⏭️ 对比v1和v2的返回结果
|
||||
5. ⏭️ 边界条件测试
|
||||
6. ⏭️ 性能对比测试
|
||||
|
||||
---
|
||||
|
||||
## 鉁?闃舵<E99783>2鎴愬姛鏍囧噯杈炬垚
|
||||
## ✅ 阶段2成功标准达成
|
||||
|
||||
- 鉁?**鏂拌矾鐢辨敞鍐?*锛?api/v2/pkb/* 宸叉敞鍐?
|
||||
- 鉁?**鍋ュ悍妫€鏌?*锛氱嫭绔嬬<E7BB94>鐐瑰彲鐢?
|
||||
- 鉁?**鍙岃矾鐢卞叡瀛?*锛歷1鍜寁2鍚屾椂宸ヤ綔
|
||||
- 鉁?**鏁版嵁涓€鑷存€?*锛氬畬鍏ㄧ浉鍚岀殑鏁版嵁
|
||||
- 鉁?**闆跺奖鍝?*锛氭棫绯荤粺100%姝e父
|
||||
- 鉁?**蹇<>€熶慨澶?*锛氶亣鍒伴棶棰樼珛鍗宠В鍐?
|
||||
- ✅ **新路由注册**:/api/v2/pkb/* 已注册
|
||||
- ✅ **健康检查**:独立端点可用
|
||||
- ✅ **双路由共存**:v1和v2同时工作
|
||||
- ✅ **数据一致性**:完全相同的数据
|
||||
- ✅ **零影响**:旧系统100%正常
|
||||
- ✅ **快速修复**:遇到问题立即解决
|
||||
|
||||
---
|
||||
|
||||
**闃舵<EFBFBD>2璇勪及锛氣渽 鎴愬姛瀹屾垚锛屽彲浠ヨ繘鍏ラ樁娈?锛?* 馃帀
|
||||
**阶段2评估:✅ 成功完成,可以进入阶段3!** 🎉
|
||||
|
||||
---
|
||||
|
||||
## 📝 API文档更新
|
||||
|
||||
### 鏂板<EFBFBD>璺<EFBFBD>敱锛坴2锛?
|
||||
### 新增路由(v2)
|
||||
|
||||
#### 1. 鍋ュ悍妫€鏌?
|
||||
#### 1. 健康检查
|
||||
```http
|
||||
GET /api/v1/pkb/health
|
||||
GET /api/v2/pkb/health
|
||||
|
||||
Response:
|
||||
{
|
||||
@@ -319,70 +319,69 @@ Response:
|
||||
}
|
||||
```
|
||||
|
||||
#### 2. 鐭ヨ瘑搴撶<EFBFBD>鐞?
|
||||
#### 2. 知识库管理
|
||||
```http
|
||||
# 鑾峰彇鐭ヨ瘑搴撳垪琛?
|
||||
GET /api/v1/pkb/knowledge/knowledge-bases
|
||||
# 获取知识库列表
|
||||
GET /api/v2/pkb/knowledge/knowledge-bases
|
||||
|
||||
# 鍒涘缓鐭ヨ瘑搴?
|
||||
POST /api/v1/pkb/knowledge/knowledge-bases
|
||||
# 创建知识库
|
||||
POST /api/v2/pkb/knowledge/knowledge-bases
|
||||
|
||||
# 鑾峰彇鐭ヨ瘑搴撹<EFBFBD>鎯?
|
||||
GET /api/v1/pkb/knowledge/knowledge-bases/:id
|
||||
# 获取知识库详情
|
||||
GET /api/v2/pkb/knowledge/knowledge-bases/:id
|
||||
|
||||
# 鏇存柊鐭ヨ瘑搴?
|
||||
PUT /api/v1/pkb/knowledge/knowledge-bases/:id
|
||||
# 更新知识库
|
||||
PUT /api/v2/pkb/knowledge/knowledge-bases/:id
|
||||
|
||||
# 鍒犻櫎鐭ヨ瘑搴?
|
||||
DELETE /api/v1/pkb/knowledge/knowledge-bases/:id
|
||||
# 删除知识库
|
||||
DELETE /api/v2/pkb/knowledge/knowledge-bases/:id
|
||||
|
||||
# RAG妫€绱?
|
||||
GET /api/v1/pkb/knowledge/knowledge-bases/:id/search
|
||||
# RAG检索
|
||||
GET /api/v2/pkb/knowledge/knowledge-bases/:id/search
|
||||
|
||||
# 统计信息
|
||||
GET /api/v1/pkb/knowledge/knowledge-bases/:id/stats
|
||||
GET /api/v2/pkb/knowledge/knowledge-bases/:id/stats
|
||||
|
||||
# 文档选择(全文阅读模式)
|
||||
GET /api/v1/pkb/knowledge/knowledge-bases/:id/document-selection
|
||||
GET /api/v2/pkb/knowledge/knowledge-bases/:id/document-selection
|
||||
```
|
||||
|
||||
#### 3. 文档管理
|
||||
```http
|
||||
# 上传文档
|
||||
POST /api/v1/pkb/knowledge/documents
|
||||
POST /api/v2/pkb/knowledge/documents
|
||||
|
||||
# 获取文档详情
|
||||
GET /api/v1/pkb/knowledge/documents/:id
|
||||
GET /api/v2/pkb/knowledge/documents/:id
|
||||
|
||||
# 删除文档
|
||||
DELETE /api/v1/pkb/knowledge/documents/:id
|
||||
DELETE /api/v2/pkb/knowledge/documents/:id
|
||||
```
|
||||
|
||||
#### 4. 鎵瑰<EFBFBD>鐞?
|
||||
#### 4. 批处理
|
||||
```http
|
||||
# 鎵ц<EFBFBD>鎵瑰<EFBFBD>鐞?
|
||||
POST /api/v1/pkb/batch-tasks/batch/execute
|
||||
# 执行批处理
|
||||
POST /api/v2/pkb/batch-tasks/batch/execute
|
||||
|
||||
# 鑾峰彇浠诲姟鐘舵€?
|
||||
GET /api/v1/pkb/batch-tasks/batch/tasks/:taskId
|
||||
# 获取任务状态
|
||||
GET /api/v2/pkb/batch-tasks/batch/tasks/:taskId
|
||||
|
||||
# 获取任务结果
|
||||
GET /api/v1/pkb/batch-tasks/batch/tasks/:taskId/results
|
||||
GET /api/v2/pkb/batch-tasks/batch/tasks/:taskId/results
|
||||
|
||||
# 閲嶈瘯澶辫触鐨勬枃妗?
|
||||
POST /api/v1/pkb/batch-tasks/batch/tasks/:taskId/retry-failed
|
||||
# 重试失败的文档
|
||||
POST /api/v2/pkb/batch-tasks/batch/tasks/:taskId/retry-failed
|
||||
|
||||
# 获取模板
|
||||
GET /api/v1/pkb/batch-tasks/batch/templates
|
||||
GET /api/v2/pkb/batch-tasks/batch/templates
|
||||
```
|
||||
|
||||
### 鏃ц矾鐢憋紙v1锛? 淇濇寔涓嶅彉
|
||||
鎵€鏈?`/api/v1/knowledge*` 鍜?`/api/v1/batch*` 璺<EFBFBD>敱缁х画鍙<EFBFBD>敤銆?
|
||||
### 旧路由(v1)- 保持不变
|
||||
所有 `/api/v1/knowledge*` 和 `/api/v1/batch*` 路由继续可用。
|
||||
|
||||
---
|
||||
|
||||
**鏂囨。鏇存柊瀹屾垚锛?* 馃摎
|
||||
|
||||
**文档更新完成!** 📚
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user