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,24 +1,24 @@
|
||||
# PKB銝芯犖<EFBFBD>亥<EFBFBD>摨?- 頞<>漣摰匧<E691B0>餈<EFBFBD>宏<EFBFBD>扯<EFBFBD>霈∪<E99C88>
|
||||
# PKB个人知识库 - 超级安全迁移执行计划
|
||||
|
||||
> **<EFBFBD>𥕦遣<EFBFBD>交<EFBFBD>嚗?* 2026-01-06
|
||||
> **<EFBFBD>格<EFBFBD>嚗?* 撠<>KB隞擧唂<E693A7>嗆<EFBFBD>餈<EFBFBD>宏<EFBFBD>唳鰵<E594B3>嗆<EFBFBD>嚗𣬚&靽嗪妟憌𡡞埯<F0A1A19E><E59FAF>虾<EFBFBD>墧<EFBFBD><E5A2A7><EFBFBD>虾撉諹<E69289>
|
||||
> **<EFBFBD>笔<EFBFBD>嚗?* 靽嘥<E99DBD><E598A5><EFBFBD><EFBFBD>餈䜘<E9A488><E49C98><EFBFBD>甇亙虾撉諹<E69289><E8ABB9><EFBFBD><EFBFBD><EFBFBD>嗅虾<E59785>墧<EFBFBD>
|
||||
> **创建日期:** 2026-01-06
|
||||
> **目标:** 将PKB从旧架构迁移到新架构,确保零风险、可回滚、可验证
|
||||
> **原则:** 保守、渐进、每步可验证、随时可回滚
|
||||
|
||||
---
|
||||
|
||||
## 🎯 迁移目标
|
||||
|
||||
将PKB从旧架构迁移到新架构,同时:
|
||||
- <EFBFBD>?靽脲<E99DBD><E884B2>唳<EFBFBD><E594B3>蠘<EFBFBD>100%<EFBFBD>舐鍂
|
||||
- <EFBFBD>?銝滚蔣<E6BB9A>齿迤<E9BDBF>其蝙<E585B6>函<EFBFBD><E587BD>冽<EFBFBD>
|
||||
- <EFBFBD>?瘥譍<E798A5>甇仿<E79487><E4BBBF>臭誑撉諹<E69289><E8ABB9><EFBFBD><EFBFBD>皛?
|
||||
- <EFBFBD>?<3F>唳旿<E594B3>嗆<EFBFBD>憭?
|
||||
- ✅ 保持现有功能100%可用
|
||||
- ✅ 不影响正在使用的用户
|
||||
- ✅ 每一步都可以验证和回滚
|
||||
- ✅ 数据零损失
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 敶枏<E695B6><E69E8F>嗆<EFBFBD><E59786><EFBFBD><EFBFBD>?
|
||||
## 📊 当前状态分析
|
||||
|
||||
### <EFBFBD>扳沲<EFBFBD><EFBFBD><EFBFBD>蝵?
|
||||
### 旧架构位置
|
||||
```
|
||||
后端:backend/src/legacy/
|
||||
├─ controllers/knowledgeBaseController.ts
|
||||
@@ -28,10 +28,10 @@
|
||||
前端:frontend/src/
|
||||
└─ pages/KnowledgePage.tsx
|
||||
|
||||
<EFBFBD>唳旿摨橒<EFBFBD><EFBFBD>?pkb_schema嚗<EFBFBD>歇<EFBFBD>函𡠺蝡喹chema嚗峕<EFBFBD><EFBFBD><EFBFBD>餈<EFBFBD>宏嚗?
|
||||
数据库:✅ pkb_schema(已在独立Schema,无需迁移)
|
||||
```
|
||||
|
||||
### <EFBFBD>唳沲<EFBFBD><EFBFBD><EFBFBD>蝵?
|
||||
### 新架构位置
|
||||
```
|
||||
后端:backend/src/modules/pkb/
|
||||
├─ controllers/
|
||||
@@ -46,69 +46,69 @@
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> <20><>𧫴畾菜<E795BE>銵諹恣<E8ABB9>?
|
||||
## 🚀 分阶段执行计划
|
||||
|
||||
### ⏱️ 时间估算
|
||||
|
||||
| <EFBFBD>嗆挾 | 隞餃𦛚 | 憸<>摯<EFBFBD>園𡢿 | <20>臬<EFBFBD>皛?| 憌𡡞埯 |
|
||||
| 阶段 | 任务 | 预估时间 | 可回滚 | 风险 |
|
||||
|-----|------|---------|--------|-----|
|
||||
| **<EFBFBD>嗆挾0** | 隞<EFBFBD><EFBFBD>摰⊥䰻<EFBFBD><EFBFBD><EFBFBD>憭?| 0.5憭?| N/A | <EFBFBD>?|
|
||||
| **<EFBFBD>嗆挾1** | <EFBFBD>𡒊垢隞<EFBFBD><EFBFBD>憭滚<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>𣳇膄<EFBFBD>找誨<EFBFBD><EFBFBD><EFBFBD> | 0.5憭?| <20>?| <20><><EFBFBD> |
|
||||
| **<EFBFBD>嗆挾2** | <EFBFBD>𡒊垢API頝舐眏瘛餃<EFBFBD>嚗<EFBFBD><EFBFBD>頝舐眏<EFBFBD>勗<EFBFBD>嚗?| 0.5憭?| <20>?| <20><><EFBFBD> |
|
||||
| **<EFBFBD>嗆挾3** | <EFBFBD>𡒊垢<EFBFBD>蠘<EFBFBD>撉諹<EFBFBD> | 0.5憭?| <20>?| 雿?|
|
||||
| **<EFBFBD>嗆挾4** | <EFBFBD>滨垢隞<EFBFBD><EFBFBD>憭滚<EFBFBD> | 0.5憭?| <20>?| <20><><EFBFBD> |
|
||||
| **<EFBFBD>嗆挾5** | <EFBFBD>滨垢頝舐眏瘛餃<EFBFBD>嚗<EFBFBD><EFBFBD>頝舐眏<EFBFBD>勗<EFBFBD>嚗?| 0.5憭?| <20>?| <20><><EFBFBD> |
|
||||
| **<EFBFBD>嗆挾6** | <EFBFBD>滨垢<EFBFBD>蠘<EFBFBD>撉諹<EFBFBD> | 0.5憭?| <20>?| 雿?|
|
||||
| **<EFBFBD>嗆挾7** | <EFBFBD>啣漲<EFBFBD>穃<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>賢<EFBFBD><EFBFBD>喉<EFBFBD> | 1憭?| <20>?| 銝?|
|
||||
| **<EFBFBD>嗆挾8** | <EFBFBD>券<EFBFBD><EFBFBD><EFBFBD>揢 | 0.5憭?| <20>?| 雿?|
|
||||
| **<EFBFBD>嗆挾9** | 皜<EFBFBD><EFBFBD><EFBFBD>找誨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>舫<EFBFBD>㚁<EFBFBD> | 0.5憭?| <20>𩤃<EFBFBD> | 雿?|
|
||||
| **阶段0** | 代码审查和准备 | 0.5天 | N/A | 无 |
|
||||
| **阶段1** | 后端代码复制(不删除旧代码) | 0.5天 | ✅ | 极低 |
|
||||
| **阶段2** | 后端API路由添加(双路由共存) | 0.5天 | ✅ | 极低 |
|
||||
| **阶段3** | 后端功能验证 | 0.5天 | ✅ | 低 |
|
||||
| **阶段4** | 前端代码复制 | 0.5天 | ✅ | 极低 |
|
||||
| **阶段5** | 前端路由添加(双路由共存) | 0.5天 | ✅ | 极低 |
|
||||
| **阶段6** | 前端功能验证 | 0.5天 | ✅ | 低 |
|
||||
| **阶段7** | 灰度发布(功能开关) | 1天 | ✅ | 中 |
|
||||
| **阶段8** | 全量切换 | 0.5天 | ✅ | 低 |
|
||||
| **阶段9** | 清理旧代码(可选) | 0.5天 | ⚠️ | 低 |
|
||||
|
||||
**<EFBFBD>餉恣嚗𡁶漲 5-6憭抬<E686AD>靽嘥<E99DBD>隡啗恣嚗?*
|
||||
**总计:约 5-6天(保守估计)**
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> <20>嗆挾0嚗帋誨<E5B88B><E8AAA8>恣<EFBFBD>亙<EFBFBD><E4BA99><EFBFBD><EFBFBD>嚗?.5憭抬<EFBFBD>
|
||||
## 📝 阶段0:代码审查和准备(0.5天)
|
||||
|
||||
### 目标
|
||||
- 理解现有代码的所有功能点
|
||||
- 确认依赖关系
|
||||
- <EFBFBD>嗅<EFBFBD>霂衣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝘餅<EFBFBD><EFBFBD>?
|
||||
- 制定详细的迁移清单
|
||||
|
||||
### 任务清单
|
||||
|
||||
#### Task 0.1:审查旧代码结构
|
||||
```bash
|
||||
# 后端代码审查
|
||||
- [ ] <EFBFBD><EFBFBD>粉 knowledgeBaseController.ts嚗<EFBFBD><EFBFBD><EFBFBD>𡅅PI蝡舐<EFBFBD>嚗?
|
||||
- [ ] <EFBFBD><EFBFBD>粉 knowledgeBaseService.ts嚗<EFBFBD><EFBFBD><EFBFBD>劐<EFBFBD><EFBFBD>⊿<EFBFBD>餉<EFBFBD>嚗?
|
||||
- [ ] 阅读 knowledgeBaseController.ts(所有API端点)
|
||||
- [ ] 阅读 knowledgeBaseService.ts(所有业务逻辑)
|
||||
- [ ] 阅读 knowledgeBases.ts(路由定义)
|
||||
- [ ] <EFBFBD>堒枂<EFBFBD><EFBFBD><EFBFBD>𡅅PI蝡舐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
- [ ] 列出所有API端点和功能
|
||||
|
||||
# 前端代码审查
|
||||
- [ ] 阅读 KnowledgePage.tsx(UI和交互)
|
||||
- [ ] <EFBFBD>堒枂<EFBFBD><EFBFBD><EFBFBD>厩鍂<EFBFBD>瑟<EFBFBD>雿𨀣<EFBFBD>蝔?
|
||||
- [ ] 蝖株恕<EFBFBD>嗆<EFBFBD><EFBFBD>恣<EFBFBD><EFBFBD>䲮撘?
|
||||
- [ ] 列出所有用户操作流程
|
||||
- [ ] 确认状态管理方式
|
||||
```
|
||||
|
||||
#### Task 0.2:确认数据库Schema
|
||||
```bash
|
||||
- [ ] 撉諹<EFBFBD>pkb_schema銵函<EFBFBD><EFBFBD>?
|
||||
- [ ] 验证pkb_schema表结构
|
||||
- [ ] 确认Prisma模型定义
|
||||
- [ ] 璉<EFBFBD><EFBFBD>交糓<EFBFBD>行<EFBFBD><EFBFBD>扳㺭<EFBFBD>?
|
||||
- [ ] 蝖株恕蝝W<EFBFBD><EFBFBD>𣬚漲<EFBFBD>?
|
||||
- [ ] 检查是否有旧数据
|
||||
- [ ] 确认索引和约束
|
||||
```
|
||||
|
||||
#### Task 0.3嚗𡁜<EFBFBD>撱箏<EFBFBD><EFBFBD>賣<EFBFBD><EFBFBD>?
|
||||
#### Task 0.3:创建功能清单
|
||||
```bash
|
||||
- [ ] <EFBFBD>堒枂<EFBFBD><EFBFBD><EFBFBD>匧<EFBFBD><EFBFBD>踝<EFBFBD>CRUD<EFBFBD><EFBFBD><EFBFBD>隡𨬭<EFBFBD><EFBFBD><EFBFBD>蝝Y<EFBFBD>嚗?
|
||||
- [ ] 列出所有功能(CRUD、上传、检索等)
|
||||
- [ ] 创建测试用例
|
||||
- [ ] 准备测试数据
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F><><EFBFBD>劐誨<E58A90><E8AAA8>歇<EFBFBD><E6AD87>粉撟嗥<E6929F>閫?
|
||||
- <EFBFBD>?<3F>蠘<EFBFBD>皜<EFBFBD><E79A9C>撌脣<E6928C>撱?
|
||||
- <EFBFBD>?瘚贝<E7989A><E8B49D>其<EFBFBD>撌脣<E6928C>憭?
|
||||
- ✅ 所有代码已阅读并理解
|
||||
- ✅ 功能清单已创建
|
||||
- ✅ 测试用例已准备
|
||||
|
||||
### 回滚方案
|
||||
- 无需回滚(只是阅读代码)
|
||||
@@ -119,8 +119,8 @@
|
||||
|
||||
### 目标
|
||||
- 将旧代码复制到新位置
|
||||
- **銝滚<EFBFBD><EFBFBD>扎<EFBFBD><EFBFBD><EFBFBD>靽格㺿<EFBFBD>找誨<EFBFBD>?*
|
||||
- 蝖桐<EFBFBD><EFBFBD>唬誨<EFBFBD><EFBFBD>虾隞亦𡠺蝡讠<EFBFBD>霂?
|
||||
- **不删除、不修改旧代码**
|
||||
- 确保新代码可以独立编译
|
||||
|
||||
### 任务清单
|
||||
|
||||
@@ -136,11 +136,11 @@ mkdir -p backend/src/modules/pkb/utils
|
||||
|
||||
#### Task 1.2:复制Controller代码
|
||||
```bash
|
||||
# 憭滚<EFBFBD><EFBFBD><EFBFBD>辣嚗<EFBFBD><EFBFBD><EFBFBD>蹱唂<EFBFBD><EFBFBD>辣嚗?
|
||||
# 复制文件(保留旧文件)
|
||||
cp backend/src/legacy/controllers/knowledgeBaseController.ts \
|
||||
backend/src/modules/pkb/controllers/knowledgeBaseController.ts
|
||||
|
||||
# 撉諹<EFBFBD>嚗𡁏唂<EFBFBD><EFBFBD>辣隞滚<EFBFBD><EFBFBD>?
|
||||
# 验证:旧文件仍存在
|
||||
ls -la backend/src/legacy/controllers/knowledgeBaseController.ts
|
||||
```
|
||||
|
||||
@@ -156,17 +156,17 @@ cp backend/src/legacy/routes/knowledgeBases.ts \
|
||||
backend/src/modules/pkb/routes/knowledgeBases.ts
|
||||
```
|
||||
|
||||
#### Task 1.5嚗𡁏凒<EFBFBD>啣紡<EFBFBD>亥楝敺?
|
||||
#### Task 1.5:更新导入路径
|
||||
```typescript
|
||||
// <EFBFBD>冽鰵隞<EFBFBD><EFBFBD>銝哨<EFBFBD><EFBFBD>湔鰵<EFBFBD><EFBFBD><EFBFBD>?import 頝臬<EFBFBD>
|
||||
// 隞? import { xxx } from '../../legacy/...'
|
||||
// <EFBFBD>? import { xxx } from '../services/...'
|
||||
// 在新代码中,更新所有 import 路径
|
||||
// 从: import { xxx } from '../../legacy/...'
|
||||
// 到: import { xxx } from '../services/...'
|
||||
|
||||
// 但是:依赖common层的保持不变
|
||||
import { prisma } from '../../../../common/database/prisma';
|
||||
```
|
||||
|
||||
#### Task 1.6嚗𡁶<EFBFBD>霂煾<EFBFBD>霂?
|
||||
#### Task 1.6:编译验证
|
||||
```bash
|
||||
# 编译检查(不运行)
|
||||
cd backend
|
||||
@@ -177,13 +177,13 @@ npm run build
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F>唬誨<E594AC><E8AAA8><EFBFBD>霂煾<E99C82>朞<EFBFBD>
|
||||
- <EFBFBD>?<3F>找誨<E689BE><E8AAA8><EFBFBD><EFBFBD>冽𧊋<E586BD>?
|
||||
- <EFBFBD>?<3F>抒頂蝏煺<E89D8F><E785BA>舀迤撣貉<E692A3>銵?
|
||||
- ✅ 新代码编译通过
|
||||
- ✅ 旧代码完全未动
|
||||
- ✅ 旧系统仍可正常运行
|
||||
|
||||
### 回滚方案
|
||||
```bash
|
||||
# 憒<EFBFBD><EFBFBD><EFBFBD>粹䔮憸矋<EFBFBD><EFBFBD>湔𦻖<EFBFBD>𣳇膄<EFBFBD>啁𤌍敶?
|
||||
# 如果出问题,直接删除新目录
|
||||
rm -rf backend/src/modules/pkb
|
||||
# 旧代码完全未动,系统继续运行
|
||||
```
|
||||
@@ -201,27 +201,27 @@ rm -rf backend/src/modules/pkb
|
||||
|
||||
#### Task 2.1:注册新路由(不影响旧路由)
|
||||
```typescript
|
||||
// backend/src/index.ts <EFBFBD>?routes/index.ts
|
||||
// backend/src/index.ts 或 routes/index.ts
|
||||
|
||||
// <EFBFBD>扯楝<EFBFBD>梧<EFBFBD>靽脲<EFBFBD>銝滚<EFBFBD>嚗?
|
||||
// 旧路由(保持不变)
|
||||
import legacyKnowledgeRoutes from './legacy/routes/knowledgeBases';
|
||||
app.use('/api/v1/knowledge', legacyKnowledgeRoutes);
|
||||
|
||||
// <EFBFBD>啗楝<EFBFBD>梧<EFBFBD><EFBFBD>啣<EFBFBD>嚗?
|
||||
// 新路由(新增)
|
||||
import newKnowledgeRoutes from './modules/pkb/routes/knowledgeBases';
|
||||
app.use('/api/v2/knowledge', newKnowledgeRoutes); // 使用v2路径
|
||||
```
|
||||
|
||||
#### Task 2.2嚗𡁶&霈方楝<EFBFBD>梢<EFBFBD>蝳?
|
||||
#### Task 2.2:确认路由隔离
|
||||
```bash
|
||||
# 新路由路径:/api/v2/knowledge/*
|
||||
# 旧路由路径:/api/v1/knowledge/*
|
||||
# 两者完全独立,互不干扰
|
||||
```
|
||||
|
||||
#### Task 2.3嚗𡁏溶<EFBFBD>惩<EFBFBD>摨瑟<EFBFBD><EFBFBD>亦垢<EFBFBD>?
|
||||
#### Task 2.3:添加健康检查端点
|
||||
```typescript
|
||||
// <EFBFBD>冽鰵頝舐眏銝剜溶<EFBFBD>惩<EFBFBD>摨瑟<EFBFBD><EFBFBD>?
|
||||
// 在新路由中添加健康检查
|
||||
router.get('/health', (req, res) => {
|
||||
res.json({
|
||||
status: 'ok',
|
||||
@@ -233,38 +233,38 @@ router.get('/health', (req, res) => {
|
||||
|
||||
### 验证标准
|
||||
|
||||
#### 撉諹<EFBFBD><EFBFBD>啗楝<EFBFBD>勗虾<EFBFBD>?
|
||||
#### 验证新路由可用
|
||||
```bash
|
||||
# <EFBFBD>臬𢆡<EFBFBD>滚𦛚<EFBFBD>?
|
||||
# 启动服务器
|
||||
npm run dev
|
||||
|
||||
# 瘚贝<EFBFBD><EFBFBD>啗楝<EFBFBD>勗<EFBFBD>摨瑟<EFBFBD><EFBFBD>?
|
||||
# 测试新路由健康检查
|
||||
curl http://localhost:3000/api/v2/knowledge/health
|
||||
# 期望返回:{"status":"ok","module":"pkb-v2",...}
|
||||
|
||||
# 确认旧路由仍工作
|
||||
curl http://localhost:3000/api/v1/knowledge/xxx
|
||||
# <EFBFBD><EFBFBD><EFBFBD>餈𥪜<EFBFBD>嚗𡁏迤撣豢㺭<EFBFBD>?
|
||||
# 期望返回:正常数据
|
||||
```
|
||||
|
||||
#### 撉諹<EFBFBD><EFBFBD>扯楝<EFBFBD>望𧊋<EFBFBD>堒蔣<EFBFBD>?
|
||||
#### 验证旧路由未受影响
|
||||
```bash
|
||||
# 使用Postman或curl测试所有旧API
|
||||
# 蝖桐<EFBFBD><EFBFBD><EFBFBD><EFBFBD>匧<EFBFBD><EFBFBD>賣迤撣?
|
||||
# 确保所有功能正常
|
||||
|
||||
# 靘见<EFBFBD>嚗?
|
||||
# 例如:
|
||||
curl -X GET http://localhost:3000/api/v1/knowledge/list
|
||||
curl -X POST http://localhost:3000/api/v1/knowledge/create
|
||||
# ... 瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD>厩垢<EFBFBD>?
|
||||
# ... 测试所有端点
|
||||
```
|
||||
|
||||
### 回滚方案
|
||||
```typescript
|
||||
// 憒<EFBFBD><EFBFBD><EFBFBD>啗楝<EFBFBD>望<EFBFBD><EFBFBD>桅<EFBFBD>嚗𣬚凒<EFBFBD>交釣<EFBFBD>𦠜<EFBFBD><EFBFBD>啗楝<EFBFBD>望釣<EFBFBD>?
|
||||
// 如果新路由有问题,直接注释掉新路由注册
|
||||
// import newKnowledgeRoutes from './modules/pkb/routes/knowledgeBases';
|
||||
// app.use('/api/v2/knowledge', newKnowledgeRoutes); // 瘜券<EFBFBD><EFBFBD>?
|
||||
// app.use('/api/v2/knowledge', newKnowledgeRoutes); // 注释掉
|
||||
|
||||
// <EFBFBD>扯楝<EFBFBD>梁誧蝏剖極雿頣<EFBFBD><EFBFBD>冽<EFBFBD><EFBFBD>䭾<EFBFBD><EFBFBD>?
|
||||
// 旧路由继续工作,用户无感知
|
||||
```
|
||||
|
||||
---
|
||||
@@ -272,13 +272,13 @@ curl -X POST http://localhost:3000/api/v1/knowledge/create
|
||||
## 📝 阶段3:后端功能验证(0.5天)
|
||||
|
||||
### 目标
|
||||
- 撉諹<EFBFBD><EFBFBD>啣<EFBFBD>蝡舀<EFBFBD><EFBFBD>匧<EFBFBD><EFBFBD>?
|
||||
- 验证新后端所有功能
|
||||
- 对比新旧API返回结果
|
||||
- 蝖桐<EFBFBD><EFBFBD>啣<EFBFBD>蝡臭<EFBFBD><EFBFBD>批<EFBFBD>蝡航<EFBFBD>銝箏<EFBFBD><EFBFBD>其<EFBFBD><EFBFBD>?
|
||||
- 确保新后端与旧后端行为完全一致
|
||||
|
||||
### 任务清单
|
||||
|
||||
#### Task 3.1嚗𡁜<EFBFBD>憭<EFBFBD><EFBFBD>霂閧㴓憓?
|
||||
#### Task 3.1:准备测试环境
|
||||
```bash
|
||||
# 创建测试用户
|
||||
# 准备测试数据(知识库、文档)
|
||||
@@ -288,37 +288,37 @@ curl -X POST http://localhost:3000/api/v1/knowledge/create
|
||||
#### Task 3.2:逐个测试API端点
|
||||
|
||||
```bash
|
||||
瘚贝<EFBFBD>皜<EFBFBD><EFBFBD>嚗?
|
||||
- [ ] GET /api/v2/knowledge/list - <EFBFBD>瑕<EFBFBD><EFBFBD>亥<EFBFBD>摨枏<EFBFBD>銵?
|
||||
- [ ] POST /api/v2/knowledge/create - <EFBFBD>𥕦遣<EFBFBD>亥<EFBFBD>摨?
|
||||
- [ ] GET /api/v2/knowledge/:id - <EFBFBD>瑕<EFBFBD><EFBFBD>亥<EFBFBD>摨栞祕<EFBFBD>?
|
||||
- [ ] PUT /api/v2/knowledge/:id - <EFBFBD>湔鰵<EFBFBD>亥<EFBFBD>摨?
|
||||
- [ ] DELETE /api/v2/knowledge/:id - <EFBFBD>𣳇膄<EFBFBD>亥<EFBFBD>摨?
|
||||
测试清单:
|
||||
- [ ] GET /api/v2/knowledge/list - 获取知识库列表
|
||||
- [ ] POST /api/v2/knowledge/create - 创建知识库
|
||||
- [ ] GET /api/v2/knowledge/:id - 获取知识库详情
|
||||
- [ ] PUT /api/v2/knowledge/:id - 更新知识库
|
||||
- [ ] DELETE /api/v2/knowledge/:id - 删除知识库
|
||||
- [ ] POST /api/v2/knowledge/:id/upload - 上传文档
|
||||
- [ ] GET /api/v2/knowledge/:id/documents - 获取文档列表
|
||||
- [ ] DELETE /api/v2/knowledge/:id/documents/:docId - 删除文档
|
||||
- [ ] POST /api/v2/knowledge/:id/query - RAG璉<EFBFBD>蝝?
|
||||
- [ ] GET /api/v2/knowledge/:id/batch-tasks - <EFBFBD>孵<EFBFBD><EFBFBD><EFBFBD>遙<EFBFBD>∪<EFBFBD>銵?
|
||||
- [ ] POST /api/v2/knowledge/:id/batch-tasks - <EFBFBD>𥕦遣<EFBFBD>孵<EFBFBD><EFBFBD><EFBFBD>遙<EFBFBD>?
|
||||
- [ ] POST /api/v2/knowledge/:id/query - RAG检索
|
||||
- [ ] GET /api/v2/knowledge/:id/batch-tasks - 批处理任务列表
|
||||
- [ ] POST /api/v2/knowledge/:id/batch-tasks - 创建批处理任务
|
||||
```
|
||||
|
||||
#### Task 3.3嚗𡁜笆瘥娍<EFBFBD>霂𤏪<EFBFBD><EFBFBD>唳唂API嚗?
|
||||
#### Task 3.3:对比测试(新旧API)
|
||||
```bash
|
||||
# 撖嫣<EFBFBD>瘥譍葵API嚗䔶蝙<EFBFBD>函㮾<EFBFBD><EFBFBD><EFBFBD><EFBFBD>啣<EFBFBD><EFBFBD>嗉<EFBFBD><EFBFBD>冽鰵<EFBFBD>扳𦻖<EFBFBD>?
|
||||
# 撖寞<EFBFBD>餈𥪜<EFBFBD>蝏𤘪<EFBFBD><EFBFBD>臬炏銝<EFBFBD><EFBFBD>?
|
||||
# 对于每个API,使用相同参数同时调用新旧接口
|
||||
# 对比返回结果是否一致
|
||||
|
||||
# 蝷箔<EFBFBD>嚗?
|
||||
# 示例:
|
||||
curl /api/v1/knowledge/list > old_result.json
|
||||
curl /api/v2/knowledge/list > new_result.json
|
||||
diff old_result.json new_result.json
|
||||
```
|
||||
|
||||
#### Task 3.4嚗朞器<EFBFBD>峕<EFBFBD>霂?
|
||||
#### Task 3.4:边界测试
|
||||
```bash
|
||||
- [ ] 测试无效参数
|
||||
- [ ] 测试权限控制
|
||||
- [ ] 测试并发请求
|
||||
- [ ] 瘚贝<EFBFBD>憭扳<EFBFBD>隞嗡<EFBFBD>隡?
|
||||
- [ ] 测试大文件上传
|
||||
- [ ] 测试错误处理
|
||||
```
|
||||
|
||||
@@ -331,24 +331,24 @@ diff old_result.json new_result.json
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F><><EFBFBD>𡅅PI蝡舐<E89DA1>瘚贝<E7989A><E8B49D>朞<EFBFBD>
|
||||
- <EFBFBD>?<3F>唳唂API餈𥪜<E9A488>蝏𤘪<E89D8F>銝<EFBFBD><E98A9D>?
|
||||
- <EFBFBD>?颲寧<E9A2B2><E5AFA7><EFBFBD><EFBFBD>憭<EFBFBD><E686AD>甇<EFBFBD>&
|
||||
- <EFBFBD>?<3F>扯<EFBFBD><E689AF>䭾<EFBFBD><E4ADBE>曆<EFBFBD><E69B86>?
|
||||
- ✅ 所有API端点测试通过
|
||||
- ✅ 新旧API返回结果一致
|
||||
- ✅ 边界情况处理正确
|
||||
- ✅ 性能无明显下降
|
||||
|
||||
### <EFBFBD>𤑳緵<EFBFBD>桅<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
### 发现问题的处理
|
||||
```bash
|
||||
憒<EFBFBD><EFBFBD><EFBFBD>𤑳緵<EFBFBD>桅<EFBFBD>嚗?
|
||||
如果发现问题:
|
||||
1. 记录问题详情
|
||||
2. 靽桀<EFBFBD><EFBFBD>唬誨<EFBFBD>?
|
||||
2. 修复新代码
|
||||
3. 重新测试
|
||||
4. 銝滚蔣<EFBFBD>齿唂蝟餌<EFBFBD>嚗<EFBFBD>唂頝舐眏蝏抒賒撌乩<EFBFBD>嚗?
|
||||
4. 不影响旧系统(旧路由继续工作)
|
||||
5. 可以随时暂停迁移
|
||||
```
|
||||
|
||||
### 回滚方案
|
||||
- <EFBFBD>𤑳緵銝仿<EFBFBD><EFBFBD>桅<EFBFBD><EFBFBD>塚<EFBFBD><EFBFBD>𨀣迫雿輻鍂<EFBFBD>啗楝<EFBFBD>?
|
||||
- <EFBFBD>扯楝<EFBFBD>梁誧蝏剖極雿?
|
||||
- 发现严重问题时,停止使用新路由
|
||||
- 旧路由继续工作
|
||||
- 有时间慢慢修复新代码
|
||||
|
||||
---
|
||||
@@ -357,8 +357,8 @@ diff old_result.json new_result.json
|
||||
|
||||
### 目标
|
||||
- 将旧前端代码复制到新位置
|
||||
- **銝滚<EFBFBD><EFBFBD>扎<EFBFBD><EFBFBD><EFBFBD>靽格㺿<EFBFBD>找誨<EFBFBD>?*
|
||||
- 蝖桐<EFBFBD><EFBFBD>唬誨<EFBFBD><EFBFBD>虾隞亦𡠺蝡讠<EFBFBD>霂?
|
||||
- **不删除、不修改旧代码**
|
||||
- 确保新代码可以独立编译
|
||||
|
||||
### 任务清单
|
||||
|
||||
@@ -371,7 +371,7 @@ mkdir -p frontend-v2/src/modules/pkb/types
|
||||
mkdir -p frontend-v2/src/modules/pkb/hooks
|
||||
```
|
||||
|
||||
#### Task 4.2嚗𡁜<EFBFBD><EFBFBD>園△<EFBFBD>V誨<EFBFBD>?
|
||||
#### Task 4.2:复制页面代码
|
||||
```bash
|
||||
cp frontend/src/pages/KnowledgePage.tsx \
|
||||
frontend-v2/src/modules/pkb/pages/KnowledgePage.tsx
|
||||
@@ -383,38 +383,38 @@ cp frontend/src/pages/KnowledgePage.tsx \
|
||||
// 创建新的API调用层,指向 /api/v2/knowledge/*
|
||||
```
|
||||
|
||||
#### Task 4.4嚗𡁏凒<EFBFBD>啣紡<EFBFBD>亥楝敺?
|
||||
#### Task 4.4:更新导入路径
|
||||
```typescript
|
||||
// 更新所有import路径
|
||||
// 雿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>函㮾<EFBFBD>𣬚<EFBFBD>UI蝏<EFBFBD>辣摨?
|
||||
// 但保持调用相同的UI组件库
|
||||
```
|
||||
|
||||
#### Task 4.5嚗𡁶<EFBFBD>霂煾<EFBFBD>霂?
|
||||
#### Task 4.5:编译验证
|
||||
```bash
|
||||
cd frontend-v2
|
||||
npm run build
|
||||
# 璉<EFBFBD><EFBFBD>亦<EFBFBD>霂煾<EFBFBD>霂?
|
||||
# 检查编译错误
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F>唬誨<E594AC><E8AAA8><EFBFBD>霂煾<E99C82>朞<EFBFBD>
|
||||
- <EFBFBD>?<3F>批<EFBFBD>蝡臬<E89DA1><E887AC>冽𧊋<E586BD>?
|
||||
- <EFBFBD>?<3F>批<EFBFBD>蝡臭<E89DA1><E887AD>舀迤撣貉挪<E8B289>?
|
||||
- ✅ 新代码编译通过
|
||||
- ✅ 旧前端完全未动
|
||||
- ✅ 旧前端仍可正常访问
|
||||
|
||||
### 回滚方案
|
||||
```bash
|
||||
# <EFBFBD>𣳇膄<EFBFBD>啁𤌍敶?
|
||||
# 删除新目录
|
||||
rm -rf frontend-v2/src/modules/pkb
|
||||
# <EFBFBD>批<EFBFBD>蝡舐誧蝏剖極雿?
|
||||
# 旧前端继续工作
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> <20>嗆挾5嚗𡁜<E59A97>蝡航楝<E888AA>望溶<E69C9B>𩤃<EFBFBD><F0A9A483>諹楝<E8ABB9>勗<EFBFBD>摮矋<E691AE>嚗?.5憭抬<EFBFBD>
|
||||
## 📝 阶段5:前端路由添加(双路由共存)(0.5天)
|
||||
|
||||
### 目标
|
||||
- 在新前端添加路由
|
||||
- **<EFBFBD>扯楝<EFBFBD>曹<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*
|
||||
- **旧路由保持不变**
|
||||
- 新旧页面同时可用
|
||||
|
||||
### 任务清单
|
||||
@@ -423,33 +423,33 @@ rm -rf frontend-v2/src/modules/pkb
|
||||
```typescript
|
||||
// frontend-v2/src/router/index.ts
|
||||
|
||||
// <EFBFBD>扯楝<EFBFBD>梧<EFBFBD>靽脲<EFBFBD>銝滚<EFBFBD>嚗? 憒<><E68692><EFBFBD>批<EFBFBD>蝡航<E89DA1><E888AA>刻<EFBFBD>銵?
|
||||
// 旧路由(保持不变)- 如果旧前端还在运行
|
||||
// 访问:http://localhost:5173/knowledge
|
||||
|
||||
// <EFBFBD>啗楝<EFBFBD>梧<EFBFBD><EFBFBD>啣<EFBFBD>嚗?
|
||||
// 新路由(新增)
|
||||
{
|
||||
path: '/pkb', // 雿輻鍂<EFBFBD>啗楝敺?
|
||||
path: '/pkb', // 使用新路径
|
||||
component: () => import('@/modules/pkb/pages/KnowledgePage.tsx'),
|
||||
meta: { title: 'PKB銝芯犖<EFBFBD>亥<EFBFBD>摨橒<EFBFBD><EFBFBD>啁<EFBFBD>嚗? }
|
||||
meta: { title: 'PKB个人知识库(新版)' }
|
||||
}
|
||||
```
|
||||
|
||||
#### Task 5.2:更新API调用
|
||||
```typescript
|
||||
// 蝖桐<EFBFBD><EFBFBD>啣<EFBFBD>蝡航<EFBFBD><EFBFBD>函<EFBFBD><EFBFBD>?/api/v2/knowledge/* 頝舐眏
|
||||
// 确保新前端调用的是 /api/v2/knowledge/* 路由
|
||||
const API_BASE = '/api/v2/knowledge';
|
||||
```
|
||||
|
||||
#### Task 5.3嚗𡁏溶<EFBFBD>删<EFBFBD><EFBFBD>祆<EFBFBD>霂?
|
||||
#### Task 5.3:添加版本标识
|
||||
```typescript
|
||||
// <EFBFBD>券△<EFBFBD>V<EFBFBD>瘛餃<EFBFBD><EFBFBD><EFBFBD>𧋦<EFBFBD><EFBFBD><EFBFBD>嚗峕䲮靘踹躹<EFBFBD><EFBFBD>鰵<EFBFBD>抒<EFBFBD><EFBFBD>?
|
||||
<div className="version-badge">V2 (<EFBFBD>唳沲<EFBFBD>?</div>
|
||||
// 在页面上添加版本标识,方便区分新旧版本
|
||||
<div className="version-badge">V2 (新架构)</div>
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F>啗楝<E59597>勗虾霈輸䔮嚗冴ttp://localhost:5174/pkb
|
||||
- <EFBFBD>?憿菟𢒰甇<F0A292B0>虜皜脫<E79A9C>
|
||||
- <EFBFBD>?<3F>删<EFBFBD>霂煾<E99C82>霂?
|
||||
- ✅ 新路由可访问:http://localhost:5174/pkb
|
||||
- ✅ 页面正常渲染
|
||||
- ✅ 无编译错误
|
||||
|
||||
### 回滚方案
|
||||
```typescript
|
||||
@@ -465,66 +465,66 @@ const API_BASE = '/api/v2/knowledge';
|
||||
## 📝 阶段6:前端功能验证(0.5天)
|
||||
|
||||
### 目标
|
||||
- 撉諹<EFBFBD><EFBFBD>啣<EFBFBD>蝡舀<EFBFBD><EFBFBD>匧<EFBFBD><EFBFBD>?
|
||||
- 蝖桐<EFBFBD><EFBFBD>冽<EFBFBD>雿㯄<EFBFBD>銝<EFBFBD><EFBFBD>?
|
||||
- 验证新前端所有功能
|
||||
- 确保用户体验一致
|
||||
- 发现并修复UI问题
|
||||
|
||||
### 任务清单
|
||||
|
||||
#### Task 6.1嚗𡁏<EFBFBD><EFBFBD>典<EFBFBD><EFBFBD>賣<EFBFBD>霂?
|
||||
#### Task 6.1:手动功能测试
|
||||
```bash
|
||||
瘚贝<EFBFBD>瘚<EFBFBD><EFBFBD>嚗?
|
||||
测试流程:
|
||||
1. [ ] 访问新页面:http://localhost:5174/pkb
|
||||
2. [ ] 登录功能
|
||||
3. [ ] <EFBFBD>亦<EFBFBD><EFBFBD>亥<EFBFBD>摨枏<EFBFBD>銵?
|
||||
3. [ ] 查看知识库列表
|
||||
4. [ ] 创建新知识库
|
||||
5. [ ] 上传文档
|
||||
6. [ ] 查看文档列表
|
||||
7. [ ] RAG璉<EFBFBD>蝝W<EFBFBD><EFBFBD>?
|
||||
8. [ ] 蝻𤥁<EFBFBD><EFBFBD>亥<EFBFBD>摨?
|
||||
7. [ ] RAG检索功能
|
||||
8. [ ] 编辑知识库
|
||||
9. [ ] 删除文档
|
||||
10. [ ] <EFBFBD>𣳇膄<EFBFBD>亥<EFBFBD>摨?
|
||||
11. [ ] <EFBFBD>孵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
10. [ ] 删除知识库
|
||||
11. [ ] 批处理功能
|
||||
12. [ ] 错误提示
|
||||
```
|
||||
|
||||
#### Task 6.2嚗䦧I銝<EFBFBD><EFBFBD>湔<EFBFBD>扳<EFBFBD><EFBFBD>?
|
||||
#### Task 6.2:UI一致性检查
|
||||
```bash
|
||||
- [ ] 布局是否正确
|
||||
- [ ] 样式是否正常
|
||||
- [ ] 交互是否流畅
|
||||
- [ ] <EFBFBD>㰘蝸<EFBFBD>嗆<EFBFBD><EFBFBD>遬蝷?
|
||||
- [ ] 加载状态显示
|
||||
- [ ] 错误提示友好
|
||||
```
|
||||
|
||||
#### Task 6.3嚗𡁏<EFBFBD>閫<EFBFBD>膥<EFBFBD>澆捆<EFBFBD>?
|
||||
#### Task 6.3:浏览器兼容性
|
||||
```bash
|
||||
- [ ] Chrome测试
|
||||
- [ ] Firefox测试
|
||||
- [ ] Safari瘚贝<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>撑ac嚗?
|
||||
- [ ] Safari测试(如有Mac)
|
||||
```
|
||||
|
||||
#### Task 6.4:响应式测试
|
||||
```bash
|
||||
- [ ] 獢屸𢒰蝡荔<EFBFBD>1920x1080嚗?
|
||||
- [ ] 撟單踎蝡荔<EFBFBD>768x1024嚗?
|
||||
- [ ] 蝘餃𢆡蝡荔<EFBFBD>375x667嚗?
|
||||
- [ ] 桌面端(1920x1080)
|
||||
- [ ] 平板端(768x1024)
|
||||
- [ ] 移动端(375x667)
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F><><EFBFBD>匧<EFBFBD><E58CA7>賣迤撣詨極雿?
|
||||
- <EFBFBD>?UI<55>曄內甇<E585A7>&
|
||||
- <EFBFBD>?<3F>䭾<EFBFBD><E4ADBE>鞍ug
|
||||
- <EFBFBD>?<3F>冽<EFBFBD>雿㯄<E99BBF><E3AF84>臬末
|
||||
- ✅ 所有功能正常工作
|
||||
- ✅ UI显示正确
|
||||
- ✅ 无明显bug
|
||||
- ✅ 用户体验良好
|
||||
|
||||
### <EFBFBD>𤑳緵<EFBFBD>桅<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
- 靽桀<EFBFBD><EFBFBD>啣<EFBFBD>蝡臭誨<EFBFBD>?
|
||||
- <EFBFBD>批<EFBFBD>蝡舐誧蝏剖虾<EFBFBD>?
|
||||
- 銝滚蔣<EFBFBD>滨緵<EFBFBD>厩鍂<EFBFBD>?
|
||||
### 发现问题的处理
|
||||
- 修复新前端代码
|
||||
- 旧前端继续可用
|
||||
- 不影响现有用户
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> <20>嗆挾7嚗𡁶<E59A97>摨血<E691A8>撣<EFBFBD><E692A3><EFBFBD>蠘<EFBFBD>撘<EFBFBD><E69298>喉<EFBFBD>嚗?憭抬<E686AD>
|
||||
## 📝 阶段7:灰度发布(功能开关)(1天)
|
||||
|
||||
### 目标
|
||||
- 让部分用户使用新版本
|
||||
@@ -533,7 +533,7 @@ const API_BASE = '/api/v2/knowledge';
|
||||
|
||||
### 任务清单
|
||||
|
||||
#### Task 7.1嚗𡁜<EFBFBD><EFBFBD>啣<EFBFBD><EFBFBD>賢<EFBFBD><EFBFBD>?
|
||||
#### Task 7.1:实现功能开关
|
||||
```typescript
|
||||
// backend/src/common/config/featureFlags.ts
|
||||
export const featureFlags = {
|
||||
@@ -541,7 +541,7 @@ export const featureFlags = {
|
||||
pkbV2UserWhitelist: process.env.PKB_V2_WHITELIST?.split(',') || [],
|
||||
};
|
||||
|
||||
// 銝剝𡢿隞嗆<EFBFBD><EFBFBD>?
|
||||
// 中间件检查
|
||||
function pkbVersionRouter(req, res, next) {
|
||||
const userId = req.user?.id;
|
||||
|
||||
@@ -550,7 +550,7 @@ function pkbVersionRouter(req, res, next) {
|
||||
req.usePKBv2 = true;
|
||||
}
|
||||
|
||||
// <EFBFBD>硋<EFBFBD>撅<EFBFBD>撘<EFBFBD><EFBFBD>?
|
||||
// 或全局开关
|
||||
if (featureFlags.usePKBv2) {
|
||||
req.usePKBv2 = true;
|
||||
}
|
||||
@@ -559,7 +559,7 @@ function pkbVersionRouter(req, res, next) {
|
||||
}
|
||||
```
|
||||
|
||||
#### Task 7.2嚗𡁜<EFBFBD>蝡臬<EFBFBD><EFBFBD>賢<EFBFBD><EFBFBD>?
|
||||
#### Task 7.2:前端功能开关
|
||||
```typescript
|
||||
// frontend-v2/src/modules/pkb/config.ts
|
||||
export const usePKBv2 = () => {
|
||||
@@ -576,21 +576,21 @@ export const getApiBase = () => {
|
||||
};
|
||||
```
|
||||
|
||||
#### Task 7.3嚗𡁶<EFBFBD>摨血<EFBFBD>撣<EFBFBD><EFBFBD><EFBFBD>?
|
||||
#### Task 7.3:灰度发布策略
|
||||
```bash
|
||||
阶段7.1:内部测试(1-2天)
|
||||
- [ ] 开发团队使用新版本
|
||||
- [ ] 设置:localStorage.setItem('force-pkb-v2', 'true')
|
||||
- [ ] 霈啣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>厰䔮憸?
|
||||
- [ ] 记录所有问题
|
||||
|
||||
<EFBFBD>嗆挾7.2嚗𡁜<EFBFBD><EFBFBD><EFBFBD>凒<EFBFBD>冽<EFBFBD>嚗?-5憭抬<E686AD>
|
||||
- [ ] <EFBFBD>㗇𥋘5-10銝芣暑頝<EFBFBD>鍂<EFBFBD>?
|
||||
- [ ] <EFBFBD>惩<EFBFBD><EFBFBD>賢<EFBFBD><EFBFBD>?
|
||||
阶段7.2:小范围用户(3-5天)
|
||||
- [ ] 选择5-10个活跃用户
|
||||
- [ ] 加入白名单
|
||||
- [ ] 收集反馈
|
||||
|
||||
阶段7.3:扩大范围(7天)
|
||||
- [ ] 25%<EFBFBD>冽<EFBFBD>雿輻鍂<EFBFBD>啁<EFBFBD><EFBFBD>?
|
||||
- [ ] <EFBFBD>烐綉<EFBFBD>躰秤<EFBFBD>?
|
||||
- [ ] 25%用户使用新版本
|
||||
- [ ] 监控错误率
|
||||
- [ ] 对比性能指标
|
||||
```
|
||||
|
||||
@@ -610,10 +610,10 @@ if (req.usePKBv2) {
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F>啣漲<E595A3>冽<EFBFBD>甇<EFBFBD>虜雿輻鍂
|
||||
- <EFBFBD>?<3F>𣳇<EFBFBD>憭呆ug
|
||||
- <EFBFBD>?<3F>躰秤<E8BAB0><E7A7A4>銁<EFBFBD>舀𦻖<E88880>𡑒<EFBFBD><F0A19192>?
|
||||
- <EFBFBD>?<3F>冽<EFBFBD><E586BD>漤<EFBFBD>蝘舀<E89D98>
|
||||
- ✅ 灰度用户正常使用
|
||||
- ✅ 无重大bug
|
||||
- ✅ 错误率在可接受范围
|
||||
- ✅ 用户反馈积极
|
||||
|
||||
### 回滚方案
|
||||
```bash
|
||||
@@ -629,13 +629,13 @@ if (req.usePKBv2) {
|
||||
## 📝 阶段8:全量切换(0.5天)
|
||||
|
||||
### 目标
|
||||
- <EFBFBD><EFBFBD><EFBFBD>厩鍂<EFBFBD>瑕<EFBFBD><EFBFBD>W<EFBFBD><EFBFBD>啁<EFBFBD><EFBFBD>?
|
||||
- 所有用户切换到新版本
|
||||
- 确保平滑过渡
|
||||
- 保留回滚能力
|
||||
|
||||
### 任务清单
|
||||
|
||||
#### Task 8.1嚗𡁜<EFBFBD>憭<EFBFBD><EFBFBD><EFBFBD>?
|
||||
#### Task 8.1:准备切换
|
||||
```bash
|
||||
# 提前通知
|
||||
- [ ] 通知用户即将升级
|
||||
@@ -643,12 +643,12 @@ if (req.usePKBv2) {
|
||||
- [ ] 备份当前配置
|
||||
```
|
||||
|
||||
#### Task 8.2嚗𡁏<EFBFBD>銵<EFBFBD><EFBFBD><EFBFBD>?
|
||||
#### Task 8.2:执行切换
|
||||
```bash
|
||||
# <EFBFBD>孵<EFBFBD>1嚗帋耨<EFBFBD>寥<EFBFBD>霈方楝<EFBFBD>?
|
||||
<EFBFBD>狄rontend-v2銝哨<EFBFBD>撠?/knowledge 頝舐眏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>圈△<EFBFBD>?
|
||||
# 方式1:修改默认路由
|
||||
在frontend-v2中,将 /knowledge 路由指向新页面
|
||||
|
||||
# <EFBFBD>孵<EFBFBD>2嚗𡁜<EFBFBD>撅<EFBFBD>撘<EFBFBD><EFBFBD>?
|
||||
# 方式2:全局开关
|
||||
USE_PKB_V2=true
|
||||
|
||||
# 方式3:前端重定向
|
||||
@@ -657,32 +657,32 @@ if (location.pathname === '/knowledge') {
|
||||
}
|
||||
```
|
||||
|
||||
#### Task 8.3嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>改<EFBFBD>24撠𤩺𧒄嚗?
|
||||
#### Task 8.3:密切监控(24小时)
|
||||
```bash
|
||||
- [ ] <EFBFBD>烐綉<EFBFBD>躰秤<EFBFBD>?
|
||||
- [ ] 监控错误率
|
||||
- [ ] 监控API响应时间
|
||||
- [ ] 璉<EFBFBD><EFBFBD>亦鍂<EFBFBD>瑕<EFBFBD>擐?
|
||||
- [ ] 检查用户反馈
|
||||
- [ ] 查看日志异常
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?<3F><><EFBFBD>厩鍂<E58EA9>瑁挪<E79181>格鰵<E6A0BC><E9B0B5>𧋦
|
||||
- <EFBFBD>?<3F>躰秤<E8BAB0><E7A7A4>迤撣?
|
||||
- <EFBFBD>?<3F>扯<EFBFBD>蝔喳<E89D94>
|
||||
- <EFBFBD>?<3F>𣳇<EFBFBD>憭扳<E686AD>霂?
|
||||
- ✅ 所有用户访问新版本
|
||||
- ✅ 错误率正常
|
||||
- ✅ 性能稳定
|
||||
- ✅ 无重大投诉
|
||||
|
||||
### <EFBFBD>墧<EFBFBD><EFBFBD>寞<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>?憭抬<E686AD>
|
||||
### 回滚方案(保留7天)
|
||||
```bash
|
||||
# 蝝扳<EFBFBD>亙<EFBFBD>皛?
|
||||
# 紧急回滚
|
||||
1. USE_PKB_V2=false
|
||||
2. <EFBFBD>碶耨<EFBFBD>寡楝<EFBFBD>梢<EFBFBD>蝵?
|
||||
2. 或修改路由配置
|
||||
3. 重启服务
|
||||
4. 5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣂼<EFBFBD>皛?
|
||||
4. 5分钟内完成回滚
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> <20>嗆挾9嚗𡁏<E59A97><F0A1818F><EFBFBD>唂隞<E59482><E99A9E>嚗<EFBFBD>虾<EFBFBD>㚁<EFBFBD>1-2<>典<EFBFBD>嚗?
|
||||
## 📝 阶段9:清理旧代码(可选,1-2周后)
|
||||
|
||||
### ⚠️ 重要提示
|
||||
**至少等待2周,确认新版本完全稳定后再执行!**
|
||||
@@ -699,49 +699,49 @@ git push origin backup/pkb-legacy-code
|
||||
|
||||
#### Task 9.2:删除旧代码
|
||||
```bash
|
||||
# <EFBFBD>𣳇膄<EFBFBD>批<EFBFBD>蝡臭誨<EFBFBD>?
|
||||
# 删除旧后端代码
|
||||
rm -rf backend/src/legacy/controllers/knowledgeBaseController.ts
|
||||
rm -rf backend/src/legacy/services/knowledgeBaseService.ts
|
||||
rm -rf backend/src/legacy/routes/knowledgeBases.ts
|
||||
|
||||
# <EFBFBD>𣳇膄<EFBFBD>批<EFBFBD>蝡臭誨<EFBFBD>?
|
||||
# 删除旧前端代码
|
||||
rm -rf frontend/src/pages/KnowledgePage.tsx
|
||||
```
|
||||
|
||||
#### Task 9.3嚗𡁏<EFBFBD><EFBFBD><EFBFBD>楝<EFBFBD>?
|
||||
#### Task 9.3:清理路由
|
||||
```typescript
|
||||
// 蝘駁膄<EFBFBD>扯楝<EFBFBD>望釣<EFBFBD>?
|
||||
// 移除旧路由注册
|
||||
// app.use('/api/v1/knowledge', legacyKnowledgeRoutes);
|
||||
|
||||
// <EFBFBD>舫<EFBFBD>㚁<EFBFBD>瘛餃<EFBFBD><EFBFBD>滚<EFBFBD><EFBFBD>?
|
||||
// 可选:添加重定向
|
||||
app.use('/api/v1/knowledge', (req, res) => {
|
||||
res.redirect(308, `/api/v2/knowledge${req.path}`);
|
||||
});
|
||||
```
|
||||
|
||||
### 验证标准
|
||||
- <EFBFBD>?隞<><E99A9E>撌脣<E6928C>隞?
|
||||
- <EFBFBD>?<3F>啁<EFBFBD><E59581>祈<EFBFBD>銵?<3F>冽<EFBFBD><E586BD>桅<EFBFBD>
|
||||
- <EFBFBD>?<3F>a<EFBFBD>銝<EFBFBD><E98A9D>游<EFBFBD><E6B8B8>誩<EFBFBD><E8AAA9>?
|
||||
- ✅ 代码已备份
|
||||
- ✅ 新版本运行2周无问题
|
||||
- ✅ 团队一致同意删除
|
||||
|
||||
---
|
||||
|
||||
## 🔒 安全措施总结
|
||||
|
||||
### 1. 憪讠<EFBFBD><EFBFBD>臬<EFBFBD>皛?
|
||||
### 1. 始终可回滚
|
||||
```bash
|
||||
瘥譍葵<EFBFBD>嗆挾<EFBFBD>賢虾隞亦<EFBFBD><EFBFBD>喳<EFBFBD>皛𡁜<EFBFBD>銝𠹺<EFBFBD>銝芰𠶖<EFBFBD>?
|
||||
<EFBFBD>墧<EFBFBD><EFBFBD>園𡢿嚗? 5<><35><EFBFBD>
|
||||
每个阶段都可以立即回滚到上一个状态
|
||||
回滚时间:< 5分钟
|
||||
```
|
||||
|
||||
### 2. <EFBFBD>抒頂蝏煺<EFBFBD><EFBFBD>?
|
||||
### 2. 旧系统保护
|
||||
```bash
|
||||
迁移期间,旧代码完全不动
|
||||
<EFBFBD>批<EFBFBD><EFBFBD>?00%<25>舐鍂
|
||||
<EFBFBD>冽<EFBFBD><EFBFBD>䭾<EFBFBD><EFBFBD>?
|
||||
旧功能100%可用
|
||||
用户无感知
|
||||
```
|
||||
|
||||
### 3. 皜鞱<EFBFBD>撘誯<EFBFBD>霂?
|
||||
### 3. 渐进式验证
|
||||
```bash
|
||||
每个阶段独立验证
|
||||
发现问题立即修复
|
||||
@@ -750,34 +750,34 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
|
||||
### 4. 灰度发布
|
||||
```bash
|
||||
<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD> <20>?撠讛<E692A0><E8AE9B>渡鍂<E6B8A1>?<3F>?憭扯<E686AD><E689AF>渡鍂<E6B8A1>?<3F>?<3F>券<EFBFBD>
|
||||
隞颱<EFBFBD><EFBFBD>嗆挾<EFBFBD>𤑳緵<EFBFBD>桅<EFBFBD><EFBFBD>賢虾隞交<EFBFBD><EFBFBD>?
|
||||
内部测试 → 小范围用户 → 大范围用户 → 全量
|
||||
任何阶段发现问题都可以暂停
|
||||
```
|
||||
|
||||
### 5. 监控告警
|
||||
```bash
|
||||
摰墧𧒄<EFBFBD>烐綉<EFBFBD>躰秤<EFBFBD>?
|
||||
实时监控错误率
|
||||
性能指标对比
|
||||
用户反馈收集
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 璉<><E79289>亦<EFBFBD>嚗㇃heckpoint嚗?
|
||||
## 📊 检查点(Checkpoint)
|
||||
|
||||
在每个阶段结束时,必须通过以下检查:
|
||||
|
||||
### <EFBFBD>?<3F>嗆挾<E59786>朞<EFBFBD><E69C9E><EFBFBD><EFBFBD>
|
||||
### ✅ 阶段通过标准
|
||||
```bash
|
||||
1. [ ] 所有测试用例通过
|
||||
2. [ ] <EFBFBD>删<EFBFBD>霂?餈鞱<E9A488><E99EB1>園<EFBFBD>霂?
|
||||
3. [ ] <EFBFBD>抒頂蝏笔<EFBFBD><EFBFBD>賣迤撣?
|
||||
4. [ ] <EFBFBD>扯<EFBFBD><EFBFBD>䭾<EFBFBD><EFBFBD>曆<EFBFBD><EFBFBD>?
|
||||
2. [ ] 无编译/运行时错误
|
||||
3. [ ] 旧系统功能正常
|
||||
4. [ ] 性能无明显下降
|
||||
5. [ ] 代码已提交到Git
|
||||
6. [ ] 团队评审通过
|
||||
```
|
||||
|
||||
### <EFBFBD>?<3F>嗆挾憭梯揖憭<E68F96><E686AD>
|
||||
### ❌ 阶段失败处理
|
||||
```bash
|
||||
1. 立即停止迁移
|
||||
2. 分析失败原因
|
||||
@@ -790,26 +790,26 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
|
||||
## 🎯 成功标准
|
||||
|
||||
### <EFBFBD><EFBFBD>蝏<EFBFBD>𤌍<EFBFBD>?
|
||||
- <EFBFBD>?PKB<EFBFBD>蠘<EFBFBD>100%餈<EFBFBD>宏<EFBFBD>唳鰵<EFBFBD>嗆<EFBFBD>
|
||||
- <EFBFBD>?<3F>冽<EFBFBD><E586BD>䭾<EFBFBD><E4ADBE>亙<EFBFBD><E4BA99>?
|
||||
- <EFBFBD>?<3F>嗆㺭<E59786>桐腺憭?
|
||||
- <EFBFBD>?<3F>嗅<EFBFBD><E59785>箸𧒄<E7AEB8>?
|
||||
- <EFBFBD>?<3F>舫<EFBFBD><E888AB>嗅<EFBFBD>皛𡄯<E79A9B>靽萘<E99DBD>2<EFBFBD>剁<EFBFBD>
|
||||
### 最终目标
|
||||
- ✅ PKB功能100%迁移到新架构
|
||||
- ✅ 用户无感知切换
|
||||
- ✅ 零数据丢失
|
||||
- ✅ 零停机时间
|
||||
- ✅ 可随时回滚(保留2周)
|
||||
|
||||
### KPI指标
|
||||
```bash
|
||||
- 错误率:< 0.1%(与旧版本对比)
|
||||
- 响应时间:不超过旧版本的 110%
|
||||
- <EFBFBD>冽<EFBFBD>皛⊥<EFBFBD>摨佗<EFBFBD><EFBFBD>?90%
|
||||
- <EFBFBD>墧<EFBFBD>甈⊥㺭嚗?甈∴<E79488><E288B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
|
||||
- 用户满意度:≥ 90%
|
||||
- 回滚次数:0次(理想情况)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## <EFBFBD><EFBFBD> 摨娍<E691A8>亥<EFBFBD>蝟?
|
||||
## 📞 应急联系
|
||||
|
||||
### <EFBFBD>𤑳緵銝仿<EFBFBD><EFBFBD>桅<EFBFBD><EFBFBD>?
|
||||
### 发现严重问题时
|
||||
```bash
|
||||
1. 立即停止迁移
|
||||
2. 评估影响范围
|
||||
@@ -821,8 +821,8 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
### 回滚决策
|
||||
```bash
|
||||
立即回滚的情况:
|
||||
- <EFBFBD>唳旿銝W仃<EFBFBD>𡝗<EFBFBD><EFBFBD>?
|
||||
- <EFBFBD>詨<EFBFBD><EFBFBD>蠘<EFBFBD>銝滚虾<EFBFBD>?
|
||||
- 数据丢失或损坏
|
||||
- 核心功能不可用
|
||||
- 大量用户投诉
|
||||
- 安全漏洞
|
||||
|
||||
@@ -842,28 +842,28 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
|
||||
**执行人:** XXX
|
||||
**开始时间:** YYYY-MM-DD HH:mm
|
||||
**蝏𤘪<EFBFBD><EFBFBD>園𡢿嚗?* YYYY-MM-DD HH:mm
|
||||
**结束时间:** YYYY-MM-DD HH:mm
|
||||
|
||||
**<EFBFBD>扯<EFBFBD><EFBFBD><EFBFBD>捆嚗?*
|
||||
**执行内容:**
|
||||
- Task X.1: [完成/失败] [说明]
|
||||
- Task X.2: [完成/失败] [说明]
|
||||
...
|
||||
|
||||
**瘚贝<EFBFBD>蝏𤘪<EFBFBD>嚗?*
|
||||
- 瘚贝<EFBFBD><EFBFBD>其<EFBFBD>1: <20>?<3F>朞<EFBFBD>
|
||||
- 瘚贝<EFBFBD><EFBFBD>其<EFBFBD>2: <20>?<3F>朞<EFBFBD>
|
||||
**测试结果:**
|
||||
- 测试用例1: ✅ 通过
|
||||
- 测试用例2: ✅ 通过
|
||||
...
|
||||
|
||||
**发现的问题:**
|
||||
1. [<EFBFBD>桅<EFBFBD><EFBFBD>讛膩] - [<5B>嗆<EFBFBD><E59786><EFBFBD>撌脖耨憭?敺<>耨憭䓞
|
||||
1. [问题描述] - [状态:已修复/待修复]
|
||||
2. ...
|
||||
|
||||
**<EFBFBD>扯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
|
||||
- API<EFBFBD>滚<EFBFBD><EFBFBD>園𡢿嚗䧥X ms (<EFBFBD>抒<EFBFBD><EFBFBD>? XX ms)
|
||||
**性能指标:**
|
||||
- API响应时间:XX ms (旧版本: XX ms)
|
||||
- 错误率:X%
|
||||
|
||||
**蝏栞捏嚗?*
|
||||
[<EFBFBD>?<3F>朞<EFBFBD> / <20>?憭梯揖]
|
||||
**结论:**
|
||||
[✅ 通过 / ❌ 失败]
|
||||
|
||||
**下一步:**
|
||||
[继续下一阶段 / 暂停修复问题 / 回滚]
|
||||
@@ -873,21 +873,21 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
|
||||
## 🎓 经验总结
|
||||
|
||||
### 餈嗘葵霈∪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
### 这个计划的优势
|
||||
```
|
||||
1. <EFBFBD>?<3F><>漲靽嘥<E99DBD>嚗屸<E59A97><E5B1B8>拇<EFBFBD>撠誩<E692A0>
|
||||
2. <EFBFBD>?瘥𤩺郊<F0A4A9BA>舫<EFBFBD>霂<EFBFBD><E99C82><EFBFBD>桅<EFBFBD><E6A185>拙<EFBFBD><E68B99>?
|
||||
3. <EFBFBD>?<3F>𤩺𧒄<F0A4A9BA>臬<EFBFBD>皛𡄯<E79A9B>銝滚蔣<E6BB9A>滢<EFBFBD><E6BBA2>?
|
||||
4. <EFBFBD>?<3F>啣漲<E595A3>穃<EFBFBD>嚗屸<E59A97>鞉郊<E99E89><E9838A>揢
|
||||
5. <EFBFBD>?<3F>找誨<E689BE><E8AAA8>鵭<EFBFBD>煺<EFBFBD><E785BA>辷<EFBFBD><E8BEB7>䔶<EFBFBD><E494B6>?
|
||||
1. ✅ 极度保守,风险最小化
|
||||
2. ✅ 每步可验证,问题早发现
|
||||
3. ✅ 随时可回滚,不影响业务
|
||||
4. ✅ 灰度发布,逐步切换
|
||||
5. ✅ 旧代码长期保留,双保险
|
||||
```
|
||||
|
||||
### 与快速迁移的对比
|
||||
```
|
||||
快速迁移:1-2天完成,但风险高
|
||||
摰匧<EFBFBD>餈<EFBFBD>宏嚗?-6憭拙<E686AD><E68B99>琜<EFBFBD>雿<EFBFBD><E99BBF><EFBFBD>拇<EFBFBD>雿?
|
||||
安全迁移:5-6天完成,但风险极低
|
||||
|
||||
<EFBFBD>㗇𥋘嚗𡁶鍂4憭拇𧒄<EFBFBD>湔揢<EFBFBD>硋<EFBFBD><EFBFBD>冽<EFBFBD>批<EFBFBD>蝔喳<EFBFBD><EFBFBD>?
|
||||
选择:用4天时间换取安全性和稳定性
|
||||
```
|
||||
|
||||
---
|
||||
@@ -906,4 +906,3 @@ app.use('/api/v1/knowledge', (req, res) => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user