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