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

@@ -1,4 +1,4 @@
# 2025-12-07 UI 隡睃<EFBFBD>銝?Bug 靽桀<EFBFBD>
# 2025-12-07 UI 优化与 Bug 修复
> **用户反馈**:界面粗糙、表格未加载、缺少欢迎语、控制台报错
@@ -6,38 +6,38 @@
## 📋 问题清单
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䔮憸?
### 用户反馈的问题
1. <EFBFBD>?**銵冽聢瘝⊥<E7989D><E28AA5>㰘蝸<E3B098>𣂼<EFBFBD>**
- <EFBFBD><EFBFBD><EFBFBD>唳𥁒<EFBFBD><EFBFBD>AG Grid error #272 (<EFBFBD><EFBFBD>芣釣<EFBFBD>?
1. **表格没有加载成功**
- 控制台报错:AG Grid error #272 (模块未注册)
2. <EFBFBD>?**<2A><EFBFBD><E6B8AF>屸𢒰<E5B1B8>𧼮虜蝎㛖<E89D8E>**
2. **整体界面非常粗糙**
- 与原型图差距很大
- 颲寞<EFBFBD>銝齿<EFBFBD><EFBFBD>?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滨移<EFBFBD>?
- 边框不清晰
- 视觉效果不精致
3. <EFBFBD>?**AI <EFBFBD><EFBFBD>瘝⊥<EFBFBD><EFBFBD>霂?*
3. **AI 问答没有欢迎语**
- 导致用户一开始没注意到这部分
- 边框也不清晰
4. <EFBFBD>?**瘚讛<E7989A><E8AE9B>冽綉<E586BD>嗅蝱<E59785>仿<EFBFBD>**
4. **浏览器控制台报错**
- `Warning: [antd: Spin] tip only work in nest or fullscreen pattern`
- `AG Grid: error #272 No AG Grid modules are registered`
---
## <EFBFBD>?靽桀<E99DBD><E6A180><EFBFBD>
## ✅ 修复方案
### 1. **靽桀<EFBFBD> AG Grid <EFBFBD>瘜典<EFBFBD><EFBFBD>躰秤** <EFBFBD>?
### 1. **修复 AG Grid 模块注册错误**
**<EFBFBD><EFBFBD>**嚗鋫G Grid Community <EFBFBD><EFBFBD><EFBFBD>遬撘𤩺釣<EFBFBD>峕芋<EFBFBD>?
**问题**AG Grid Community 需要显式注册模块
**靽桀<EFBFBD>**嚗?
**修复**
```typescript
// DataGrid.tsx
import { ColDef, ModuleRegistry, AllCommunityModule } from 'ag-grid-community';
// 瘜典<EFBFBD> AG Grid <EFBFBD><EFBFBD>耨憭?error #272嚗?
// 注册 AG Grid 模块(修复 error #272
ModuleRegistry.registerModules([AllCommunityModule]);
```
@@ -45,27 +45,27 @@ ModuleRegistry.registerModules([AllCommunityModule]);
---
### 2. **瘛餃<EFBFBD> AI <EFBFBD>霂?* <20>?
### 2. **添加 AI 欢迎语** ✅
**问题**用户上传文件后AI 对话框是空白的,没有引导
**靽桀<EFBFBD>**嚗?
**修复**
```typescript
// ChatContainer.tsx
const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
id: 'welcome',
role: 'assistant' as const,
content: '<EFBFBD>典末嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?AI <20>唳旿<E594B3><E697BF><EFBFBD><EFBFBD><E692A3><EFBFBD><EFBFBD><EFBFBD>臭誑撣格<E692A3>蝻硋<E89DBB><EFBFBD><E99A9E><EFBFBD><EFBFBD>瘣埈㺭<E59F88><EFBFBD><E69FB4><EFBFBD>霂閗秩嚗?<3F>𠰴僑樴<E58391>之鈭?0<><30>挽銝箄<E98A9D><E7AE84>僑蝏?<3F>?,
content: '您好!我是您的 AI 数据分析师。我可以帮您编写代码来清洗数据。试试说:"把年龄大于60的设为老年组"。',
status: 'success' as const,
timestamp: Date.now(),
}];
```
**蝏𤘪<EFBFBD>**嚗尠<E59A97> <20><EFBFBD>銝𠹺<E98A9D><F0A0B9BA><EFBFBD><EFBFBD>𡒊<EFBFBD><F0A1928A><EFBFBD><E5969F>唳洽餈舘祗<E88898>䔶蝙<E494B6><EFBFBD>蝷?
**结果**:✅ 用户上传文件后立即看到欢迎语和使用提示
---
### 3. **隡睃<EFBFBD>颲寞<EFBFBD><EFBFBD><EFBFBD>閫㗇<EFBFBD><EFBFBD>?* <20>?
### 3. **优化边框和视觉效果** ✅
#### 3.1 增强 Chat 容器边框
@@ -85,14 +85,14 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
}
```
#### 3.2 憓𧼮撩隞<EFBFBD><EFBFBD><EFBFBD>𡑒<EFBFBD>閫㗇<EFBFBD><EFBFBD>?
#### 3.2 增强代码块视觉效果
```css
/* chat.css */
.code-block-container {
border: 2px solid #10b981; /* 蝧删遛<EFBFBD>脰器獢?*/
border: 2px solid #10b981; /* 翠绿色边框 */
border-radius: 12px;
box-shadow: 0 4px 12px rgba(16, 185, 129, 0.15); /* 蝧删遛<EFBFBD>脤狍敶?*/
box-shadow: 0 4px 12px rgba(16, 185, 129, 0.15); /* 翠绿色阴影 */
}
```
@@ -107,23 +107,23 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
---
### 4. **靽桀<EFBFBD> Spin tip 霅血<EFBFBD>** <EFBFBD>?
### 4. **修复 Spin tip 警告**
**<EFBFBD><EFBFBD>**嚗鋫nt Design Spin <EFBFBD><EFBFBD>?`tip` 撅墧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?`spinning` <EFBFBD><EFBFBD>憟堒<EFBFBD>摰嫣蝙<EFBFBD>?
**问题**Ant Design Spin 组件的 `tip` 属性需要配合 `spinning` 或嵌套内容使用
**靽桀<EFBFBD>**嚗?
**修复**
```typescript
// dc/index.tsx
<Spin size="large" spinning tip="<EFBFBD>㰘蝸銝?..">
<Spin size="large" spinning tip="加载中...">
<div style={{ minHeight: '200px' }} />
</Spin>
```
**蝏𤘪<EFBFBD>**嚗尠<E59A97> <20><EFBFBD><E689B9>啗郎<E59597>𦠜<EFBFBD>憭?
**结果**:✅ 控制台警告消失
---
### 5. **隡睃<EFBFBD><EFBFBD><EFBFBD><EFBFBD>屸𢒰撣<EFBFBD><EFBFBD>** <EFBFBD>?
### 5. **优化整体界面布局**
#### 5.1 背景渐变
@@ -146,7 +146,7 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
</div>
```
#### 5.3 蝛箇𠶖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
#### 5.3 空状态优化
```typescript
// DataGrid.tsx
@@ -155,161 +155,161 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{
<p className="text-2xl">📊 </p>
<p className="text-base text-slate-500">AI助手中上传CSV或Excel文件</p>
<div className="mt-4 text-xs text-slate-400 bg-slate-50 px-4 py-2 rounded-lg inline-block">
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?csv, .xlsx, .xls<EFBFBD><EFBFBD>?0MB?
.csv, .xlsx, .xls10MB
</div>
</div>
</div>
```
**蝏𤘪<EFBFBD>**嚗尠<E59A97> <20>屸𢒰<E5B1B8><EFBFBD>蝎曇稲<E69B87><E7A8B2><EFBFBD>銝?
**结果**:✅ 界面更加精致、专业
---
## 📊 修改清单
| <EFBFBD><EFBFBD>辣 | 靽格㺿<E6A0BC><E3BABF>捆 | 銵峕㺭 | <20><EFBFBD>?|
| 文件 | 修改内容 | 行数 | 状态 |
|------|---------|------|------|
| `DataGrid.tsx` | 瘜典<EFBFBD> AG Grid <EFBFBD> | +2 | <EFBFBD>?|
| `ChatContainer.tsx` | 瘛餃<EFBFBD><EFBFBD>霂?| +8 | <EFBFBD>?|
| `chat.css` | 憓𧼮撩颲寞<EFBFBD><EFBFBD>屸狍敶?| ~20 | <EFBFBD>?|
| `DataGrid.tsx` | 隡睃<EFBFBD>蝛箇𠶖<EFBFBD><EFBFBD><EFBFBD>摰孵膥<EFBFBD><EFBFBD> | ~15 | <EFBFBD>?|
| `index.tsx` (Tool C) | 隡睃<EFBFBD><EFBFBD>峕艶<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ~10 | <EFBFBD>?|
| `index.tsx` (DC) | 靽桀<EFBFBD> Spin 霅血<EFBFBD> | +1 | <EFBFBD>?|
| `DataGrid.tsx` | 注册 AG Grid 模块 | +2 | |
| `ChatContainer.tsx` | 添加欢迎语 | +8 | |
| `chat.css` | 增强边框和阴影 | ~20 | |
| `DataGrid.tsx` | 优化空状态和容器样式 | ~15 | |
| `index.tsx` (Tool C) | 优化背景和布局 | ~10 | |
| `index.tsx` (DC) | 修复 Spin 警告 | +1 | |
**<EFBFBD>餉恣**嚗? 銝芣<E98A9D>隞塚<E99A9E>~56 銵䔶耨<E494B6>?
**总计**6 个文件,~56 行修改
---
## 🎨 视觉对比
### 靽桀<EFBFBD><EFBFBD>?<3F>?
### 修复前 ❌
- 表格:白色背景,细边框,扁平
- Chat无边框无层次
- 代码块:灰色边框,无特色
- 蝛箇𠶖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 銝芷<E98A9D>霂?
- 空状态:简陋
- 控制台2 个错误
### 靽桀<EFBFBD><EFBFBD>?<3F>?
- 銵冽聢嚗?px 颲寞<E9A2B2>嚗屸狍敶梧<E695B6><E6A2A7><EFBFBD><EFBFBD><EFBFBD><E59A97>甈⊥<E79488>
- Chat嚗𡁏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>苊颲寞<EFBFBD>嚗屸狍敶?
### 修复后 ✅
- 表格2px 边框,阴影,圆角,层次感
- Chat:渐变背景,清晰边框,阴影
- 代码块:翠绿色边框,发光阴影
- 蝛箇𠶖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>葉嚗<EFBFBD><EFBFBD><EFBFBD>嚗𣬚移<EFBFBD><EFBFBD>蝷?
- 空状态:居中,大图标,精致提示
- 控制台0 错误
---
## <EFBFBD>?撉諹<E69289>蝏𤘪<E89D8F>
## ✅ 验证结果
### Linter <EFBFBD><EFBFBD>?
- <EFBFBD>?**<2A>躰秤<E8BAB0>?*嚗?
- <EFBFBD>𩤃<EFBFBD> **霅血<E99C85><E8A180>?*嚗?嚗<>𧊋雿輻鍂<E8BCBB>?`handleSendMessage`<EFBFBD>虾敹賜裦嚗?
### Linter 检查
- **错误数**0
- ⚠️ **警告数**1未使用的 `handleSendMessage`,可忽略)
### 浏览器控制台
- <EFBFBD>?**AG Grid <EFBFBD>躰秤**嚗𡁜歇靽桀<E99DBD>
- <EFBFBD>?**Spin 霅血<EFBFBD>**嚗𡁜歇靽桀<E99DBD>
- <EFBFBD>?**0 <EFBFBD>躰秤嚗? 霅血<E99C85>**
- **AG Grid 错误**:已修复
- **Spin 警告**:已修复
- **0 错误0 警告**
### 功能验证
| <EFBFBD><EFBFBD> | <20><EFBFBD>?| 憭<> |
| 功能 | 状态 | 备注 |
|------|------|------|
| 銵冽聢<EFBFBD>㰘蝸 | <EFBFBD>?| AG Grid <EFBFBD><EFBFBD>曄內 |
| AI <EFBFBD>霂?| <20>?| <20>芸𢆡<E88AB8>曄內撘訫紡 |
| 颲寞<EFBFBD><EFBFBD>苊 | <20>?| 撅<><EFBFBD><E6B4BB><EFBFBD> |
| <EFBFBD><EFBFBD>蝎曇稲 | <20>?| <20><EFBFBD><E4BAA5><EFBFBD><E7AC94>?|
| <EFBFBD><EFBFBD><EFBFBD>啣僕<EFBFBD><EFBFBD> | <20>?| <20>𣳇<EFBFBD>霂舀<E99C82>霅血<E99C85> |
| 表格加载 | | AG Grid 正常显示 |
| AI 欢迎语 | ✅ | 自动显示引导 |
| 边框清晰 | ✅ | 层次分明 |
| 视觉精致 | ✅ | 接近原型图 |
| 控制台干净 | ✅ | 无错误无警告 |
---
## 🎯 对照原型图的改进
### <EFBFBD><EFBFBD><EFBFBD>曄鸌<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?`撌亙<E6928C>C_<43><EFBFBD>霈曇恣V6.html`嚗?
### 原型图特点(参考 `工具C_原型设计V6.html`
1. <EFBFBD>?**皜<><EFBFBD><E88B8A>器獢?*
- 銵冽聢嚗?px 颲寞<E9A2B2>
- Chat嚗𡁜椰靘扯器獢<EFBFBD><EFBFBD><EFBFBD>?
1. **清晰的边框**
- 表格2px 边框
- Chat:左侧边框分隔
- 代码块:彩色边框
2. <EFBFBD>?**撅<><EFBFBD>?*
2. **层次感**
- 阴影效果
- 渐变背景
- 圆角设计
3. <EFBFBD>?**<2A>见末<E8A781><E69CAB><EFBFBD><EFBFBD>?*
- 憭批㦛<EFBFBD>?
3. **友好的空状态**
- 大图标
- 清晰提示
- 居中布局
4. <EFBFBD>?**AI 撘訫紡**
- <EFBFBD>霂?
4. **AI 引导**
- 欢迎语
- 使用示例
- 友好提示
**<EFBFBD>啣銁<EFBFBD><EFBFBD><EFBFBD><EFBFBD>啣歇蝏誯<EFBFBD>撣豢𦻖餈穃<EFBFBD><EFBFBD>见㦛嚗?* <20>?
**现在的实现已经非常接近原型图!**
---
## 📝 用户体验提升
### 靽桀<EFBFBD><EFBFBD>?
1. <EFBFBD>?銵冽聢<E586BD>㰘蝸憭梯揖嚗𣬚鍂<F0A3AC9A>瑕𤌴<E79195>?
2. <EFBFBD>?<3F>屸𢒰蝎㛖<E89D8E>嚗𣬚撩銋譍<E98A8B>銝𡁏<E98A9D>
3. <EFBFBD>?AI 撖寡<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滨䰻<EFBFBD><EFBFBD>雿蓥蝙<EFBFBD>?
4. <EFBFBD>?<3F><EFBFBD><E689B9>唳𥁒<E594B3><EFBFBD>敶勗<E695B6><E99DBD>
### 修复前
1. ❌ 表格加载失败,用户困惑
2. ❌ 界面粗糙,缺乏专业感
3. AI 对话框空白,不知道如何使用
4. ❌ 控制台报错,影响信心
### 靽桀<EFBFBD><EFBFBD>?
1. <EFBFBD>?銵冽聢蝡见朖<E8A781>㰘蝸嚗峕㺭<E5B395><EFBFBD><E6A0BC>?
2. <EFBFBD>?<3F>屸𢒰蝎曇稲嚗䔶<E59A97>銝𡁏<E98A9D>撘?
3. <EFBFBD>?AI <EFBFBD>霂剖<EFBFBD>撖潘<EFBFBD>雿輻鍂<EFBFBD>𡒊
4. <EFBFBD>?<3F><EFBFBD><E689B9>啣僕<E595A3><E58395>嚗諹<E59A97>銵峕<E98AB5><E5B395>?
### 修复后
1. ✅ 表格立即加载,数据清晰
2. ✅ 界面精致,专业感强
3. AI 欢迎语引导,使用明确
4. ✅ 控制台干净,运行流畅
**用户体验提升:⭐⭐⭐⭐⭐**
---
## <EFBFBD><EFBFBD> 銝衤<E98A9D>甇乩<E79487><E4B9A9>硋遣霈?
## 🚀 下一步优化建议
### 可选优化(非阻塞)
1. <EFBFBD>?**銵冽聢<E586BD>堒捐<E5A092><EFBFBD><E88AB7><EFBFBD>**
1. **表格列宽自适应**
- 根据内容自动调整列宽
2. <EFBFBD>?**隞<><E99A9E>擃䀝漁銝駁<E98A9D>**
2. **代码高亮主题**
- 更丰富的语法高亮颜色
3. <EFBFBD>?**<2A>㰘蝸<E3B098>函𤫇**
3. **加载动画**
- 更流畅的加载过渡效果
4. <EFBFBD>?**<2A><EFBFBD>撘讛挽霈?*
4. **响应式设计**
- 适配不同屏幕尺寸
5. <EFBFBD>?**敹急㭘<E680A5>格𣈲<E6A0BC>?*
- Ctrl+Enter <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
5. **快捷键支持**
- Ctrl+Enter 发送消息
- Ctrl+Z 撤销操作
---
## 🎉 总结
**<EFBFBD>?<3F><><EFBFBD>厰䔮憸睃歇靽桀<E99DBD>嚗?*
**✅ 所有问题已修复!**
- <EFBFBD>?AG Grid <EFBFBD>瘜典<EFBFBD><EFBFBD>躰秤 <20>?撌脖耨憭?
- <EFBFBD>?<3F>屸𢒰蝎㛖<E89D8E> <20>?撌脖<E6928C><E88496><EFBFBD><E59094><EFBFBD><E4BAA5><EFBFBD><E7AC94>?
- <EFBFBD>?蝻箏<E89DBB><E79488>霂?<3F>?撌脫溶<E884AB>?
- <EFBFBD>?颲寞<E9A2B2>銝齿<E98A9D><E9BDBF>?<3F>?撌脣<E6928C>撘?
- <EFBFBD>?<3F><EFBFBD><E689B9>唳𥁒<E594B3>?<3F>?撌脫<E6928C><E884AB>?
- AG Grid 模块注册错误 → 已修复
- ✅ 界面粗糙 → 已优化,接近原型图
- ✅ 缺少欢迎语 → 已添加
- ✅ 边框不清晰 → 已增强
- ✅ 控制台报错 → 已清除
**现在的界面:**
- 🎨 精致美观
- 🔍 层次清晰
- 💬 引导友好
- <EFBFBD>?餈鞱<E9A488><EFBFBD><E7989A>
- ⚡ 运行流畅
**<EFBFBD><EFBFBD><EFBFBD>臭誑<EFBFBD>匧翰<EFBFBD>唬蝙<EFBFBD>?Tool C 餈𥡝<E9A488><F0A5A19D>唳旿皜<E697BF><E79A9C><EFBFBD><E988AD>** <20><>
**用户可以愉快地使用 Tool C 进行数据清洗了!** 🎊
---
**靽桀<EFBFBD><EFBFBD>?*嚗鋫I Assistant
**<EFBFBD><EFBFBD>**嚗?025-12-07
**修复者**AI Assistant
**日期**2025-12-07
**版本**v1.1UI 优化版)
@@ -362,6 +362,5 @@ const initialMessages = defaultMessages.length > 0 ? defaultMessages : [{