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,25 +1,25 @@
# [<EFBFBD><EFBFBD>滨妍] - <20>唳旿摨栞挽霈?
# [模块名称] - 数据库设计
> **Schema嚗?* `xxx_schema`
> **銵冽㺭<EFBFBD>𧶏<EFBFBD>** X銝?
> **靘肽<EFBFBD>嚗?* platform_schema.users<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
> **Schema** `xxx_schema`
> **表数量:** X
> **依赖:** platform_schema.users(如有)
> **最后更新:** YYYY-MM-DD
---
## 📋 Schema说明
**Schema<EFBFBD>𥕦遣嚗?*
**Schema创建:**
```sql
CREATE SCHEMA IF NOT EXISTS xxx_schema;
```
**<EFBFBD>諹提<EFBFBD><EFBFBD>凒嚗?*
**职责范围:**
- 功能1相关数据
- 功能2相关数据
- ...
**靘肽<EFBFBD><EFBFBD>喟頂嚗?*
**依赖关系:**
- 依赖 `platform_schema.users`(用户信息)
- 依赖 `platform_schema.xxx`(如有)
@@ -28,30 +28,30 @@ CREATE SCHEMA IF NOT EXISTS xxx_schema;
## 📊 ER图可选
```
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? users (憭㚚<EFBFBD>) <EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>?1:N
<EFBFBD>?
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? 銝餉” <EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>?1:N
<EFBFBD>?
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>? 摮鞱” <EFBFBD>?
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
┌─────────────────┐
users (外部)
└────────┬────────┘
1:N
┌─────────────────┐
│ 主表
└────────┬────────┘
1:N
┌─────────────────┐
│ 子表
└─────────────────┘
```
---
## <EFBFBD><EFBFBD> 銵函<E98AB5><E587BD><EFBFBD>挽霈?
## 📋 表结构设计
### 1. xxx_table_name<EFBFBD><EFBFBD>讛膩嚗?
### 1. xxx_table_name(表描述)
**<EFBFBD><EFBFBD><EFBFBD>** 蝞<><EFBFBD><EFBFBD>舘”<E88898><E2809D><EFBFBD>?
**用途:** 简要说明表的用途
**摮埈挾霂湔<EFBFBD>嚗?*
**字段说明:**
```sql
CREATE TABLE xxx_schema.xxx_table_name (
@@ -66,7 +66,7 @@ CREATE TABLE xxx_schema.xxx_table_name (
description TEXT,
status VARCHAR(20) DEFAULT 'active',
-- <EFBFBD>園𡢿<EFBFBD><EFBFBD><EFBFBD>◆嚗?
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
@@ -76,9 +76,9 @@ CREATE TABLE xxx_schema.xxx_table_name (
);
```
**摮埈挾霂西圾嚗?*
**字段详解:**
| 摮埈挾<EFBFBD>?| 蝐餃<E89D90> | 蝥行<E89DA5> | 霂湔<E99C82> |
| 字段名 | 类型 | 约束 | 说明 |
|--------|------|------|------|
| id | SERIAL | PK | 主键 |
| user_id | INTEGER | FK, NOT NULL | 用户ID |
@@ -88,8 +88,8 @@ CREATE TABLE xxx_schema.xxx_table_name (
| created_at | TIMESTAMP | NOT NULL | 创建时间 |
| updated_at | TIMESTAMP | NOT NULL | 更新时间 |
**銝𡁜𦛚閫<EFBFBD><EFBFBD>嚗?*
- 瘥譍葵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>憭𡁜<EFBFBD>撱旗銝芾扇敶?
**业务规则:**
- 每个用户最多创建X个记录
- status字段的有效值active, inactive, deleted
- 软删除不物理删除只修改status为deleted
@@ -97,7 +97,7 @@ CREATE TABLE xxx_schema.xxx_table_name (
### 2. xxx_table_name_2第二个表
<EFBFBD><EFBFBD>憭滢<EFBFBD><EFBFBD><EFBFBD>蝏𤘪<EFBFBD>嚗?
(重复上面的结构)
---
@@ -105,7 +105,7 @@ CREATE TABLE xxx_schema.xxx_table_name (
### 单列索引
```sql
-- <EFBFBD><EFBFBD>ID蝝<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憿餃<EFBFBD><EFBFBD>嚗?
-- 用户ID索引外键必须加索引
CREATE INDEX idx_xxx_user_id ON xxx_schema.xxx_table_name(user_id);
-- 状态索引(常用筛选字段)
@@ -117,7 +117,7 @@ CREATE INDEX idx_xxx_created_at ON xxx_schema.xxx_table_name(created_at DESC);
### 复合索引
```sql
-- <EFBFBD><EFBFBD>+<2B><EFBFBD><E59786><EFBFBD><EFBFBD><EFBFBD>䰻霂?
-- 用户+状态组合查询
CREATE INDEX idx_xxx_user_status ON xxx_schema.xxx_table_name(user_id, status);
```
@@ -127,13 +127,13 @@ CREATE INDEX idx_xxx_user_status ON xxx_schema.xxx_table_name(user_id, status);
### 依赖关系
```sql
-- 靘肽<EFBFBD><EFBFBD><EFBFBD>銵?
-- 依赖用户表
ALTER TABLE xxx_schema.xxx_table_name
ADD CONSTRAINT fk_xxx_users
FOREIGN KEY (user_id) REFERENCES platform_schema.users(id)
ON DELETE CASCADE; -- <EFBFBD><EFBFBD><EFBFBD>𣳇膄<EFBFBD>嗥漣<EFBFBD>𥪜<EFBFBD><EFBFBD>?
ON DELETE CASCADE; -- 用户删除时级联删除
-- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
-- 模块内关联
ALTER TABLE xxx_schema.child_table
ADD CONSTRAINT fk_child_parent
FOREIGN KEY (parent_id) REFERENCES xxx_schema.parent_table(id)
@@ -141,14 +141,14 @@ ALTER TABLE xxx_schema.child_table
```
### 外键策略
- <EFBFBD>?**ON DELETE CASCADE**嚗𡁶鍂<F0A181B6><EFBFBD><E79195>斗𧒄嚗諹䌊<E8ABB9><EFBFBD><E585B8><EFBFBD><E69697><EFBFBD><E58CA7>娍㺭<E5A88D>?
- <EFBFBD>𩤃<EFBFBD> **頝沒chema憭㚚睸**嚗𡁜蘨<F0A1819C><EFBFBD><E8B3A2>?platform_schema嚗䔶<E59A97><E494B6><EFBFBD><E8B3A2><EFBFBD>隞碶<E99A9E><E7A2B6>⊥芋<E28AA5>?
- **ON DELETE CASCADE**:用户删除时,自动删除所有关联数据
- ⚠️ **跨Schema外键**:只能引用 platform_schema不能引用其他业务模块
---
## 📈 数据迁移(可选)
### <EFBFBD><EFBFBD><EFBFBD>𡝗㺭<EFBFBD>?
### 初始化数据
```sql
-- 如果需要初始化数据
INSERT INTO xxx_schema.xxx_table_name (field_name, status) VALUES
@@ -164,40 +164,40 @@ INSERT INTO xxx_schema.xxx_table_name (field_name, status) VALUES
---
## <EFBFBD><EFBFBD> <20>唳旿<E594B3><EFBFBD>隡?
## 📊 数据量预估
| 銵典<EFBFBD> | 憸<>摯霈啣<E99C88><E595A3>?| 憓鮋鵭<E9AE8B>笔漲 |
| 表名 | 预估记录数 | 增长速度 |
|------|-----------|---------|
| xxx_table_name | 10銝?撟?| 銝剔<E98A9D> |
| xxx_table_name_2 | 100銝?撟?| 擃?|
| xxx_table_name | 10万/年 | 中等 |
| xxx_table_name_2 | 100万/年 | 高 |
---
## ⚠️ 注意事项
**<EFBFBD><EFBFBD>隡睃<EFBFBD>嚗?*
**性能优化:**
- 大表必须添加分页查询
- 热点字段必须添加索引
- 定期清理软删除的数据
**安全性:**
- <EFBFBD>𤩺<EFBFBD>摮埈挾<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 敏感字段需要加密存储
- 所有外键必须有 ON DELETE 策略
- 避免N+1查询问题
**维护性:**
- 表结构变更需要写迁移脚本
- <EFBFBD><EFBFBD><EFBFBD>䀹凒<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞賣㺭<EFBFBD>?
- 重要变更需要备份数据
---
## 🔗 相关文档
**<EFBFBD><EFBFBD>嚗?*
- [<EFBFBD>唳旿摨栞挽霈∟<EFBFBD><EFBFBD><EFBFBD>(../../04-撘<><E69298>𤏸<EFBFBD><F0A48FB8>?01-<2D>唳旿摨栞挽霈∟<E99C88><E2889F>?md)
- [<EFBFBD>唳旿摨枏<EFBFBD><EFBFBD><EFBFBD>](../../04-<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>?03-<2D>唳旿摨枏<E691A8><EFBFBD><EFBFBD>.md)
**规范:**
- [数据库设计规范](../../04-开发规范/01-数据库设计规范.md)
- [数据库全局视图](../../04-开发规范/03-数据库全局视图.md)
**API霈曇恣嚗?*
**API设计:**
- [本模块API设计](./02-API设计.md)
---