Software design¶
Author: Zhenyu Yang yangzhenyu@sust.edu.cn, Sixu Wei reisa@sust.edu.cn
Last updated: Feb 4, 2026
This document is used to describe the software functional requirements to the developer.
MySQL 模板¶
用户user模板¶
字段名 |
数据类型 |
约束 |
默认值 |
说明 |
|---|---|---|---|---|
|
INT |
主键,自增 |
— |
数据库内部唯一标识 |
|
VARCHAR(50) |
NOT NULL,UNIQUE |
— |
学号/工号 |
|
VARCHAR(100) |
NOT NULL,UNIQUE |
— |
学号/工号,若无则填邮箱 |
|
VARCHAR(128) |
NOT NULL |
— |
加密后的密码(Django 自动加盐) |
|
VARCHAR(150) |
— |
‘’ |
Django |
|
VARCHAR(150) |
— |
‘’ |
Django |
|
VARCHAR(100) |
NOT NULL |
— |
用户真实姓名 |
|
VARCHAR(100) |
UNIQUE |
— |
邮箱,用于找回密码或通知 |
|
VARCHAR(20) |
— |
— |
手机号码 |
|
VARCHAR(50) |
UNIQUE |
— |
用户微信ID |
|
ENUM(),七选一 |
NOT NULL |
|
用户角色 |
|
JSON |
— |
|
多角色列表(兼容保留 |
|
ENUM(),七选一 |
可为空 |
NULL |
当前使用的角色 |
|
ENUM(‘active’, ‘inactive’) |
— |
|
用户账户状态 |
|
VARCHAR(100) |
可为空 |
NULL |
学生班级 |
|
VARCHAR(64) |
可为空 |
NULL |
TOTP 密钥,初始化后保存 |
|
BOOLEAN |
— |
|
是否启用 TOTP 双因素认证 |
|
DATETIME |
— |
CURRENT_TIMESTAMP |
账户创建时间 |
|
DATETIME |
可为空 |
NULL |
最近登录时间 |
|
TEXT |
可为空 |
— |
备注信息 |
说明:
first_name/last_name来自 DjangoAbstractUser,为兼容保留,业务不使用;系统真实姓名字段为full_name。
教室classroom模板¶
字段名 |
数据类型 |
约束 |
默认值 |
说明 |
|---|---|---|---|---|
|
INT |
主键,自增 |
— |
教室唯一标识 |
|
VARCHAR(100) |
NOT NULL |
— |
教学楼名称 |
|
VARCHAR(50) |
NOT NULL |
— |
教室编号(如 A101) |
|
INT |
— |
|
可容纳人数 |
|
JSON |
可为空 |
— |
教室设备信息(JSON 格式) |
|
ENUM(‘available’, ‘occupied’, ‘under_repair’, ‘disabled’) |
— |
|
当前教室状态 |
|
DATE |
可为空 |
NULL |
上次维修日期 |
|
DATETIME |
— |
CURRENT_TIMESTAMP |
创建时间 |
|
DATETIME |
— |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
最近更新时间 |
|
TEXT |
可为空 |
— |
备注信息 |
用户组定义¶
服务端(后台)¶
中文名称 |
用户组 |
审批教室借用 |
调整教室占用 |
接收报修信息 |
进行人事调整 |
增删教室 |
|---|---|---|---|---|---|---|
超级管理员 |
|
允许 |
允许 |
允许 |
允许 |
允许 |
教学秘书 |
|
允许 |
允许 |
拒绝 |
拒绝 |
拒绝 |
辅导员 |
|
允许 |
拒绝 |
拒绝 |
拒绝 |
拒绝 |
办公室助理 |
|
允许 |
允许 |
允许 |
拒绝 |
拒绝 |
客户端(前台)¶
中文名称 |
用户组 |
向谁申请教室 |
报修 |
|---|---|---|---|
中方教师 |
|
|
允许 |
外方教师 |
|
|
拒绝 |
学生 |
|
仅 |
允许 |
教室借用流程¶
所有人(即使没有登录)也可通过系统查看教室占用情况,但是不显示占用具体信息(占用人信息等)和教室基本信息。
关键字段(BorrowApplication)¶
activity_type:student_activity(学生活动)/teaching_activity(教学活动)review_level:first_review(一审)/second_review(二审)reviewer_role:当前应由哪个角色审批(例如counselor/secretary/assistant/superadmin)is_urgent:加急申请标记
审批流转规则(两级审批)¶
学生(
student):仅允许申请学生活动(student_activity)。中方教师/外方教师(
chinese_teacher/foreign_teacher):可申请学生活动或教学活动。学生活动(
student_activity):一审counselor。教学活动(
teaching_activity):一审secretary。一审通过后:自动流转到二审(
review_level=second_review),二审角色为assistant,办公室助理仅看到二审工单。二审通过:状态变更为
approved。超级管理员(
superadmin):可查看所有工单,并允许在任意阶段直接通过。转交(
forward):可将reviewer_role调整为superadmin(或其他角色)进行处理。
时间限制规则¶
系统会根据申请人角色和 is_urgent 对申请开始时间进行校验:
assistant/superadmin:不受时间限制。is_urgent=true:只能选择当天。student:仅允许申请未来 +1 到 +7 天。chinese_teacher/foreign_teacher/counselor/secretary:仅允许申请未来 至少 +1 天。
取消规则:申请人可取消自己的申请,但若距离开始时间小于 6 小时则禁止取消。
冲突校验¶
提交借用申请时会同时校验:
已有人工借用(
pending/approved且source_type=manual)的时间冲突。课程表(
CourseSession展开后的占用)冲突。
教室维修需求¶
1. 非紧急情况¶
所有已登录用户可通过普通报修进行报修;
assistant接到工单,尝试自行解决或联系维修人员;维修结束后,报修人检查维修结果,确认无误后工单结束。
注:同一教室存在未结束的工单时,禁止发起新的工单。
2. 紧急情况¶
所有已登录用户可通过紧急报修进行报修;
系统显示当日值班
assistant的电话号码;assistant接到求助,尝试自行解决或联系维修人员;若无法自行解决,则
assistant通过本系统查询同时段空闲教室,更换教室。
人员认证机制¶
学工部API:通过学校统一身份认证获取人员信息 (11/23备注:此条废弃)
微信ID:第一次使用时,绑定用户微信
邮箱:对于没有学号&工号&微信的外方教师,经
superadmin或secretary邀请后,允许使用邮箱注册;使用邮箱+密码认证;可选使用 OTP 应用进行 2FA 认证。TOTP:账号可选择启用基于时间的一次性密码;后台提供密钥生成、启用、关闭接口,登录时需同时校验口令与 TOTP 码。
教室调整¶
教室以门牌号进行区分;
教室信息支持从 Excel 文件导入。
人事调整¶
人员信息支持从 Excel 文件导入。
附加功能¶
举报滥用情况:已登录用户可举报教室滥用情况,该工单直接推送至
superadmin。
课程表方案(Courses)¶
为便于维护周期性课程信息,新增课程基础表 courses 与课程节次表 course_sessions。课程基础信息与周期范围落在 courses,具体的每周上课节次(可包含不同教室/时段)落在 course_sessions,避免借用申请表承载周期性课表。
课程 courses 表¶
字段名 |
数据类型 |
约束 |
默认值 |
说明 |
|---|---|---|---|---|
|
INT |
主键,自增 |
— |
课程唯一标识 |
|
VARCHAR(200) |
NOT NULL |
— |
课程名称 |
|
VARCHAR(50) |
可为空 |
NULL |
课程编号 |
|
INT |
外键( |
NULL |
授课教师 |
|
VARCHAR(100) |
可为空 |
‘’ |
上课班级/教学班 |
|
INT |
— |
0 |
预计人数 |
|
DATE |
NOT NULL |
— |
课程开始日期 |
|
DATE |
NOT NULL |
— |
课程结束日期 |
|
TEXT |
可为空 |
— |
备注 |
|
DATETIME |
— |
CURRENT_TIMESTAMP |
创建时间 |
|
DATETIME |
— |
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |
更新时间 |
课程节次 course_sessions 表¶
字段名 |
数据类型 |
约束 |
默认值 |
说明 |
|---|---|---|---|---|
|
INT |
主键,自增 |
— |
节次唯一标识 |
|
INT |
外键( |
— |
课程 |
|
INT |
外键( |
— |
教室 |
|
TINYINT |
0-6(周一到周日) |
— |
上课星期 |
|
JSON |
— |
|
节次列表(如 |
|
JSON |
可为空 |
NULL |
周次列表(如 |
|
TEXT |
可为空 |
— |
节次备注 |
course_sessions.weekday在数据库内部按0-6 = 周一到周日存储,以对齐 Pythondate.weekday();对外 API 序列化为字符串枚举MONDAY到SUNDAY,不保留旧整数协议兼容。
多教室/多时段适配
同一课程若在周一、周三上课且教室/时段不同,可在course_sessions中为同一个course_id创建多条节次记录(分别设置不同weekday、classroom_id、start_time/end_time)。这样一门课可拥有多条节次配置,不需要拆分课程基础信息。
课程表生成逻辑¶
课表查询时,按日期范围筛选 courses(start_date~end_date),再按日期星期匹配 course_sessions.weekday,并按 week_list 过滤周次交集,将节次展开为具体日期的占用时段。
节次到时间的换算依赖系统“季节作息”配置:
系统配置存于
SystemConfig.season(winter/summer)。后端通过
SeasonConfigService.get_timeslots()返回当前作息的节次时间表,并做缓存优化。
最终课表由:
CourseSession展开的占用时段已审批的临时借用记录(
BorrowApplication,status=approved且source_type=manual)
共同组成,输出结构化时间块供前端渲染。
课堂签到(Checkins)¶
开关定义¶
课堂签到为“可选功能”,任课教师可主动开启,系统将课程表中的节次信息拉取到 CheckinSession 表中,用于后续的签到与统计。
注:为避免夏/冬季时令变化导致时间计算偏差,
CheckinSession只保存节次(sections),不落地具体时间。
核心数据表¶
1. 课程签到配置 course_checkin_settings¶
字段名 |
数据类型 |
说明 |
|---|---|---|
|
INT |
对应 |
|
BOOLEAN |
是否开启签到 |
|
INT |
开启人 |
|
DATETIME |
开启时间 |
|
DATETIME |
创建时间 |
|
DATETIME |
更新时间 |
2. 签到场次 checkin_sessions¶
字段名 |
数据类型 |
说明 |
|---|---|---|
|
INT |
对应 |
|
INT |
对应 |
|
INT |
对应 |
|
DATE |
当日 |
|
JSON |
签到节次(如 |
|
ENUM |
|
|
UUID |
签到码(扫码/预留) |
|
DATETIME |
开启时间 |
|
DATETIME |
关闭时间 |
|
INT |
创建人 |
|
TEXT |
备注 |
3. 签到记录 checkin_records¶
字段名 |
数据类型 |
说明 |
|---|---|---|
|
INT |
对应 |
|
INT |
对应 |
|
ENUM |
|
|
DATETIME |
签到时间 |
|
ENUM |
|
|
ENUM |
|
|
TEXT |
备注 |
|
FLOAT |
人脸识别置信度(预留) |
业务规则(MVP)¶
开启签到时,系统从
course_sessions展开出课程方案,将各个上课日入库为checkin_sessions。手动签到由任课教师在当天课程场次中对学生进行打卡,标记
present/late/absent/leave。人脸签到在以后扩展,现在仅做数据结构保留。