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:
@@ -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>
|
||||
## ✅ 验证清单
|
||||
|
||||
### 阶段1:Dashboard页面验证
|
||||
|
||||
#### 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 页面布局
|
||||
- [ ] 深色Header(bg-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>Y蒾撅?
|
||||
### 问题1:页面白屏
|
||||
**可能原因**:
|
||||
- 路由配置错误
|
||||
- 组件导入错误
|
||||
@@ -178,16 +178,16 @@ npm run dev
|
||||
|
||||
### 问题2:API请求失败
|
||||
**可能原因**:
|
||||
- <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>辣銝齿遬蝷?
|
||||
### 问题3:Chat组件不显示
|
||||
**可能原因**:
|
||||
- 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模块迁移!
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user