数据模型
数据模型
CSMS 采用多租户架构:一套主库保存系统级数据,每所学校拥有独立的分库保存业务数据。两者通过学校 ID 关联,物理隔离、互不可见。
多租户架构
┌─────────────────────┐
主库 csms.db │ schools │ ← 学校清单(分库入口)
(系统级) │ admins │ ← 各级管理员
│ applications │ ← 学校入驻申请
│ announcements │ ← 校级公告
│ third_party_apis │ ← 开放 API 配置
│ api_tokens │ ← 凭证
│ api_audit_logs │ ← 调用审计
│ system_settings │ ← 系统设置
│ mail_services │ ← 邮件服务
│ mail_templates │ ← 邮件模板
└─────────┬───────────┘
│ schoolId
┌───────────────────┼───────────────────┐
▼ ▼ ▼
data/schools/A.db data/schools/B.db data/schools/C.db
(分库:年级/班级/ (分库:年级/班级/ (分库:年级/班级/
学生/积分/座位) 学生/积分/座位) 学生/积分/座位)- 主库路径:
data/csms.db - 分库路径:
data/schools/{schoolId}.db - 应用通过
useMainDb()访问主库,通过useSchoolDb(event, schoolId)访问指定学校分库。
主库表(schema.main.ts)
| 表名 | 用途 |
|---|---|
schools | 学校清单,作为分库入口 |
admins | 超级 / 学校 / 年级 / 班级管理员账号 |
applications | 学校入驻申请与审核状态 |
announcements | 校级公告 |
third_party_apis | 外部开放 API 的接入方配置 |
api_tokens | 开放 API 凭证(密文 sha256 存储) |
api_audit_logs | 开放 API 调用审计(保留 30 天) |
system_settings | 系统级设置(如 password,明文存储,仅 super_admin 可读写) |
mail_services | 邮件服务配置(SMTP / Resend) |
mail_templates | 邮件模板(支持变量占位) |
角色常量定义在
schema.main.ts;system_settings.password为明文存储,仅超级管理员可读写。
各校分库表(schema.school.ts)
| 表名 | 用途 |
|---|---|
grades | 年级 |
classes | 班级 |
users | 学生(含积分、用户名等) |
score_logs | 积分变动记录(含操作人、事由、前后值) |
score_templates | 积分模板(预置常用积分项) |
seat_layout_config | 座位布局配置(行列定义) |
seat_data | 座位与学生绑定数据 |
api_idempotency | 开放 API 幂等键记录 |
迁移与访问
- 表结构由 Drizzle ORM 管理,变更通过
npm run db:generate+npm run db:migrate同步。 - 主库与分库 schema 分别在
server/database/schema.main.ts与server/database/schema.school.ts。 - 备份策略:直接复制
data/csms.db与data/schools/{id}.db,详见 。
