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,81 +1,81 @@
# 撌亙<EFBFBD>C - 蝻箏仃<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD>摨?
# 工具C - 缺失值处理功能开发进度
**<EFBFBD><EFBFBD>烐𠯫<EFBFBD>?*嚗?025-12-10
**<EFBFBD><EFBFBD>𤏸<EFBFBD>?*嚗鋫I Assistant (Claude Sonnet 4.5)
**开发日期**2025-12-10
**开发者**AI Assistant (Claude Sonnet 4.5)
---
## <EFBFBD>?撌脣<E6928C><E884A3><EFBFBD><E99EBE>?
## ✅ 已完成部分
### 1. Python<EFBFBD>𡒊垢 - 100%摰峕<EFBFBD> <20>?
### 1. Python后端 - 100%完成 ✅
#### <EFBFBD><EFBFBD>辣嚗䫤extraction_service/operations/fillna.py`嚗?20銵䕘<E98AB5>
- <EFBFBD>?`get_column_missing_stats()` - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝻箏仃<EFBFBD><EFBFBD>霈?
#### 文件:`extraction_service/operations/fillna.py`420行
- `get_column_missing_stats()` - 获取列的缺失值统计
- 统计缺失数量、缺失率
- <EFBFBD>斗鱏<EFBFBD>唳旿蝐餃<EFBFBD><EFBFBD><EFBFBD>?<3F><>掩嚗?
- 判断数据类型(数值/分类)
- 计算均值、中位数、众数、标准差
- 推荐填补方法
- <EFBFBD>?`fillna_simple()` - <EFBFBD><EFBFBD>銵伐<EFBFBD>6蝘齿䲮瘜𤏪<EFBFBD>
- <EFBFBD><EFBFBD><EFBFBD>銵伐<EFBFBD>mean嚗?
- 銝凋<EFBFBD><EFBFBD>銵伐<EFBFBD>median嚗?
- 隡埈㺭憛怨‘嚗éode嚗?
- <EFBFBD><EFBFBD><EFBFBD>銵伐<EFBFBD>constant嚗?
- **<EFBFBD><EFBFBD>憛怠<EFBFBD>嚗Êfill嚗?* 潃?<3F><EFBFBD>
- **<EFBFBD>𤾸<EFBFBD>憛怠<EFBFBD>嚗Ê̄fill嚗?* 潃?<3F><EFBFBD>
- `fillna_simple()` - 简单填补6种方法
- 均值填补(mean
- 中位数填补(median
- 众数填补mode
- 固定值填补(constant
- **前向填充ffill** ⭐ 新增
- **后向填充bfill** ⭐ 新增
- 创建新列并插入到原列旁边
- <EFBFBD>?`fillna_mice()` - MICE憭𡁻<EFBFBD><EFBFBD> 潃?<3F><EFBFBD><E8A9A8><EFBFBD>
- `fillna_mice()` - MICE多重插补 ⭐ 核心功能
- 使用sklearn的IterativeImputer
- 支持多列同时填补
- 銝箸<EFBFBD><EFBFBD><EFBFBD>撱箸鰵<EFBFBD><EFBFBD>_MICE<EFBFBD>𡒊<EFBFBD>嚗?
- 为每列创建新列_MICE后缀
- 新列紧邻原列
#### <EFBFBD><EFBFBD>辣嚗䫤extraction_service/main.py`<EFBFBD>鰵憓?69銵䕘<E98AB5>
- <EFBFBD>?撖澆<E69296>fillna<EFBFBD>
- <EFBFBD>?瘛餃<E7989B>3銝枉ydantic霂瑟<E99C82><E79285>嚗?
#### 文件:`extraction_service/main.py`新增169行
- ✅ 导入fillna模块
- ✅ 添加3个Pydantic请求模型
- `FillnaStatsRequest`
- `FillnaSimpleRequest`
- `FillnaMiceRequest`
- <EFBFBD>?瘛餃<E7989B>3銝服PI蝡舐<E89DA1>嚗?
- ✅ 添加3个API端点
- `POST /api/operations/fillna-stats` - 获取统计
- `POST /api/operations/fillna-simple` - <EFBFBD><EFBFBD>銵?
- `POST /api/operations/fillna-simple` - 简单填补
- `POST /api/operations/fillna-mice` - MICE填补
---
### 2. Node.js<EFBFBD>𡒊垢 - 70%摰峕<EFBFBD> <20>?
### 2. Node.js后端 - 70%完成 ✅
#### 文件:`backend/src/modules/dc/tool-c/services/QuickActionService.ts`
- <EFBFBD>?瘛餃<E7989B>2銝芣𦻖<E88AA3><F0A6BB96><EFBFBD>銋㚁<E98A8B>
- ✅ 添加2个接口定义
- `FillnaSimpleParams`
- `FillnaMiceParams`
- <EFBFBD>?瘛餃<E7989B>3銝杵ervice<EFBFBD><EFBFBD>嚗?
- ✅ 添加3个Service方法:
- `getFillnaStats()` - 获取统计
- `executeFillnaSimple()` - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵?
- `executeFillnaSimple()` - 执行简单填补
- `executeFillnaMice()` - 执行MICE填补
#### 文件:`backend/src/modules/dc/tool-c/controllers/QuickActionController.ts` - ⏳待完成
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?銝杭ontroller<65><EFBFBD><E5AF9E><EFBFBD><E4BA99><EFBFBD><EFBFBD>蝡航窈瘙<E7AA88><E79899>?
需要添加3个Controller方法来处理前端请求。
---
## <EFBFBD>?敺<><E695BA><EFBFBD><EFBFBD><E99EBE>?
## ⏳ 待完成部分
### 3. Node.js<EFBFBD>𡒊垢 - QuickActionController嚗?0%嚗?
### 3. Node.js后端 - QuickActionController30%
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?銝芸<E98A9D><E88AB8><EFBFBD>䲮瘜𤏪<E7989C>
需要添加3个处理方法
```typescript
// 1. <EFBFBD><EFBFBD>蝻箏仃<EFBFBD><EFBFBD>霈?
// 1. 获取缺失值统计
async handleGetFillnaStats(request, reply) {
// 调用sessionService获取数据
// 调用quickActionService.getFillnaStats()
// 返回统计信息
}
// 2. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵?
// 2. 执行简单填补
async handleFillnaSimple(request, reply) {
// 调用sessionService获取数据
// 调用quickActionService.executeFillnaSimple()
@@ -92,83 +92,83 @@ async handleFillnaMice(request, reply) {
}
```
### 4. <EFBFBD>滨垢撘<EFBFBD><EFBFBD>𡢅<EFBFBD>0%嚗?
### 4. 前端开发0%
#### <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撌乩<EFBFBD>嚗?
#### 需要完成的工作:
1. **重命名Dialog组件**
- `DropnaDialog.tsx` <EFBFBD>?`MissingValueDialog.tsx`
- `DropnaDialog.tsx` `MissingValueDialog.tsx`
2. **实现Tab结构**
- Tab 1: 删除缺失值(保留原功能)
- Tab 2: 憛怨蝻箏仃<EFBFBD><EFBFBD>6蝘齿䲮瘜𤏪<EFBFBD>潃?<3F><EFBFBD>
- Tab 3: MICE憛怨‘ 潃?<3F><EFBFBD>
- Tab 2: 填补缺失值6种方法⭐ 重点
- Tab 3: MICE填补 ⭐ 重点
3. **Tab 2 UI实现**
- <EFBFBD><EFBFBD>㗇𥋘銝𧢲<EFBFBD>獢?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䇭憛怨嚗?
- 憛怨<EFBFBD><EFBFBD><EFBFBD>㗇𥋘嚗㇌adio.Group嚗?銝芷<E98A9D>厰★嚗?
- 列选择下拉框
- 新列名输入框自动填充原列名_填补
- 填补方法选择Radio.Group6个选项
- 固定值输入框method=constant时显示
- 统计信息展示区(缺失数、均值、中位数等)
- 憛怨<EFBFBD><EFBFBD><EFBFBD>?
- 填补预览区
4. **Tab 3 UI实现**
- 憭𡁜<EFBFBD><EFBFBD>㗇𥋘嚗㇃heckbox.Group嚗?
- 餈凋誨甈⊥㺭颲枏<EFBFBD><EFBFBD><EFBFBD>霈?0嚗?
- <EFBFBD>𤩺㦤蝘滚<EFBFBD>颲枏<EFBFBD><EFBFBD><EFBFBD>霈?2嚗?
- 多列选择Checkbox.Group
- 迭代次数输入默认10
- 随机种子输入默认42
- MICE说明文本
- 新列命名规则说明
5. **API集成**
- 添加3个API函数到`api/index.ts`
- 集成到Dialog组件
- 摰䂿緵摰墧𧒄蝏蠘恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇𥋘<EFBFBD>埈𧒄嚗?
- 实现实时统计获取(选择列时)
- 实现加载状态和进度显示
6. **更新index.tsx**
- <EFBFBD>厰僼<EFBFBD><EFBFBD>倌嚗䫤<EFBFBD>𣳇膄蝻箏仃<EFBFBD><20>?`蝻箏仃<E7AE8F><EFBFBD><E6BE86><EFBFBD>
- 按钮标签:`删除缺失值``缺失值处理`
- 更新Dialog组件引用
---
## 📊 总体进度
| <EFBFBD> | 餈𥕦漲 | <20><EFBFBD>?|
| 模块 | 进度 | 状态 |
|------|------|------|
| Python<EFBFBD>𡒊垢 | 100% | <EFBFBD>?摰峕<E691B0> |
| Node.js<EFBFBD>𡒊垢 | 70% | <EFBFBD>银 餈𥡝<E9A488>銝?|
| <EFBFBD>滨垢撘<EFBFBD><EFBFBD>?| 0% | <20><EFBFBD><><E695BA>憪?|
| 蝡臬<EFBFBD>蝡舀<EFBFBD>霂?| 0% | <20><EFBFBD><><E695BA>憪?|
| **<EFBFBD><EFBFBD>** | **42%** | <EFBFBD>银 **餈𥡝<E9A488>銝?* |
| Python后端 | 100% | ✅ 完成 |
| Node.js后端 | 70% | 🚧 进行中 |
| 前端开发 | 0% | ⏸️ 待开始 |
| 端到端测试 | 0% | ⏸️ 待开始 |
| **总体** | **42%** | 🚧 **进行中** |
---
## <EFBFBD>㴓 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
## 🎯 下一步行动
**蝡见朖隡睃<EFBFBD>**嚗?
1. 摰峕<EFBFBD>QuickActionController<EFBFBD>?銝芣䲮瘜𤏪<E7989C><EFBFBD>恣20<32><30><EFBFBD>嚗?
2. <EFBFBD>憪见<EFBFBD>蝡臬<EFBFBD><EFBFBD>𡢅<EFBFBD><EFBFBD>恣3-4撠𤩺𧒄嚗?
**立即优先**
1. 完成QuickActionController的3个方法预计20分钟
2. 开始前端开发预计3-4小时
**撱箄悅憿箏<EFBFBD>**嚗?
1. QuickActionController<EFBFBD><EFBFBD>雿?0%嚗?
2. <EFBFBD>滨垢<EFBFBD>滚𦶢<EFBFBD>䄂ialog嚗?0<><30><EFBFBD>嚗?
3. <EFBFBD>滨垢Tab蝏𤘪<EFBFBD>嚗?0<><30><EFBFBD>嚗?
4. <EFBFBD>滨垢Tab 2摰䂿緵嚗?0<><30><EFBFBD>嚗?
5. <EFBFBD>滨垢Tab 3摰䂿緵嚗?0<><30><EFBFBD>嚗?
6. API<EFBFBD><EFBFBD><EFBFBD>嚗?0<><30><EFBFBD>嚗?
7. 瘚贝<EFBFBD>嚗?0<><30><EFBFBD>嚗?8銝芰鍂靘页<E99D98>
**建议顺序**
1. QuickActionController剩余30%
2. 前端重命名Dialog10分钟
3. 前端Tab结构30分钟
4. 前端Tab 2实现50分钟
5. 前端Tab 3实现40分钟
6. API集成30分钟
7. 测试50分钟18个用例
**预计剩余时间**约4小时
---
## <EFBFBD><20><><EFBFBD>臭漁<E887AD>?
## 💡 技术亮点
1. <EFBFBD>?**<2A><EFBFBD>/<2F>𤾸<EFBFBD>憛怠<E6869B><E680A0><EFBFBD>** - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>園𡢿摨誩<EFBFBD><EFBFBD>唳旿
2. <EFBFBD>?**MICE憭𡁻<EFBFBD><EFBFBD>摰䂿緵** - <EFBFBD>餃郎<EFBFBD>𠉛弦<EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘙?
3. <EFBFBD>?**<2A><EFBFBD>蝝折<E89D9D><E68A98><EFBFBD>** - 靘蹂<EFBFBD>撖寞<EFBFBD>撉諹<EFBFBD>
4. <EFBFBD>?**<2A><EFBFBD><E7AC94>唳旿靽萘<E99DBD>** - <EFBFBD>唳旿摰匧<EFBFBD><EFBFBD><EFBFBD>
5. <EFBFBD>?**<2A><EFBFBD><E7AE84><EFBFBD>憛怨<E680A8><EFBFBD>** - <EFBFBD><EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1. **前向/后向填充支持** - 适合时间序列数据
2. **MICE多重插补实现** - 医学研究核心需求
3. **新列紧邻原列** - 便于对比验证
4. **原始数据保留** - 数据安全性高
5. **智能推荐填补方法** - 基于数据分布特征
---
@@ -176,11 +176,10 @@ async handleFillnaMice(request, reply) {
- Python后端已完全实现代码质量良好
- Node.js Service层完成Controller层待完成
- <EFBFBD>滨垢撌乩<EFBFBD><EFBFBD>𤩺<EFBFBD>憭改<EFBFBD><EFBFBD><EFBFBD>閬?-4撠𤩺𧒄
- 瘚贝<EFBFBD><EFBFBD><EFBFBD>撌脰<EFBFBD><EFBFBD>鍦末嚗?8銝迎<E98A9D>嚗峕<E59A97>霂閙𧒄<E99699>渡漲50<35><30><EFBFBD>
**敶枏<E695B6><E69E8F><EFBFBD>?*嚗𡁜歇摰峕<E691B0><E5B395><EFBFBD><E8A9A8>𡒊垢<F0A1928A><EFBFBD><EFBFBD>虾隞亦誧蝏剖<E89D8F><E58996>𣂼<EFBFBD>雿坔<E99BBF><E59D94>𡢅<EFBFBD> <20><>
- 前端工作量最大需要3-4小时
- 测试用例已规划好18个测试时间约50分钟
**当前状态**:已完成核心后端逻辑,可以继续完成剩余开发! 🚀