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,45 +1,45 @@
# <EFBFBD>唳旿摨栞挽霈∟<EFBFBD><EFBFBD>?
# 数据库设计规范
> **<EFBFBD><EFBFBD>𧋦嚗?* v2.0
> **版本:** v2.0
> **最后更新:** 2025-11-06
> **数据库:** PostgreSQL 15+
> **ORM嚗?* Prisma
> **<EFBFBD><EFBFBD><EFBFBD><EFBFBD>凒嚗?* 撟喳蝱撅?+ <20><EFBFBD>撅?+ 銝𡁜𦛚璅<E79285>撅?
> **ORM** Prisma
> **适用范围:** 平台层 + 能力层 + 业务模块层
---
## 📋 核心原则
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇芋<EFBFBD>埈㺭<EFBFBD><EFBFBD>霈曇恣<EFBFBD><EFBFBD>抅蝖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>憿颱艇<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
本规范是所有模块数据库设计的基础规范,必须严格遵守。
**霈曇恣<EFBFBD><EFBFBD>嚗?*
- <EFBFBD>?<3F>萄儐蝚砌<E89D9A><E7A08C><EFBFBD><EFBFBD>嚗?NF嚗?
- <EFBFBD>?雿輻鍂SERIAL雿靝蛹銝駁睸嚗<EFBFBD><EFBFBD>啗䌊憓痹<EFBFBD><EFBFBD><EFBFBD><EFBFBD>游末嚗?
- <EFBFBD>?<3F><><EFBFBD>㕑”<E39591><E2809D>created_at<EFBFBD>pdated_at<EFBFBD>園𡢿<EFBFBD>?
- <EFBFBD>?<3F><EFBFBD>銵其蝙<E585B6>刻蔓<E588BB>𣳇膄嚗<E88684><E59A97><EFBFBD>eleted_at摮埈挾嚗?
- <EFBFBD>?憭㚚睸蝥行<E89DA5>雿輻鍂ON DELETE CASCADE
- <EFBFBD>?<3F>𤩺<EFBFBD>摮埈挾<E59F88><EFBFBD>摮睃<E691AE><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>crypt嚗?
**设计原则:**
- ✅ 遵循第三范式3NF
- ✅ 使用SERIAL作为主键(整数自增,性能更好)
- ✅ 所有表包含created_at和updated_at时间戳
- ✅ 重要表使用软删除保留deleted_at字段)
- ✅ 外键约束使用ON DELETE CASCADE
- ✅ 敏感字段加密存储密码使用bcrypt
---
## <EFBFBD><EFBFBD>儭?Schema<EFBFBD>𠉛氖蝑𣇉裦 潃?<3F><><EFBFBD><EFBFBD>
## 🏗️ Schema隔离策略 ⭐ 最重要
### 为什么需要Schema隔离
**<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?*
1. <EFBFBD>?**璅<E79285><E288AA><EFBFBD><E7A589>?*嚗𡁏<E59A97>銝芯<E98A9D><E88AAF>⊥芋<E28AA5><EFBFBD><E59F88><EFBFBD><E7A589><EFBFBD>chema
2. <EFBFBD>?**<2A><EFBFBD><E88880><EFBFBD><E7A589>函蔡**嚗𡁜虾隞亙<E99A9E><E4BA99>砍紡<E7A08D><EFBFBD>銝芣芋<E88AA3><EFBFBD><E39B96>唳旿
3. <EFBFBD>?**<2A><EFBFBD><E88880><EFBFBD><E7A589><EFBFBD><EFBFBD>?*嚗𡁜虾隞亙<E99A9E><E4BA99>砌漱隞䀹<E99A9E>銝芣芋<E88AA3>?
4. <EFBFBD>?**<2A><><EFBFBD><EFBFBD>𠉛氖**嚗𡁜虾隞乩蛹銝滚<E98A9D>Schema霈曄蔭銝滚<E98A9D><E6BB9A><EFBFBD><EFBFBD>
5. <EFBFBD>?**<2A><EFBFBD><E8B8B9><EFBFBD><E8B3A2><EFBFBD>**嚗帋<E59A97><E5B88B>峕芋<E5B395>堒虾隞交<E99A9E><E4BAA4><EFBFBD><E8A9A8><EFBFBD><EFBFBD>?
**核心原因:**
1. **模块独立性**每个业务模块有独立的Schema
2. **支持独立部署**:可以单独导出某个模块的数据
3. **支持独立销售**:可以单独交付某个模块
4. **权限隔离**可以为不同Schema设置不同权限
5. **避免命名冲突**:不同模块可以有相同的表名
### Schema命名规范
```
platform_schema # 撟喳蝱<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>曹澈嚗?
platform_schema # 平台基础层(全局共享)
aia_schema # AI智能问答
asl_schema # AI智能文献
pkb_schema # 銝芯犖<EFBFBD><EFBFBD>摨?
pkb_schema # 个人知识库
dc_schema # 数据清洗整理
ssa_schema # 智能统计分析
st_schema # 统计分析工具
@@ -56,18 +56,18 @@ CREATE SCHEMA IF NOT EXISTS aia_schema;
-- ...其他Schema
```
### 頝沒chema靘肽<EFBFBD><EFBFBD><EFBFBD> 潃?敹<><EFBFBD><EFBFBD>
### 跨Schema依赖规则 ⭐ 必须遵守
**允许的依赖:**
```sql
-- <EFBFBD>?<3F><>捂嚗帋<E59A97><E5B88B>⊥芋<E28AA5><EFBFBD><E5A092>latform_schema
-- ✅ 允许业务模块引用platform_schema
CREATE TABLE asl_schema.literature_projects (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES platform_schema.users(id) ON DELETE CASCADE,
...
);
-- <EFBFBD>?<3F><>捂嚗𡁻<E59A97>𡁶鍂<F0A181B6><EFBFBD>撘閧鍂platform_schema
-- ✅ 允许:通用能力引用platform_schema
CREATE TABLE platform_schema.llm_usage (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES platform_schema.users(id) ON DELETE CASCADE,
@@ -77,14 +77,14 @@ CREATE TABLE platform_schema.llm_usage (
**禁止的依赖:**
```sql
-- <EFBFBD>?蝳<>迫嚗帋<E59A97><E5B88B>⊥芋<E28AA5>𦯀<EFBFBD><F0A6AF80><EFBFBD><E6B8AF><EFBFBD><E8A9A8>?
-- ❌ 禁止:业务模块之间互相引用
CREATE TABLE ssa_schema.analysis_projects (
id SERIAL PRIMARY KEY,
-- <EFBFBD>躰秤嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞碶<EFBFBD><EFBFBD>⊥芋<EFBFBD>?
-- 错误!不能引用其他业务模块
literature_project_id INTEGER REFERENCES asl_schema.literature_projects(id)
);
-- <EFBFBD>?蝳<>迫嚗䮝latform_schema<EFBFBD><EFBFBD>靘肽<EFBFBD>銝𡁜𦛚璅<EFBFBD>
-- ❌ 禁止platform_schema反向依赖业务模块
CREATE TABLE platform_schema.users (
id SERIAL PRIMARY KEY,
-- 错误platform_schema不能依赖业务模块
@@ -92,104 +92,104 @@ CREATE TABLE platform_schema.users (
);
```
**<EFBFBD><EFBFBD>𡁏<EFBFBD>嚗?*
**正确做法:**
```
頝冽芋<EFBFBD>埈㺭<EFBFBD><EFBFBD><EFBFBD>𥪜銁摨𠉛鍂撅<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝滚銁<EFBFBD>唳旿摨枏<EFBFBD>嚗?
跨模块数据关联在应用层处理,不在数据库层!
方式1通过user_id关联
- 两个模块都引用platform_schema.users
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>user_id<EFBFBD>亥砭銝支葵璅<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- 在应用层通过user_id查询两个模块的数据
- 在应用层组装数据
<EFBFBD><EFBFBD>2嚗𡁜<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D摮㛖泵銝?
- <EFBFBD>刻”銝剖<EFBFBD><EFBFBD><EFBFBD>隞𡝗芋<EFBFBD><EFBFBD>銝𡁜𦛚ID嚗ĀARCHAR嚗?
- 銝滚遣蝡见<EFBFBD><EFBFBD><EFBFBD>蝟?
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>撉諹<EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
方式2存储业务ID字符串
- 在表中存储其他模块的业务IDVARCHAR
- 不建立外键关系
- 在应用层验证ID的有效性
```
---
## 📝 命名规范
### 銵典𦶢<EFBFBD>?
### 表命名
**<EFBFBD><EFBFBD>嚗?*
**规则:**
- 小写字母
- 銝见<EFBFBD>蝥踹<EFBFBD><EFBFBD>?
- 下划线分隔
- 复数形式
- Schema<EFBFBD><EFBFBD><EFBFBD>䰻霂𧒄雿輻鍂嚗?
- Schema前缀(查询时使用)
**蝷箔<EFBFBD>嚗?*
**示例:**
```sql
-- <EFBFBD>?甇<>
-- ✅ 正确
CREATE TABLE asl_schema.literature_projects (...);
CREATE TABLE platform_schema.users (...);
CREATE TABLE pkb_schema.knowledge_bases (...);
-- <EFBFBD>?<3F>躰秤
-- ❌ 错误
CREATE TABLE ASLSchema.LiteratureProject (...); -- 驼峰
CREATE TABLE asl_schema.project (...); -- 单数
CREATE TABLE literature-projects (...); -- 雿輻鍂餈𧼮<EFBFBD>蝚?
CREATE TABLE literature-projects (...); -- 使用连字符
```
### 字段命名
**<EFBFBD><EFBFBD>嚗?*
**规则:**
- 小写字母
- 銝见<EFBFBD>蝥踹<EFBFBD><EFBFBD>?
- 下划线分隔
- 语义清晰
**蝷箔<EFBFBD>嚗?*
**示例:**
```sql
-- <EFBFBD>?甇<>
-- ✅ 正确
user_id
created_at
project_name
is_active
-- <EFBFBD>?<3F>躰秤
-- ❌ 错误
userId -- 驼峰
createdat -- 瘝⊥<EFBFBD>銝见<EFBFBD>蝥?
prjName -- 蝻拙<EFBFBD>銝齿<EFBFBD><EFBFBD>?
createdat -- 没有下划线
prjName -- 缩写不清晰
```
### 索引命名
**<EFBFBD><EFBFBD>嚗?* `idx_銵典<E98AB5>_摮埈挾<E59F88>
**规则:** `idx_表名_字段名`
**蝷箔<EFBFBD>嚗?*
**示例:**
```sql
-- <20>?甇<>
-- ✅ 正确
CREATE INDEX idx_users_email ON platform_schema.users(email);
CREATE INDEX idx_projects_user_id ON asl_schema.literature_projects(user_id);
CREATE INDEX idx_projects_user_status ON asl_schema.literature_projects(user_id, status);
-- <20>?<3F>躰秤
-- ❌ 错误
CREATE INDEX user_email_idx ... -- 顺序错误
CREATE INDEX index_on_email ... -- <EFBFBD>滨妍銝齿<EFBFBD><EFBFBD>?
CREATE INDEX index_on_email ... -- 名称不清晰
```
### 外键命名
**<EFBFBD><EFBFBD>嚗?* `fk_銵典<EFBFBD>_<EFBFBD><EFBFBD>銵典<EFBFBD>`
**规则:** `fk_表名_关联表名`
**蝷箔<EFBFBD>嚗?*
**示例:**
```sql
-- <20>?甇<>
-- ✅ 正确
CONSTRAINT fk_projects_users
FOREIGN KEY (user_id) REFERENCES platform_schema.users(id);
CONSTRAINT fk_items_projects
FOREIGN KEY (project_id) REFERENCES asl_schema.literature_projects(id);
-- <20>?<3F>躰秤
CONSTRAINT user_fk ... -- <EFBFBD>滨妍銝齿<EFBFBD><EFBFBD>?
-- ❌ 错误
CONSTRAINT user_fk ... -- 名称不清晰
CONSTRAINT foreign_key_users ... -- 太长
```
---
## <EFBFBD><EFBFBD> <20>𡁶鍂摮埈挾 潃?敹<><EFBFBD><E29786>
## 📊 通用字段 ⭐ 必须包含
### 所有表必须包含
@@ -201,13 +201,13 @@ CREATE TABLE xxx_schema.table_name (
-- 业务字段
...
-- <EFBFBD>園𡢿<EFBFBD><EFBFBD><EFBFBD>◆嚗?
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
updated_at TIMESTAMP DEFAULT NOW() NOT NULL
);
```
### <EFBFBD><EFBFBD>銵典<EFBFBD><EFBFBD><EFBFBD>鉄嚗<EFBFBD><EFBFBD>𣳇膄嚗?
### 重要表应包含(软删除)
```sql
CREATE TABLE xxx_schema.important_table (
@@ -219,7 +219,7 @@ CREATE TABLE xxx_schema.important_table (
-- 软删除字段(可选,重要表建议添加)
deleted_at TIMESTAMP,
-- <EFBFBD>園𡢿<EFBFBD><EFBFBD><EFBFBD>◆嚗?
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
updated_at TIMESTAMP DEFAULT NOW() NOT NULL
);
@@ -228,7 +228,7 @@ CREATE TABLE xxx_schema.important_table (
SELECT * FROM xxx_schema.important_table WHERE deleted_at IS NULL;
```
### <EFBFBD><EFBFBD><EFBFBD><EFBFBD>銵典<EFBFBD>憿餃<EFBFBD><EFBFBD>?
### 用户关联表必须包含
```sql
CREATE TABLE xxx_schema.user_related_table (
@@ -240,7 +240,7 @@ CREATE TABLE xxx_schema.user_related_table (
-- 业务字段
...
-- <EFBFBD>園𡢿<EFBFBD><EFBFBD><EFBFBD>◆嚗?
-- 时间戳(必须)
created_at TIMESTAMP DEFAULT NOW() NOT NULL,
updated_at TIMESTAMP DEFAULT NOW() NOT NULL
);
@@ -250,7 +250,7 @@ CREATE TABLE xxx_schema.user_related_table (
## 🔍 索引设计规范
### <EFBFBD>◆瘛餃<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>畾?
### 必须添加索引的字段
**1. 主键**
```sql
@@ -266,7 +266,7 @@ CREATE INDEX idx_projects_user_id ON asl_schema.literature_projects(user_id);
**3. 常用查询字段**
```sql
-- status<EFBFBD>𠶖<EFBFBD><EFBFBD><EFBFBD>畾蛛<EFBFBD>撣貊鍂鈭竝HERE嚗?
-- status状态字段常用于WHERE
CREATE INDEX idx_projects_status ON asl_schema.literature_projects(status);
-- created_at时间字段常用于排序
@@ -281,22 +281,22 @@ CREATE UNIQUE INDEX idx_users_email ON platform_schema.users(email);
### 复合索引
**<EFBFBD><EFBFBD>嚗?*
**规则:**
- 高频组合查询使用复合索引
- 最常查询的字段放在前面
- 憭滚<E686AD><E89D9D><EFBCB7><EFBFBD>憭?銝芸<E98A9D>畾?
- 复合索引最多3个字段
**蝷箔<EFBFBD>嚗?*
**示例:**
```sql
-- <20>?甇<>嚗鮁ser_id + status <EFBFBD><EFBFBD><EFBFBD>亥砭
-- ✅ 正确user_id + status 组合查询
CREATE INDEX idx_projects_user_status
ON asl_schema.literature_projects(user_id, status);
-- <20>臭誑隡睃<E99AA1>隞乩<E99A9E><E4B9A9>亥砭嚗?
-- 可以优化以下查询:
-- WHERE user_id = ? AND status = ?
-- WHERE user_id = ? <EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
-- WHERE user_id = ? (只用前缀)
-- <20>?<3F>躰秤嚗𡁜<E59A97>畾菔<E795BE>憭?
-- ❌ 错误:字段过多
CREATE INDEX idx_projects_complex
ON asl_schema.literature_projects(user_id, status, created_at, updated_at);
```
@@ -307,7 +307,7 @@ CREATE INDEX idx_projects_complex
### ON DELETE策略
**<EFBFBD><EFBFBD>嚗?*
**规则:**
```sql
-- 用户删除时,级联删除关联数据
FOREIGN KEY (user_id)
@@ -319,15 +319,15 @@ FOREIGN KEY (project_id)
REFERENCES asl_schema.literature_projects(id)
ON DELETE CASCADE;
-- <20><EFBFBD><E5AF9E><EFBFBD><EFBFBD>嚗帋<E59A97><E5B88B><EFBFBD><E8B3A2>?
-- 特殊情况:不能删除
FOREIGN KEY (parent_id)
REFERENCES xxx_schema.parent_table(id)
ON DELETE RESTRICT; -- <20><EFBFBD>霈啣<E99C88><E595A3><EFBFBD><E79487><EFBCB7>?
ON DELETE RESTRICT; -- 有子记录时禁止删除
```
### 外键索引
**<EFBFBD><EFBFBD>嚗?* <20><><EFBFBD><EFBFBD><E58CA7><EFBFBD>憿餅溶<E9A485>删揣撘?
**规则:** 所有外键必须添加索引
```sql
-- 创建外键
@@ -342,11 +342,11 @@ CREATE INDEX idx_items_project_id ON asl_schema.literature_items(project_id);
---
## <EFBFBD>?<3F><EFBFBD>隡睃<E99AA1><EFBFBD><E996AB>
## ⚡ 性能优化规范
### 大表分区(可选)
**<2A><><EFBFBD>箸艶嚗?* 撟游<E6929F><E6B8B8>?> 100銝<30>扇敶?
**适用场景:** 年增长 > 100万记录
```sql
-- 按月分区如llm_usage表
@@ -388,13 +388,13 @@ WHERE created_at < NOW() - INTERVAL '1 year';
```sql
-- 密码字段
password VARCHAR(255) NOT NULL -- 雿輻鍂bcrypt<70><EFBFBD><EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD><E692A3>?
password VARCHAR(255) NOT NULL -- 使用bcrypt加密存储哈希值
-- API Key字段
api_key_encrypted TEXT NOT NULL -- 使用AES-256加密
-- 个人敏感信息
phone_encrypted VARCHAR(255) -- <EFBFBD>𧢲㦤<EFBFBD><EFBFBD>撖?
phone_encrypted VARCHAR(255) -- 手机号加密
id_card_encrypted VARCHAR(255) -- 身份证号加密
```
@@ -402,7 +402,7 @@ id_card_encrypted VARCHAR(255) -- 身份证号加密
```sql
-- 日志中不记录敏感字段
-- 撘<><E69298>?瘚贝<E7989A><E8B49D><EFBFBD>雿輻鍂<E8BCBB><EFBFBD><E69C9B>唳旿
-- 开发/测试环境使用脱敏数据
UPDATE platform_schema.users
SET
email = CONCAT('user', id, '@example.com'),
@@ -416,71 +416,71 @@ WHERE environment = 'development';
### 常用字段类型
| <EFBFBD><EFBFBD>?| <20><EFBFBD>蝐餃<E89D90> | 霂湔<E99C82> |
| 用途 | 推荐类型 | 说明 |
|------|---------|------|
| 主键 | SERIAL | 整数自增 |
| 憭㚚睸 | INTEGER | 銝𦒘蜓<EFBFBD>桃掩<EFBFBD><EFBFBD><EFBFBD>?|
| <EFBFBD><EFBFBD><EFBFBD>?| VARCHAR(N) | N<500<EFBFBD><EFBFBD>憪枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>憸?|
| <EFBFBD><EFBFBD><EFBFBD>?| TEXT | <EFBFBD>𣳇鵭摨阡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈啜<EFBFBD><EFBFBD><EFBFBD>摰?|
| <EFBFBD><EFBFBD><EFBFBD>?| BOOLEAN | true/false |
| <EFBFBD><EFBFBD><EFBFBD>園𡢿 | TIMESTAMP | 蝎曄<EFBFBD>唳神蝘?|
| 外键 | INTEGER | 与主键类型一致 |
| 短文本 | VARCHAR(N) | N<500,如姓名、标题 |
| 长文本 | TEXT | 无长度限制,如描述、内容 |
| 布尔值 | BOOLEAN | true/false |
| 日期时间 | TIMESTAMP | 精确到毫秒 |
| 金额 | DECIMAL(10,2) | 避免精度问题 |
| JSON | JSONB | 支持索引,性能更好 |
### 字段长度建议
```sql
-- <20><EFBFBD><E5899C>?
-- 短文本
name VARCHAR(100) -- 姓名
title VARCHAR(200) -- 标题
email VARCHAR(255) -- 邮箱
phone VARCHAR(20) -- <EFBFBD>𧢲㦤<EFBFBD>?
phone VARCHAR(20) -- 手机号
-- <20><EFBFBD><E59786><EFBFBD>銝?
-- 状态枚举
status VARCHAR(20) -- active, inactive, deleted
role VARCHAR(20) -- user, admin
-- <20><EFBFBD><E8B8B5>?
-- 长文本
description TEXT -- 描述
content TEXT -- 内容
```
---
## <EFBFBD>?璉<><E79289><EFBFBD><E4BAA4>?
## ✅ 检查清单
**设计新表时必须检查:**
- [ ] 銵典<EFBFBD>蝚血<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?銝见<E98A9D>蝥?憭齿㺭嚗?
- [ ] 表名符合命名规范(小写+下划线+复数)
- [ ] 使用正确的Schemaplatform/aia/asl/pkb等
- [ ] <EFBFBD><EFBFBD>鉄id銝駁睸嚗𠄎ERIAL PRIMARY KEY嚗?
- [ ] <EFBFBD><EFBFBD>created_at<EFBFBD>pdated_at<EFBFBD>園𡢿<EFBFBD>?
- [ ] 包含id主键SERIAL PRIMARY KEY
- [ ] 包含created_at和updated_at时间戳
- [ ] 用户关联表包含user_id外键
- [ ] 所有外键都有ON DELETE策略
- [ ] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>瘛餃<EFBFBD><EFBFBD>揣撘?
- [ ] 撣貊鍂<EFBFBD>亥砭摮埈挾瘛餃<EFBFBD><EFBFBD>揣撘?
- [ ] 所有外键都添加了索引
- [ ] 常用查询字段添加了索引
- [ ] 外键约束符合跨Schema依赖规则
- [ ] <EFBFBD>𤩺<EFBFBD>摮埈挾撌脣<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
- [ ] 敏感字段已加密存储
---
## 🔗 相关文档
**<EFBFBD><EFBFBD>嚗?*
- [<EFBFBD>唳旿摨枏<EFBFBD><EFBFBD><EFBFBD>](./03-<2D>唳旿摨枏<E691A8><EFBFBD><EFBFBD>㦛.md) 潃?<3F><EFBFBD><E4BAA6><EFBFBD><EFBFBD>chema<EFBFBD>諹”
**总览:**
- [数据库全局视图](./03-数据库全局视图.md) ⭐ 查看所有Schema和表
**璅⊥踎嚗?*
- [<EFBFBD>唳旿摨栞挽霈⊥芋<EFBFBD>瓢(../_templates/<EFBFBD>唳旿摨栞挽霈?璅⊥踎.md)
**模板:**
- [数据库设计模板](../_templates/数据库设计-模板.md)
**各模块设计:**
- [撟喳蝱<EFBFBD><EFBFBD><EFBFBD>(../01-撟喳蝱<E596B3><EFBFBD>撅?README.md)
- [<EFBFBD>𡁶鍂<EFBFBD><EFBFBD><EFBFBD>(../02-<2D>𡁶鍂<F0A181B6><EFBFBD>撅?README.md)
- [平台基础层](../01-平台基础层/README.md)
- [通用能力层](../02-通用能力层/README.md)
- [业务模块层](../03-业务模块/README.md)
---
**最后更新:** 2025-11-06
**维护人:** 技术架构师
**<EFBFBD><EFBFBD>𧋦嚗?* v2.0
**版本:** v2.0