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,18 +1,18 @@
# 环境变量配置模板 (.env)
> **<EFBFBD><EFBFBD>﹝霂湔<EFBFBD>嚗?* <20><EFBFBD><EFBFBD><E78DA2>靘𥕦<E99D98><F0A595A6><EFBFBD> `.env` <EFBFBD>滨蔭璅⊥踎
> **雿輻鍂<EFBFBD><EFBFBD>嚗?* 憭滚<E686AD>隞乩<E99A9E><E4B9A9><EFBFBD><EFBFBD>?`backend/.env` <20><>辣銝哨<E98A9D>撟嗅<E59785><EFBFBD>摰鮋<E691B0>蝵桀<E89DB5>?
> **<EFBFBD>𥕦遣<EFBFBD><EFBFBD>嚗?* 2025-11-09
> **文档说明:** 本文档提供完整的 `.env` 配置模板
> **使用方式:** 复制以下内容到 `backend/.env` 文件中,并填入真实配置值
> **创建日期:** 2025-11-09
---
## 📋 完整配置模板
<EFBFBD>誑銝见<EFBFBD>摰孵<EFBFBD><EFBFBD><EFBFBD> `AIclinicalresearch/backend/.env` <EFBFBD><EFBFBD>辣嚗?
将以下内容复制到 `AIclinicalresearch/backend/.env` 文件:
```env
# ================================
# <EFBFBD>滚𦛚<EFBFBD><EFBFBD>蝵?
# 服务器配置
# ================================
PORT=3001
HOST=0.0.0.0
@@ -20,7 +20,7 @@ NODE_ENV=development
LOG_LEVEL=info
# ================================
# <EFBFBD>唳旿摨㯄<EFBFBD>蝵?
# 数据库配置
# ================================
DATABASE_URL=postgresql://postgres:your_password@localhost:5432/ai_clinical_research
@@ -46,7 +46,7 @@ DEEPSEEK_BASE_URL=https://api.deepseek.com
# ---------- Qwen (通过阿里云DashScope) ----------
DASHSCOPE_API_KEY=sk-your-dashscope-api-key
# ---------- Gemini (<EFBFBD><EFBFBD>? ----------
# ---------- Gemini (可选) ----------
GEMINI_API_KEY=your-gemini-api-key
# ================================
@@ -55,7 +55,7 @@ GEMINI_API_KEY=your-gemini-api-key
# CloseAI是一个API代理平台提供稳定的OpenAI和Claude访问
# 官网https://platform.openai-proxy.org
# 蝏煺<EFBFBD>API Key<EFBFBD><EFBFBD><EFBFBD>嗥鍂鈭窻penAI<EFBFBD>laude嚗?
# 统一API Key同时用于OpenAI和Claude
CLOSEAI_API_KEY=sk-your-closeai-api-key
# OpenAI端点
@@ -69,7 +69,7 @@ CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
# - Claude: claude-sonnet-4-5-20250929, claude-3-5-sonnet-20241022
# ================================
# Dify<EFBFBD>滨蔭嚗<EFBFBD>䰻霂<EFBFBD><EFBFBD>RAG撘閙<EFBFBD>嚗?
# Dify配置知识库RAG引擎
# ================================
DIFY_API_KEY=app-your-dify-api-key
DIFY_API_URL=http://localhost/v1
@@ -88,7 +88,7 @@ CORS_ORIGIN=http://localhost:5173
# ================================
# 注意事项
# ================================
# 1. 霂瑕<EFBFBD> your-* <EFBFBD><EFBFBD>蝚行𤜯<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝵桀<EFBFBD>?
# 1. 请将 your-* 占位符替换为真实的配置值
# 2. .env 文件包含敏感信息,不要提交到 git 仓库
# 3. 生产环境请使用强密码和独立的 API Key
# 4. JWT_SECRET 建议使用 32 位以上随机字符串
@@ -106,7 +106,7 @@ CLOSEAI_OPENAI_BASE_URL=https://api.openai-proxy.org/v1
CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
```
**<EFBFBD>舐鍂璅<EFBFBD>嚗?*
**可用模型:**
- OpenAI: `gpt-5-pro`
- Claude: `claude-sonnet-4-5-20250929`
@@ -120,18 +120,18 @@ CLOSEAI_CLAUDE_BASE_URL=https://api.openai-proxy.org/anthropic
cd AIclinicalresearch/backend
# 复制模板
copy .env.example .env # Windows
# <EFBFBD>?
#
cp .env.example .env # Linux/Mac
```
### 2. 填入真实配置
<EFBFBD><EFBFBD> `backend/.env` <EFBFBD><EFBFBD>辣嚗峕𤜯<EFBFBD><EFBFBD>雿滨泵嚗?
打开 `backend/.env` 文件,替换占位符:
**<EFBFBD><EFBFBD>滨蔭嚗?*
- `DATABASE_URL` - <EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>?
**必须配置:**
- `DATABASE_URL` - 数据库连接
- `DEEPSEEK_API_KEY` - DeepSeek API主力模型
- `CLOSEAI_API_KEY` - CloseAI API嚗㇉penAI+Claude嚗?
- `CLOSEAI_API_KEY` - CloseAI APIOpenAI+Claude
**可选配置:**
- `DASHSCOPE_API_KEY` - Qwen模型
@@ -154,7 +154,7 @@ npm run dev
### 不要提交到Git
蝖株恕 `.gitignore` <EFBFBD><EFBFBD>鉄嚗?
确认 `.gitignore` 包含:
```gitignore
# 环境变量文件
.env
@@ -164,14 +164,14 @@ npm run dev
### API Key安全
1. **摰𡁏<EFBFBD>頧格揢嚗?* 瘥?銝芣<E98A9D><E88AA3>湔揢銝<E68FA2>PI Key
2. **<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>撠誩<EFBFBD>嚗?* <20><EFBFBD><EFBFBD><E988AD><EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>
3. **<EFBFBD><EFBFBD><EFBFBD>𤨎嚗?* 撘<><E69298>?瘚贝<E7989A>/<2F>煺漣雿輻鍂銝滚<E98A9D><E6BB9A><EFBFBD>ey
4. **<EFBFBD>烐綉雿輻鍂嚗?* 摰𡁏<E691B0><EFBFBD><E79289>丕PI靚<49><EFBFBD><EFBFBD>韐寧鍂
1. **定期轮换:** 每3个月更换一次API Key
2. **权限最小化:** 只授予必要的权限
3. **独立密钥:** 开发/测试/生产使用不同的Key
4. **监控使用:** 定期检查API调用量和费用
### <EFBFBD>蠧摨娍<EFBFBD>?
### 泄露应急
<EFBFBD><EFBFBD>API Key銝齿<EFBFBD><EFBFBD>蠧嚗?
如果API Key不慎泄露:
1. 立即在服务商后台禁用/删除该Key
2. 生成新的API Key
3. 更新 `.env` 文件
@@ -181,21 +181,21 @@ npm run dev
## 🔍 配置验证清单
<EFBFBD>函蔡<EFBFBD>滩窈蝖株恕嚗?
部署前请确认:
- [ ] <EFBFBD>?DATABASE_URL <EFBFBD>滨蔭甇<EFBFBD>銝𥪜虾餈墧𦻖
- [ ] <EFBFBD>?DEEPSEEK_API_KEY 撌脤<EFBFBD>蝵?
- [ ] <EFBFBD>?CLOSEAI_API_KEY 撌脤<EFBFBD>蝵殷<EFBFBD><EFBFBD><EFBFBD>GPT-5<EFBFBD>laude-4.5嚗?
- [ ] <EFBFBD>?JWT_SECRET 撌脖耨<EFBFBD>嫣蛹撘箏<EFBFBD><EFBFBD>?
- [ ] <EFBFBD>?CORS_ORIGIN 撌脰挽蝵格迤蝖桃<EFBFBD><EFBFBD>滨垢<EFBFBD><EFBFBD>
- [ ] <EFBFBD>?.env <EFBFBD><EFBFBD>辣撌脫溶<EFBFBD><EFBFBD> .gitignore
- [ ] <EFBFBD>?<3F><><EFBFBD><EFBFBD><E39787>煺縑<E785BA>舀𧊋<E88880>𣂷漱<F0A382B7>it
- [ ] DATABASE_URL 配置正确且可连接
- [ ] DEEPSEEK_API_KEY 已配置
- [ ] CLOSEAI_API_KEY 已配置(用于GPT-5和Claude-4.5
- [ ] JWT_SECRET 已修改为强密码
- [ ] CORS_ORIGIN 已设置正确的前端地址
- [ ] .env 文件已添加到 .gitignore
- [ ] ✅ 所有敏感信息未提交到Git
---
**参考文档:**
- [01-<EFBFBD><EFBFBD><EFBFBD>滨蔭<EFBFBD><EFBFBD><EFBFBD>.md](./01-<EFBFBD><EFBFBD><EFBFBD>滨蔭<EFBFBD><EFBFBD><EFBFBD>.md) - 霂衣<E99C82><E8A1A3><EFBFBD><EFBFBD>蝵株秩<E6A0AA>?
- [<EFBFBD>唳旿摨栞<EFBFBD><EFBFBD>仿<EFBFBD>蝵孫(../09-<2D><EFBFBD>摰墧鴌/02-<2D>唳旿摨栞<E691A8><E6A09E>仿<EFBFBD>蝵?md) - <EFBFBD>唳旿摨㮖<EFBFBD>憿寥<EFBFBD>蝵?
- [01-环境配置指南.md](./01-环境配置指南.md) - 详细的配置说明
- [数据库连接配置](../09-架构实施/02-数据库连接配置.md) - 数据库专项配置