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:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -3,14 +3,14 @@
## 🎯 验证目标
验证PKB模块前端功能是否正常运行包括
1. <EFBFBD>?Dashboard憿菟𢒰皜脫<EFBFBD>
2. <EFBFBD>?<3F>𥕦遣<F0A595A6><EFBFBD>摨𤘪<E691A8>蝔?
3. <EFBFBD>?Workspace憿菟𢒰<EFBFBD>?蝘滚極雿𨀣芋撘?
4. <EFBFBD>?Ant Design X Chat<EFBFBD><EFBFBD><EFBFBD>
1. Dashboard页面渲染
2. ✅ 创建知识库流程
3. Workspace页面及3种工作模式
4. Ant Design X Chat集成
---
## <EFBFBD><EFBFBD> 敹恍<E695B9>笔鍳<E7AC94>?
## 🚀 快速启动
### 1. 启动后端服务
```bash
@@ -29,39 +29,39 @@ npm run dev
---
## <EFBFBD>?撉諹<E69289><EFBFBD><E79A9C>
## ✅ 验证清单
### 阶段1Dashboard页面验证
#### 1.1 页面渲染
- [ ] 页面正常加载,无白屏
- [ ] <EFBFBD>𥕦遣<EFBFBD><EFBFBD>摨枏㨃<EFBFBD><EFBFBD>遬蝷箸迤撣賂<EFBFBD><EFBFBD>肽𠧧皜𣂼<EFBFBD><EFBFBD>峕艶嚗?
- [ ] 创建知识库卡片显示正常(蓝色渐变背景)
- [ ] 5个知识库类型图标显示正常
- [ ] 现有知识库卡片列表显示(如果有数据)
#### 1.2 <EFBFBD>𥕦遣<EFBFBD><EFBFBD>摨𤘪<EFBFBD>蝔?
#### 1.2 创建知识库流程
**步骤**:
1. <EFBFBD>孵稬"<22>𥕦遣<F0A595A6><EFBFBD>摨?<3F><EFBFBD>
1. 点击"创建知识库"卡片
2. 验证Modal弹出
3. 选择"临床指南"类型
4. <EFBFBD>孵稬"銝衤<E98A9D>甇?
5. 颲枏<EFBFBD><EFBFBD>滨妍嚗?瘚贝<E7989A><E8B49D><EFBFBD>摨𡤄5"
6. <EFBFBD>㗇𥋘蝘穃恕嚗?敹<><E695B9>蝘?
7. <EFBFBD>孵稬"銝衤<E98A9D>甇?
4. 点击"下一步"
5. 输入名称:"测试知识库V5"
6. 选择科室:"心内科"
7. 点击"下一步"
8. 查看文件上传界面
9. 点击"完成并进入工作台"
**预期结果**:
- [ ] Modal正常弹出
- [ ] 3甇亙<EFBFBD>撖潭迤撣詨<EFBFBD><EFBFBD>?
- [ ] 3步向导正常切换
- [ ] 表单验证生效(名称必填)
- [ ] 成功创建后跳转到Workspace
#### 1.3 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- [ ] <EFBFBD>𥕦遣<EFBFBD><EFBFBD>擃睃漲銝?40px
#### 1.3 样式检查
- [ ] 创建卡片高度为240px
- [ ] 卡片圆角为rounded-xl
- [ ] 悬停时有shadow-lg效果
- [ ] "餈𥕦<EFBFBD>撌乩<EFBFBD><EFBFBD>?<3F>厰僼銝漳late-800<EFBFBD>峕艶
- [ ] "进入工作台"按钮为slate-800背景
---
@@ -69,55 +69,55 @@ npm run dev
#### 2.1 页面布局
- [ ] 深色Headerbg-slate-900高度为h-14
- [ ] "餈𥪜<EFBFBD><EFBFBD><EFBFBD>摨枏<EFBFBD>銵?<3F>厰僼<E58EB0>曄內
- [ ] <EFBFBD><EFBFBD>摨枏<EFBFBD>蝘唳遬蝷箸迤蝖?
- [ ] "返回知识库列表"按钮显示
- [ ] 知识库名称显示正确
- [ ] Tab导航显示智能问答、知识资产
- [ ] 暺䁅恕瞈<EFBFBD>瘣?<3F><EFBFBD><E7AE84><EFBFBD>"Tab
- [ ] 默认激活"智能问答"Tab
#### 2.2 智能问答Tab
**撌乩<EFBFBD><EFBFBD><EFBFBD>㗇𥋘<EFBFBD>?*:
**工作模式选择器**:
- [ ] Collapse组件正常展开/收起
- [ ] 3种模式Radio正常显示
- [ ] 全文阅读模式显示Token使用率圆形进度条
- [ ] <EFBFBD><EFBFBD>蝎曇粉璅<EFBFBD>嚗𡁏遬蝷箸<EFBFBD><EFBFBD><EFBFBD>㗇𥋘銝𧢲<EFBFBD>獢?
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>芋撘𧶏<EFBFBD><EFBFBD>曄內璅⊥踎<EFBFBD>㗇𥋘銝𧢲<EFBFBD>獢?
- [ ] 逐篇精读模式:显示文档选择下拉框
- [ ] 批处理模式:显示模板选择下拉框
**全文阅读模式**:
1. 选择"全文阅读模式"
2. 查看欢迎消息
3. 颲枏<EFBFBD>瘚贝<EFBFBD><EFBFBD><EFBFBD>嚗?霂瑟<E99C82><EFBFBD>餈嗘葵<E59798><EFBFBD>摨梶<E691A8>銝餉<E98A9D><E9A489><EFBFBD>"
4. <EFBFBD>孵稬<EFBFBD><EFBFBD>?
3. 输入测试问题:"请总结这个知识库的主要内容"
4. 点击发送
**预期结果**:
- [ ] 欢迎消息正常显示
- [ ] 颲枏<EFBFBD><EFBFBD>迤撣詨極雿?
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- [ ] 输入框正常工作
- [ ] 消息发送成功
- [ ] AI回复正常显示流式输出
- [ ] <EFBFBD><EFBFBD>瘞娍部<EFBFBD><EFBFBD><EFBFBD>嚗㇁I: slate-50, <EFBFBD><EFBFBD>: blue-600嚗?
- [ ] 消息气泡样式正确AI: slate-50, 用户: blue-600
**逐篇精读模式**:
1. 选择"逐篇精读模式"
2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝剝<EFBFBD>㗇𥋘1-2蝭<32><E89DAD>獢?
3. <EFBFBD><EFBFBD>"撌脤<E6928C>㗇𥋘 X 蝭<><E89DAD>獢?<3F>鞟內
2. 在下拉框中选择1-2篇文档
3. 查看"已选择 X 篇文档"提示
4. 输入测试问题
5. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
5. 发送消息
**预期结果**:
- [ ] 文档选择正常
- [ ] <EFBFBD><EFBFBD>憭𡁻<EFBFBD>?蝭<><E89DAD><EFBFBD><EFBFBD><E597A5>?
- [ ] 最多选5篇限制生效
- [ ] Alert提示显示
- [ ] Chat界面正常工作
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>芋撘?*:
1. <EFBFBD>㗇𥋘"<22><EFBFBD><E5ADB5><EFBFBD>芋撘?
2. <EFBFBD>㗇𥋘璅⊥踎嚗?銝游<E98A9D><E6B8B8>𠉛弦靽⊥<E99DBD><E28AA5>𣂼<EFBFBD>"
3. <EFBFBD>孵稬"撘<>憪𧢲<E686AA>銵?
4. <EFBFBD><EFBFBD>餈𥕦漲<EFBFBD>?
**批处理模式**:
1. 选择"批处理模式"
2. 选择模板:"临床研究信息提取"
3. 点击"开始执行"
4. 查看进度条
**预期结果**:
- [ ] 模板选择正常
- [ ] <EFBFBD><EFBFBD><EFBFBD>厰僼<EFBFBD><EFBFBD><EFBFBD>?
- [ ] 餈𥕦漲<EFBFBD>⊥迤撣豢遬蝷?
- [ ] 执行按钮可点击
- [ ] 进度条正常显示
#### 2.3 知识资产Tab
1. 点击"知识资产"Tab
@@ -127,17 +127,17 @@ npm run dev
- [ ] Tab切换正常
- [ ] 表格正常显示
- [ ] 文档信息正确文件名、状态、大小、Tokens、上传时间
- [ ] MinerU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>噬蝡䭾迤蝖格遬蝷?
- [ ] <EFBFBD>𣳇膄<EFBFBD>厰僼<EFBFBD>曄內嚗<EFBFBD><EFBFBD><EFBFBD>𨀣𧒄嚗?
- [ ] MinerU解析状态徽章正确显示
- [ ] 删除按钮显示(悬停时)
#### 2.4 PDF靘扯器<EFBFBD>?
1. <EFBFBD>冽惣<EFBFBD>賡䔮蝑烱ab銝?
#### 2.4 PDF侧边栏
1. 在智能问答Tab中
2. 点击右侧"展开 PDF 预览"按钮
3. <EFBFBD><EFBFBD>PDF靘扯器<EFBFBD>?
3. 查看PDF侧边栏
**预期结果**:
- [ ] 靘扯器<EFBFBD><EFBFBD><EFBFBD>喃儒皛穃<EFBFBD>嚗Ònimate-slide-in-right嚗?
- [ ] 摰賢漲銝?5%
- [ ] 侧边栏从右侧滑入animate-slide-in-right
- [ ] 宽度为45%
- [ ] 关闭按钮正常工作
- [ ] PDF模拟背景正常显示
@@ -147,25 +147,25 @@ npm run dev
#### 3.1 Dashboard样式
```css
<EFBFBD>?<EFBFBD>𥕦遣<EFBFBD><EFBFBD>: bg-gradient-to-br from-blue-50 to-indigo-50
<EFBFBD>?<EFBFBD><EFBFBD>擃睃漲: h-[240px]
<EFBFBD>?<EFBFBD>厰僼憸𡏭𠧧: bg-slate-800 hover:bg-blue-600
<EFBFBD>?<EFBFBD><EFBFBD><EFBFBD>: rounded-xl
创建卡片: bg-gradient-to-br from-blue-50 to-indigo-50
卡片高度: h-[240px]
按钮颜色: bg-slate-800 hover:bg-blue-600
圆角: rounded-xl
```
#### 3.2 Workspace样式
```css
<EFBFBD>?Header: h-14 bg-slate-900
<EFBFBD>?Tab瞈<EFBFBD>? border-blue-600 text-blue-600 font-bold
<EFBFBD>?PDF靘扯器<EFBFBD>? w-[45%] bg-slate-100
<EFBFBD>?<EFBFBD><EFBFBD>瘞娍部: bg-slate-50 (AI) / bg-blue-600 (<EFBFBD><EFBFBD>)
Header: h-14 bg-slate-900
Tab激活: border-blue-600 text-blue-600 font-bold
PDF侧边栏: w-[45%] bg-slate-100
消息气泡: bg-slate-50 (AI) / bg-blue-600 (用户)
```
---
## 🐛 常见问题排查
### <EFBFBD><EFBFBD>1嚗𡁻△<EFBFBD>蒾撅?
### 问题1页面白屏
**可能原因**:
- 路由配置错误
- 组件导入错误
@@ -178,16 +178,16 @@ npm run dev
### 问题2API请求失败
**可能原因**:
- <EFBFBD>𡒊垢<EFBFBD>滚𦛚<EFBFBD>芸鍳<EFBFBD>?
- API頝舐眏銝滚龪<EFBFBD>?
- 后端服务未启动
- API路由不匹配
- CORS问题
**排查步骤**:
1. 确认后端服务运行在`http://localhost:3000`
2. <EFBFBD><EFBFBD>丕PI頝舐眏<EFBFBD>臬炏銝槁/api/v1/pkb/*`
2. 检查API路由是否为`/api/v2/pkb/*`
3. 查看后端日志
### <EFBFBD><EFBFBD>3嚗鋴hat蝏<EFBFBD>辣銝齿遬蝷?
### 问题3Chat组件不显示
**可能原因**:
- ChatContainer导入路径错误
- conversationType配置错误
@@ -200,14 +200,14 @@ npm run dev
### 问题4样式不正确
**可能原因**:
- Tailwind CSS<EFBFBD><EFBFBD><EFBFBD>?
- Tailwind CSS未生效
- class名称拼写错误
- 瘚讛<EFBFBD><EFBFBD><EFBFBD>摮?
- 浏览器缓存
**排查步骤**:
1. <EFBFBD>膄瘚讛<EFBFBD><EFBFBD><EFBFBD>摮?
1. 清除浏览器缓存
2. 检查Tailwind配置
3. 雿輻鍂瘚讛<EFBFBD><EFBFBD>求evTools璉<EFBFBD><EFBFBD><EFBFBD>蝝䭾甅撘?
3. 使用浏览器DevTools检查元素样式
---
@@ -217,30 +217,30 @@ npm run dev
## PKB前端验证报告
**验证时间**: YYYY-MM-DD HH:mm
**撉諹<EFBFBD>鈭?*: XXX
**瘚讛<EFBFBD><EFBFBD>?*: Chrome/Firefox/Safari
**验证人**: XXX
**浏览器**: Chrome/Firefox/Safari
### Dashboard页面
- [ ] 憿菟𢒰皜脫<EFBFBD>: <20>?<3F>?
- [ ] <EFBFBD>𥕦遣瘚<EFBFBD><EFBFBD>: <20>?<3F>?
- [ ] <EFBFBD><EFBFBD><EFBFBD>: <20>?<3F>?
- [ ] 页面渲染: ✅/❌
- [ ] 创建流程: ✅/❌
- [ ] 样式正确: ✅/❌
- **问题**: (如有)
### Workspace页面
- [ ] 憿菟𢒰撣<EFBFBD><EFBFBD>: <20>?<3F>?
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Tab: <EFBFBD>?<3F>?
- [ ] <EFBFBD><EFBFBD><EFBFBD>Tab: <EFBFBD>?<3F>?
- [ ] PDF靘扯器<EFBFBD>? <20>?<3F>?
- [ ] 页面布局: ✅/❌
- [ ] 智能问答Tab: ✅/❌
- [ ] 知识资产Tab: ✅/❌
- [ ] PDF侧边栏: ✅/❌
- **问题**: (如有)
### 工作模式
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD>粉: <20>?<3F>?
- [ ] <EFBFBD><EFBFBD>蝎曇粉: <20>?<3F>?
- [ ] <EFBFBD><EFBFBD><EFBFBD>? <20>?<3F>?
- [ ] 全文阅读: ✅/❌
- [ ] 逐篇精读: ✅/❌
- [ ] 批处理: ✅/❌
- **问题**: (如有)
### 总体评价
- **摰峕<EFBFBD>摨?*: XX%
- **完成度**: XX%
- **建议**: XXX
```
@@ -248,27 +248,26 @@ npm run dev
## 🎯 验证成功标准
### <EFBFBD><EFBFBD><EFBFBD>嚗㇊0嚗?
- <EFBFBD>?Dashboard憿菟𢒰甇<EFBFBD>虜皜脫<EFBFBD>
- <EFBFBD>?<3F>𥕦遣<F0A595A6><EFBFBD>摨𤘪<E691A8>蝔见<E89D94><E8A781>?
- <EFBFBD>?Workspace憿菟𢒰甇<EFBFBD><EFBFBD>曄內
- <EFBFBD>?3蝘滚極雿𨀣芋撘誩虾<E8AAA9><E899BE>
- <EFBFBD>?Chat<EFBFBD>辣甇<EFBFBD>虜撌乩<EFBFBD>
### 必须通过P0
- Dashboard页面正常渲染
- ✅ 创建知识库流程完整
- Workspace页面正常显示
- ✅ 3种工作模式可切换
- Chat组件正常工作
### 摨磰砲<EFBFBD><EFBFBD>嚗㇊1嚗?
- <EFBFBD>?<3F><EFBFBD>100%<25>萄儐霈曇恣蝔?
- <EFBFBD>?<3F>函𤫇<E587BD><F0A4AB87><EFBFBD><EFBFBD><E7989A>
- <EFBFBD>?<3F><EFBFBD>撘誩<E69298><EFBFBD><EFBFBD>
### 应该通过P1
- ✅ 样式100%遵循设计稿
- ✅ 动画效果流畅
- ✅ 响应式布局正常
### <EFBFBD>臭誑隡睃<EFBFBD>嚗㇊2嚗?
### 可以优化P2
- 🔄 文件上传功能
- <EFBFBD><EFBFBD> <20><EFBFBD><E5ADB5><EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD>蝷?
- 🔄 批处理结果展示
- 🔄 PDF真实内容预览
---
**銝衤<EFBFBD>甇?*: <20>寞旿撉諹<E69289>蝏𤘪<E89D8F>靽桀<E99DBD><E6A180><EFBFBD>嚗𣬚<E59A97><F0A3AC9A><EFBFBD><E88898>充VW璅<E79285><EFBFBD>宏嚗?
**下一步**: 根据验证结果修复问题然后进入RVW模块迁移