# 班级管理与排课系统设计方案 > 版本: v1.0 > 设计日期: 2026-02-22 > 设计目标: 支持多教师协作、学生调班、智能排课、课程提醒 --- ## 一、需求总结 ### 1.1 核心需求 | 需求 | 描述 | 优先级 | |-----|------|-------| | 多教师协作 | 一个班级支持主班、配班、保育员等多教师 | P1 | | 学生调班 | 学校端可给学生调换班级 | P1 | | 学校排课 | 学校统一安排课程计划(时间、课程、班级、教师) | P1 | | 教师自排课 | 教师可自行安排上课或预约上课 | P1 | | 课程提醒 | 上课前的提醒通知 | P2 | | 模式兼容 | 学校排课与教师自排课两种模式共存 | P1 | ### 1.2 行业最佳实践参考 根据调研,优秀的排课系统应具备: 1. **智能排课引擎** - 多约束条件优化(教师时间、教室容量、课程优先级) - 冲突自动检测与修复 - 支持手动调整 2. **可视化交互** - 周/月视图课表 - 拖拽式调课 - 实时冲突提示 3. **多端协同** - 课表变更实时推送 - 教师/家长端同步 4. **混合排课模式** - 支持自动排课 + 手动微调 - 支持学校统一排课 + 教师自主预约 --- ## 二、数据模型设计 ### 2.1 班级教师关联(新增) **问题**:当前 `Class.teacherId` 只能指向一个教师,无法支持多教师协作。 **解决方案**:引入中间表 `ClassTeacher` ``` ┌─────────────────────────────────────────────────────────────┐ │ 班级-教师关联模型 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────┐ ┌──────────────┐ ┌──────────┐│ │ │ Class │ ◄───────│ClassTeacher │────────►│ Teacher ││ │ │ │ 1:N │ │ N:1 │ ││ │ └──────────┘ │ - role │ └──────────┘│ │ │ - isPrimary │ │ │ │ - startDate │ │ │ │ - endDate │ │ │ └──────────────┘ │ │ │ │ 角色类型 (role): │ │ - MAIN: 主班教师 │ │ - ASSIST: 配班教师 │ │ - CARE: 保育员 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` **Prisma Schema**: ```prisma model ClassTeacher { id Int @id @default(autoincrement()) classId Int @map("class_id") teacherId Int @map("teacher_id") role String @default("MAIN") // MAIN, ASSIST, CARE isPrimary Boolean @default(false) // 是否班主任 startDate DateTime? @map("start_date") endDate DateTime? @map("end_date") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") class Class @relation(fields: [classId], references: [id], onDelete: Cascade) teacher Teacher @relation(fields: [teacherId], references: [id], onDelete: Cascade) @@unique([classId, teacherId]) @@map("class_teachers") } ``` ### 2.2 学生班级历史(新增) **问题**:学生调班后无法追溯历史记录。 **解决方案**:引入 `StudentClassHistory` 表 ```prisma model StudentClassHistory { id Int @id @default(autoincrement()) studentId Int @map("student_id") classId Int @map("class_id") startDate DateTime @map("start_date") endDate DateTime? @map("end_date") reason String? // 调班原因 createdBy Int? @map("created_by") // 操作人 createdAt DateTime @default(now()) @map("created_at") student Student @relation(fields: [studentId], references: [id]) class Class @relation(fields: [classId], references: [id]) @@map("student_class_history") } ``` ### 2.3 排课计划表(新增) **核心设计**:区分"排课计划"和"授课记录" ``` ┌─────────────────────────────────────────────────────────────┐ │ 排课与授课模型 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │SchedulePlan │ 1:N │ Lesson │ │ │ │ (排课计划) │────────►│ (授课记录) │ │ │ │ │ │ │ │ │ │ 学校创建 │ │ 教师创建 │ │ │ │ 或教师预约 │ │ 或系统生成 │ │ │ └──────────────┘ └──────────────┘ │ │ │ │ SchedulePlan (排课计划): │ │ - 学校统一安排的课程计划 │ │ - 或教师预约的上课计划 │ │ - 可重复生成多个 Lesson │ │ │ │ Lesson (授课记录): │ │ - 实际的一次授课 │ │ - 包含上课状态、评价等 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` **Prisma Schema**: ```prisma model SchedulePlan { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") // 关联信息 classId Int @map("class_id") courseId Int @map("course_id") teacherId Int? @map("teacher_id") // 可选,未分配时为空 // 时间信息 scheduledDate DateTime? @map("scheduled_date") // 具体日期 scheduledTime String? @map("scheduled_time") // 时间段 "09:00-09:30" weekDay Int? @map("week_day") // 周几 (1-7),用于重复排课 // 重复规则 repeatType String @default("NONE") @map("repeat_type") // NONE, DAILY, WEEKLY repeatEndDate DateTime? @map("repeat_end_date") // 排课来源 source String @default("SCHOOL") // SCHOOL(学校排课), TEACHER(教师预约) createdBy Int @map("created_by") // 创建人ID // 状态 status String @default("ACTIVE") // ACTIVE, CANCELLED, COMPLETED // 提醒设置 reminderEnabled Boolean @default(true) @map("reminder_enabled") reminderMinutes Int @default(30) @map("reminder_minutes") // 提前多少分钟提醒 note String? createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") tenant Tenant @relation(fields: [tenantId], references: [id]) class Class @relation(fields: [classId], references: [id]) course Course @relation(fields: [courseId], references: [id]) teacher Teacher? @relation(fields: [teacherId], references: [id]) lessons Lesson[] @@map("schedule_plans") } ``` ### 2.4 课程提醒(新增) ```prisma model CourseReminder { id Int @id @default(autoincrement()) schedulePlanId Int? @map("schedule_plan_id") lessonId Int? @map("lesson_id") userId Int @map("user_id") // 接收提醒的用户 userType String @map("user_type") // TEACHER, PARENT reminderType String @map("reminder_type") // BEFORE_CLASS, AFTER_CLASS reminderTime DateTime @map("reminder_time") content String sent Boolean @default(false) sentAt DateTime? @map("sent_at") createdAt DateTime @default(now()) @map("created_at") schedulePlan SchedulePlan? @relation(fields: [schedulePlanId], references: [id]) lesson Lesson? @relation(fields: [lessonId], references: [id]) @@map("course_reminders") } ``` ### 2.5 更新现有模型 **Lesson 模型更新**: ```prisma model Lesson { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") teacherId Int @map("teacher_id") classId Int @map("class_id") courseId Int @map("course_id") // 新增:关联排课计划 schedulePlanId Int? @map("schedule_plan_id") plannedDatetime DateTime? @map("planned_datetime") startDatetime DateTime? @map("start_datetime") endDatetime DateTime? @map("end_datetime") actualDuration Int? @map("actual_duration") status String @default("PLANNED") // PLANNED, IN_PROGRESS, COMPLETED, CANCELLED // ... 其他字段保持不变 schedulePlan SchedulePlan? @relation(fields: [schedulePlanId], references: [id]) @@map("lessons") } ``` **Class 模型更新**: ```prisma model Class { id Int @id @default(autoincrement()) tenantId Int @map("tenant_id") name String grade String // 修改:teacherId 改为可选,通过 ClassTeacher 关联多个教师 teacherId Int? @map("teacher_id") // 保留用于向后兼容 // 新增字段 classroom String? // 教室位置 capacity Int @default(30) // 班级容量 studentCount Int @default(0) @map("student_count") lessonCount Int @default(0) @map("lesson_count") createdAt DateTime @default(now()) @map("created_at") updatedAt DateTime @updatedAt @map("updated_at") tenant Tenant @relation(fields: [tenantId], references: [id]) teacher Teacher? @relation(fields: [teacherId], references: [id]) classTeachers ClassTeacher[] students Student[] lessons Lesson[] schedulePlans SchedulePlan[] studentHistory StudentClassHistory[] @@map("classes") } ``` --- ## 三、功能模块设计 ### 3.1 学校端功能 #### 3.1.1 班级管理增强 ``` ┌─────────────────────────────────────────────────────────────┐ │ 学校端 - 班级管理 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【班级列表】 │ │ ├── 班级基本信息(名称、年级、教室、容量) │ │ ├── 教师团队(主班、配班、保育员) │ │ ├── 学生列表 │ │ └── 操作:编辑、归档、删除 │ │ │ │ 【教师分配】 │ │ ├── 添加教师到班级 │ │ ├── 设置教师角色(主班/配班/保育) │ │ ├── 设置班主任 │ │ └── 移除教师 │ │ │ │ 【学生管理】 │ │ ├── 查看班级学生 │ │ ├── 添加学生到班级 │ │ ├── 学生调班(选择目标班级) │ │ └── 移除学生 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` #### 3.1.2 排课管理(新增) ``` ┌─────────────────────────────────────────────────────────────┐ │ 学校端 - 排课管理 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【排课计划列表】 │ │ ├── 筛选:班级/教师/课程/日期范围 │ │ ├── 状态:待执行/已完成/已取消 │ │ └── 操作:编辑、取消、生成授课记录 │ │ │ │ 【新建排课】 │ │ ├── 选择班级 │ │ ├── 选择课程 │ │ ├── 选择教师(可选,不选则待分配) │ │ ├── 设置时间 │ │ │ ├── 单次:选择具体日期时间 │ │ │ └── 重复:每周X,开始日期,结束日期 │ │ ├── 提醒设置 │ │ └── 保存 │ │ │ │ 【课表视图】 │ │ ├── 周视图:按班级/教师展示一周课表 │ │ ├── 月视图:月度排课概览 │ │ └── 冲突检测:实时提示时间/教师/教室冲突 │ │ │ │ 【批量排课】 │ │ ├── Excel导入排课计划 │ │ └── 复制上周排课 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 3.2 教师端功能 #### 3.2.1 我的班级 ``` ┌─────────────────────────────────────────────────────────────┐ │ 教师端 - 我的班级 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【班级列表】 │ │ ├── 显示我参与的班级(主班/配班/保育) │ │ ├── 班级信息卡片 │ │ │ ├── 班级名称、年级 │ │ │ ├── 我的角色(标签显示) │ │ │ ├── 学生人数 │ │ │ └── 同班教师 │ │ └── 操作:查看学生、开始备课、查看课表 │ │ │ │ 【班级学生】 │ │ ├── 学生列表(同班所有学生) │ │ └── 学生详情 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` #### 3.2.2 我的课表(新增) ``` ┌─────────────────────────────────────────────────────────────┐ │ 教师端 - 我的课表 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【课表视图】 │ │ ├── 周视图:显示本周所有排课 │ │ ├── 日视图:显示今日课程详情 │ │ └── 月视图:月度课程概览 │ │ │ │ 【课程来源标识】 │ │ ├── 🏫 学校排课:由学校统一安排 │ │ └── 👤 自主预约:教师自己创建 │ │ │ │ 【课程状态】 │ │ ├── 待上课:plannedDatetime 未到 │ │ ├── 进行中:已开始上课 │ │ ├── 已完成:上课结束 │ │ └── 已取消:排课被取消 │ │ │ │ 【操作】 │ │ ├── 查看课程详情 │ │ ├── 开始上课(进入上课模式) │ │ └── 申请调课(需学校审批) │ │ │ └─────────────────────────────────────────────────────────────┘ ``` #### 3.2.3 自主排课/预约上课 ``` ┌─────────────────────────────────────────────────────────────┐ │ 教师端 - 自主排课/预约 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【预约上课】(原有功能增强) │ │ ├── 选择课程 │ │ ├── 选择班级 │ │ ├── 设置预约时间 │ │ ├── 开启课程提醒 │ │ └── 创建 │ │ │ │ 【即时上课】(原有功能) │ │ ├── 从课程详情页直接开始 │ │ └── 自动创建 Lesson 记录 │ │ │ │ 【我的预约列表】 │ │ ├── 查看所有预约记录 │ │ ├── 修改/取消预约 │ │ └── 开始上课 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 四、业务流程设计 ### 4.1 排课模式对比 ``` ┌─────────────────────────────────────────────────────────────┐ │ 两种排课模式对比 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【模式一:学校统一排课】 │ │ │ │ 学校教务 ──创建──► SchedulePlan ──生成──► Lesson │ │ │ │ │ │ │ ├── 关联班级 │ │ │ ├── 关联课程 │ │ │ ├── 指定教师(或待分配) │ │ │ └── 设置时间 │ │ │ │ │ └─────────── 发送通知给教师 ──────────────┘ │ │ │ │ 【模式二:教师自主预约】 │ │ │ │ 教师 ──创建──► SchedulePlan (source=TEACHER) │ │ │ │ │ │ │ └── 自动生成 Lesson │ │ │ │ │ └─────────── 设置提醒 ────────────────────┘ │ │ │ │ 【模式三:即时上课】(原有) │ │ │ │ 教师 ──开始上课──► 直接创建 Lesson │ │ │ │ │ │ │ └── 状态: IN_PROGRESS │ │ │ │ │ └─────────── 无需预约 ──────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 4.2 课程提醒流程 ``` ┌─────────────────────────────────────────────────────────────┐ │ 课程提醒流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ │ │ │ SchedulePlan │ │ │ │ (有提醒) │ │ │ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ 定时任务扫描 │────►│ 检查提醒时间 │ │ │ │ (每分钟) │ │ │ │ │ └──────────────┘ └──────┬───────┘ │ │ │ │ │ ▼ │ │ ┌──────────────────┐ │ │ │ 创建提醒记录 │ │ │ │ CourseReminder │ │ │ └────────┬─────────┘ │ │ │ │ │ ┌───────────────┼───────────────┐ │ │ ▼ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ 站内消息 │ │ 微信推送 │ │ 短信通知 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ 提醒对象: │ │ - 主班教师、配班教师 │ │ - 可选:家长(需要家长端支持) │ │ │ │ 提醒时机: │ │ - 默认:上课前30分钟 │ │ - 可配置:15分钟、30分钟、1小时、1天 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 4.3 学生调班流程 ``` ┌─────────────────────────────────────────────────────────────┐ │ 学生调班流程 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 学校端操作: │ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │选择学生│────►│选择新班│────►│确认调班│ │ │ └────────┘ └────────┘ └────┬───┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────┐ │ │ │ 系统自动处理: │ │ │ │ 1. 更新 Student.classId │ │ │ │ 2. 更新旧班 studentCount │ │ │ │ 3. 更新新班 studentCount │ │ │ │ 4. 创建 StudentClassHistory│ │ │ │ 5. 记录调班原因和操作人 │ │ │ └─────────────────────────────┘ │ │ │ │ 权限控制: │ │ - 只有学校端可以调班 │ │ - 教师端只能查看,无权操作 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` --- ## 五、API 设计 ### 5.1 学校端 API ``` # 班级管理 POST /school/classes # 创建班级 GET /school/classes # 班级列表 PUT /school/classes/:id # 更新班级 DELETE /school/classes/:id # 删除班级 # 班级教师管理 GET /school/classes/:id/teachers # 获取班级教师列表 POST /school/classes/:id/teachers # 添加教师到班级 PUT /school/classes/:id/teachers/:tid # 更新教师角色 DELETE /school/classes/:id/teachers/:tid # 移除教师 # 学生调班 POST /school/students/:id/transfer # 学生调班 GET /school/students/:id/history # 学生班级历史 # 排课管理 GET /school/schedules # 排课列表 POST /school/schedules # 创建排课 PUT /school/schedules/:id # 更新排课 DELETE /school/schedules/:id # 取消排课 POST /school/schedules/:id/generate # 生成授课记录 # 课表视图 GET /school/schedules/timetable # 课表视图(周/月) GET /school/schedules/conflicts # 冲突检测 ``` ### 5.2 教师端 API ``` # 我的班级 GET /teacher/classes # 我的班级列表 GET /teacher/classes/:id # 班级详情 GET /teacher/classes/:id/students # 班级学生 GET /teacher/classes/:id/teachers # 同班教师 # 我的课表 GET /teacher/schedules # 我的排课列表 GET /teacher/schedules/timetable # 我的课表视图 GET /teacher/schedules/today # 今日课程 # 自主排课/预约 POST /teacher/schedules # 创建预约 PUT /teacher/schedules/:id # 修改预约 DELETE /teacher/schedules/:id # 取消预约 # 上课 POST /teacher/lessons # 开始上课(即时或预约) POST /teacher/lessons/:id/start # 开始上课 POST /teacher/lessons/:id/finish # 结束上课 # 提醒 GET /teacher/reminders # 我的提醒列表 PUT /teacher/reminders/:id/read # 标记已读 ``` --- ## 六、前端页面设计 ### 6.1 学校端新增页面 | 页面 | 路由 | 功能 | |-----|------|------| | 排课管理 | /school/schedules | 排课列表、新建、编辑 | | 课表视图 | /school/schedules/timetable | 周/月课表视图 | | 班级教师 | /school/classes/:id/teachers | 管理班级教师团队 | | 学生调班 | /school/students/:id/transfer | 学生调班操作 | ### 6.2 教师端新增/修改页面 | 页面 | 路由 | 功能 | |-----|------|------| | 我的课表 | /teacher/schedules | 查看排课计划 | | 预约上课 | /teacher/schedules/create | 创建预约 | | 我的班级 | /teacher/classes | 修改:显示教师角色 | --- ## 七、实施计划 ### 7.1 阶段划分 ``` ┌─────────────────────────────────────────────────────────────┐ │ 实施阶段 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 【Phase 1: 数据模型更新】(3天) │ │ ├── 创建 ClassTeacher 表 │ │ ├── 创建 StudentClassHistory 表 │ │ ├── 创建 SchedulePlan 表 │ │ ├── 创建 CourseReminder 表 │ │ ├── 数据迁移:现有数据兼容处理 │ │ └── 更新 Prisma schema │ │ │ │ 【Phase 2: 学校端功能】(5天) │ │ ├── 班级教师管理API + 前端 │ │ ├── 学生调班API + 前端 │ │ ├── 排课管理API + 前端 │ │ └── 课表视图前端 │ │ │ │ 【Phase 3: 教师端功能】(4天) │ │ ├── 我的班级增强(显示角色) │ │ ├── 我的课表API + 前端 │ │ ├── 自主预约功能增强 │ │ └── 课程来源标识 │ │ │ │ 【Phase 4: 提醒系统】(3天) │ │ ├── 提醒记录创建 │ │ ├── 定时任务服务 │ │ ├── 站内消息通知 │ │ └── (可选) 微信/短信推送 │ │ │ │ 【Phase 5: 测试与优化】(2天) │ │ ├── 功能测试 │ │ ├── 性能优化 │ │ └── 文档更新 │ │ │ │ 总计: 约17个工作日 │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 7.2 优先级排序 | 优先级 | 功能 | 原因 | |-------|------|------| | P0 | ClassTeacher 表 | 多教师协作的基础 | | P0 | SchedulePlan 表 | 排课功能的基础 | | P1 | 学校端排课管理 | 核心新功能 | | P1 | 教师端课表查看 | 教师需要看到排课结果 | | P1 | 学生调班 | 学校管理需求 | | P2 | 课程提醒 | 提升用户体验 | | P3 | 微信/短信推送 | 可后期扩展 | --- ## 八、风险与对策 | 风险 | 影响 | 对策 | |-----|------|------| | 数据迁移复杂 | 现有数据丢失 | 保留 teacherId 字段向后兼容,渐进迁移 | | 排课冲突 | 用户体验差 | 实时冲突检测,智能推荐替代方案 | | 提醒延迟 | 用户错过课程 | 多渠道提醒,定时任务容错处理 | | 前端改动大 | 开发周期长 | 分阶段实施,优先核心功能 | --- ## 九、总结 本设计方案实现了以下核心目标: 1. **多教师协作** ✅ - 通过 ClassTeacher 中间表支持主班/配班/保育员 2. **学生调班** ✅ - 学校端可操作,记录历史,更新统计 3. **混合排课模式** ✅ - 学校统一排课 + 教师自主预约 + 即时上课 - 三种模式共存,灵活适配不同场景 4. **课程提醒** ✅ - 可配置提醒时间 - 多渠道通知 5. **扩展性** ✅ - 数据模型支持学期管理、教室管理等后续扩展 --- *设计完成于 2026-02-22* *文档版本: v1.0*