library-picturebook-activity/backend/docs/SCHOOL_MODULE_SCHEMA.md
aid 418aa57ea8 Day4: 超管端设计优化 + UGC绘本创作社区P0实现
一、超管端设计优化
- 文档管理SOP体系建立,docs目录重组
- 统一用户管理:跨租户全局视角,合并用户管理+公众用户
- 活动监管全模块重构:全部活动(统计卡片+阶段筛选+SuperDetail详情页)、报名数据/作品数据/评审进度(两层合一扁平列表)、成果发布(去Tab+统计+隐藏写操作)
- 菜单精简:移除评委管理/评审规则/通知管理
- Bug修复:租户编辑丢失隐藏菜单、pageSize限制、主色统一

二、UGC绘本创作社区P0
- 数据库:10张新表(user_works/user_work_pages/work_tags等)
- 子女账号独立化:Child升级为独立User,家长切换+独立登录
- 用户作品库:CRUD+发布审核,8个API
- AI创作流程:提交→生成→保存到作品库,4个API
- 作品广场:首页改造为推荐流,标签+搜索+排序
- 内容审核(超管端):作品审核+作品管理+标签管理
- 活动联动:WorkSelector作品选择器
- 布局改造:底部5Tab(发现/创作/活动/作品库/我的)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 22:20:25 +08:00

302 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 学校模块数据库设计文档
## 概述
本文档描述了学校管理系统的数据库表设计,包括学校信息、年级、班级、部门、教师和学生等核心实体。
## 设计原则
1. **租户隔离**:所有表都通过 `tenantId` 关联到 `Tenant` 表,实现多租户数据隔离
2. **用户统一**:教师和学生都基于 `User` 表,通过一对一关系扩展特定信息
3. **数据完整性**:使用外键约束和级联删除保证数据一致性
4. **审计追踪**:所有表都包含创建人、修改人、创建时间、修改时间字段
## 表结构设计
### 1. 学校信息表 (School)
**说明**:扩展租户信息,存储学校的详细资料。与 `Tenant` 表一对一关系。
**字段说明**
- `id`: 主键
- `tenantId`: 租户ID唯一一对一关联Tenant
- `address`: 学校地址
- `phone`: 联系电话
- `principal`: 校长姓名
- `established`: 建校时间
- `description`: 学校描述
- `logo`: 学校Logo URL
- `website`: 学校网站
- `creator/modifier`: 创建人/修改人ID
- `createTime/modifyTime`: 创建/修改时间
**关系**
- 一对一关联 `Tenant`
- 多对一关联 `User` (创建人/修改人)
---
### 2. 年级表 (Grade)
**说明**:管理学校的年级信息,如一年级、二年级等。
**字段说明**
- `id`: 主键
- `tenantId`: 租户ID
- `name`: 年级名称(如:一年级、二年级)
- `code`: 年级编码在租户内唯一grade_1, grade_2
- `level`: 年级级别用于排序1, 2, 3
- `description`: 年级描述
- `validState`: 有效状态1-有效2-失效)
- `creator/modifier`: 创建人/修改人ID
- `createTime/modifyTime`: 创建/修改时间
**唯一约束**
- `[tenantId, code]`: 租户内年级编码唯一
- `[tenantId, level]`: 租户内年级级别唯一
**关系**
- 多对一关联 `Tenant`
- 一对多关联 `Class` (班级)
- 多对一关联 `User` (创建人/修改人)
---
### 3. 部门表 (Department)
**说明**:管理学校的部门信息,支持树形结构(如:教务处 > 语文组)。
**字段说明**
- `id`: 主键
- `tenantId`: 租户ID
- `name`: 部门名称
- `code`: 部门编码(在租户内唯一)
- `parentId`: 父部门ID支持树形结构
- `description`: 部门描述
- `sort`: 排序
- `validState`: 有效状态1-有效2-失效)
- `creator/modifier`: 创建人/修改人ID
- `createTime/modifyTime`: 创建/修改时间
**唯一约束**
- `[tenantId, code]`: 租户内部门编码唯一
**关系**
- 多对一关联 `Tenant`
- 自关联(树形结构):`parent` 和 `children`
- 一对多关联 `Teacher` (教师)
- 多对一关联 `User` (创建人/修改人)
---
### 4. 班级表 (Class)
**说明**:管理班级信息,支持行政班级(教学班级)和兴趣班两种类型。
**字段说明**
- `id`: 主键
- `tenantId`: 租户ID
- `gradeId`: 年级ID
- `name`: 班级名称一年级1班、二年级2班
- `code`: 班级编码(在租户内唯一)
- `type`: 班级类型1-行政班级/教学班级2-兴趣班)
- `capacity`: 班级容量(可选)
- `description`: 班级描述
- `validState`: 有效状态1-有效2-失效)
- `creator/modifier`: 创建人/修改人ID
- `createTime/modifyTime`: 创建/修改时间
**唯一约束**
- `[tenantId, code]`: 租户内班级编码唯一
**关系**
- 多对一关联 `Tenant`
- 多对一关联 `Grade` (年级)
- 一对多关联 `Student` (学生,仅行政班级)
- 一对多关联 `StudentInterestClass` (学生兴趣班关联)
- 多对一关联 `User` (创建人/修改人)
**注意事项**
- `students` 关系仅用于行政班级type=1需要在应用层验证
- 兴趣班通过 `StudentInterestClass` 表关联学生
---
### 5. 教师表 (Teacher)
**说明**:存储教师的详细信息,与 `User` 表一对一关系。
**字段说明**
- `id`: 主键
- `userId`: 用户ID唯一一对一关联User
- `tenantId`: 租户ID
- `departmentId`: 部门ID
- `employeeNo`: 工号(在租户内唯一)
- `phone`: 联系电话
- `idCard`: 身份证号
- `gender`: 性别1-男2-女)
- `birthDate`: 出生日期
- `hireDate`: 入职日期
- `subject`: 任教科目(可选,如:语文、数学)
- `title`: 职称(可选,如:高级教师、一级教师)
- `description`: 教师描述
- `validState`: 有效状态1-有效2-失效)
- `creator/modifier`: 创建人/修改人ID
- `createTime/modifyTime`: 创建/修改时间
**唯一约束**
- `userId`: 用户ID唯一一对一
- `[tenantId, employeeNo]`: 租户内工号唯一
**关系**
- 一对一关联 `User`
- 多对一关联 `Tenant`
- 多对一关联 `Department` (部门)
- 多对一关联 `User` (创建人/修改人)
---
### 6. 学生表 (Student)
**说明**:存储学生的详细信息,与 `User` 表一对一关系。
**字段说明**
- `id`: 主键
- `userId`: 用户ID唯一一对一关联User
- `tenantId`: 租户ID
- `classId`: 行政班级ID
- `studentNo`: 学号(在租户内唯一)
- `phone`: 联系电话
- `idCard`: 身份证号
- `gender`: 性别1-男2-女)
- `birthDate`: 出生日期
- `enrollmentDate`: 入学日期
- `parentName`: 家长姓名
- `parentPhone`: 家长电话
- `address`: 家庭地址
- `description`: 学生描述
- `validState`: 有效状态1-有效2-失效)
- `creator/modifier`: 创建人/修改人ID
- `createTime/modifyTime`: 创建/修改时间
**唯一约束**
- `userId`: 用户ID唯一一对一
- `[tenantId, studentNo]`: 租户内学号唯一
**关系**
- 一对一关联 `User`
- 多对一关联 `Tenant`
- 多对一关联 `Class` (行政班级)
- 一对多关联 `StudentInterestClass` (兴趣班关联)
- 多对一关联 `User` (创建人/修改人)
**注意事项**
- `classId` 必须关联行政班级type=1需要在应用层验证
- 兴趣班通过 `StudentInterestClass` 表关联
---
### 7. 学生兴趣班关联表 (StudentInterestClass)
**说明**:学生和兴趣班的多对多关联表。
**字段说明**
- `id`: 主键
- `studentId`: 学生ID
- `classId`: 兴趣班IDtype=2的Class
**唯一约束**
- `[studentId, classId]`: 学生和兴趣班组合唯一
**关系**
- 多对一关联 `Student`
- 多对一关联 `Class` (兴趣班)
**注意事项**
- `classId` 必须关联兴趣班type=2需要在应用层验证
---
## 数据关系图
```
Tenant (租户/学校)
├── School (学校信息) [1:1]
├── Grade (年级) [1:N]
│ └── Class (班级) [1:N]
│ ├── Student (学生) [1:N, 仅行政班级]
│ └── StudentInterestClass [N:M, 仅兴趣班]
├── Department (部门) [1:N, 树形结构]
│ └── Teacher (教师) [1:N]
└── User (用户) [1:N]
├── Teacher [1:1]
└── Student [1:1]
```
## 业务规则
1. **学校与租户**:每个租户对应一个学校,通过 `School` 表扩展学校信息
2. **年级管理**:年级按 `level` 排序,每个租户内级别唯一
3. **班级类型**
- 行政班级type=1学生必须属于一个行政班级
- 兴趣班type=2学生可以加入多个兴趣班
4. **部门树形结构**:部门支持多级嵌套,通过 `parentId` 实现
5. **教师归属**:教师必须归属于一个部门
6. **学生归属**:学生必须属于一个行政班级,可以加入多个兴趣班
## 数据完整性约束
1. **级联删除**
- 删除租户时,级联删除所有相关数据
- 删除年级时,级联删除所有班级
- 删除用户时,级联删除教师/学生信息
- 删除班级时,级联删除学生兴趣班关联
2. **限制删除**
- 删除部门时如果存在教师不允许删除Restrict
- 删除班级时如果存在学生不允许删除Restrict
3. **唯一性约束**
- 租户内年级编码唯一
- 租户内年级级别唯一
- 租户内部门编码唯一
- 租户内班级编码唯一
- 租户内教师工号唯一
- 租户内学生学号唯一
## 应用层验证建议
1. **班级类型验证**
- 创建学生时,`classId` 必须关联 `type=1` 的班级
- 创建学生兴趣班关联时,`classId` 必须关联 `type=2` 的班级
2. **数据一致性**
- 教师/学生的 `tenantId` 必须与关联的 `User.tenantId` 一致
- 班级的 `tenantId` 必须与关联的 `Grade.tenantId` 一致
3. **业务逻辑**
- 删除部门前,需要先转移或删除该部门下的所有教师
- 删除班级前,需要先转移或删除该班级下的所有学生
## 迁移建议
1. 运行 Prisma 迁移生成 SQL
```bash
npx prisma migrate dev --name add_school_module
```
2. 数据初始化:
- 为现有租户创建对应的 `School` 记录
- 根据业务需求初始化年级数据
3. 数据迁移(如需要):
- 如果已有教师/学生数据,需要创建对应的 `User` 记录并关联
## 后续扩展建议
1. **课程管理**:可以添加课程表、课程安排等
2. **成绩管理**:可以添加成绩表、考试表等
3. **考勤管理**:可以添加考勤记录表
4. **通知公告**:可以添加通知表、公告表等