1. 项目概述与背景
这个师资管理系统是我去年为某高校信息中心开发的毕业设计项目,也是我接过的第7个教育类管理系统定制开发需求。随着高校信息化建设的深入,传统Excel+纸质审批的师资管理方式已经严重制约了教学管理效率。特别是在疫情后线上线下混合教学成为常态的背景下,一套能实时同步课程、排班、请假数据的Web系统显得尤为重要。
系统采用主流的前后端分离架构,前端用Vue3+Element Plus实现响应式界面,后端基于Spring Boot构建RESTful API,数据库选用MySQL 8.0。特别针对高校教务场景,开发了可视化排课冲突检测、多级请假审批流、课表自动生成等特色功能。整套系统从需求分析到部署上线历时3个月,最终客户验收时一次性通过,目前已在3个院系稳定运行半年。
2. 核心功能模块设计
2.1 课程信息管理模块
课程库采用树形结构设计,支持"学校-院系-专业-课程"四级分类。每个课程对象包含:
- 基础属性:课程代码、名称、学分、学时类型(理论/实验)
- 教学要求:适用年级、最大选课人数、所需教室类型
- 关联资源:教学大纲、课件、参考教材(支持PDF上传)
关键技术点:
- 使用Adjacency List模型实现无限级课程分类
- 文件存储采用MinIO分布式存储方案
- 课程编码规则:2位院系码+3位专业码+4位序列号
2.2 智能排班系统
排课算法是系统的核心难点,我们设计了三级冲突检测机制:
- 教师时间冲突:同一教师同一时段只能安排一个课程
- 教室资源冲突:特殊教室(如实验室)不可重复使用
- 课程连贯性要求:某些实验课必须安排在理论课后
前端排课界面采用类似甘特图的交互设计,支持:
- 拖拽调整课表
- 批量导入历史排课数据
- 冲突实时提示(红色高亮显示)
2.3 请假审批流程
请假流程设计参考了高校实际行政架构:
code复制教师申请 → 教研室主任审批 → 院系教务审批 → 教务处备案
每个环节支持:
- 电子签名确认
- 附件上传(如医院证明)
- 自动计算课时抵扣
- 代课教师自动推荐(基于课程相似度算法)
3. 技术实现细节
3.1 后端架构设计
采用DDD领域驱动设计,核心聚合包括:
- TeacherAggregate(教师)
- CourseAggregate(课程)
- ScheduleAggregate(排课)
- LeaveAggregate(请假)
技术栈选型考量:
- Spring Boot 2.7:成熟稳定,社区支持好
- MyBatis-Plus:简化CRUD开发
- Redis:缓存课表等热点数据
- RabbitMQ:异步处理排课冲突检测
3.2 前端工程化实践
Vue3项目结构优化:
code复制src/
├── api/ # 接口封装
├── components/ # 通用组件
├── composables/ # 组合式函数
├── router/ # 路由配置
├── stores/ # Pinia状态管理
└── views/ # 页面组件
性能优化措施:
- 课表组件虚拟滚动
- 接口请求防抖处理
- Web Worker运行排课算法
- 静态资源CDN加速
3.3 数据库关键表结构
teachers表:
sql复制CREATE TABLE `teachers` (
`id` bigint NOT NULL AUTO_INCREMENT,
`job_number` varchar(20) COLLATE utf8mb4_bin NOT NULL COMMENT '工号',
`name` varchar(50) COLLATE utf8mb4_bin NOT NULL,
`title` enum('助教','讲师','副教授','教授') COLLATE utf8mb4_bin DEFAULT NULL,
`department_id` bigint NOT NULL,
`max_course_hours` int DEFAULT '0' COMMENT '最大课时',
`special_requirements` json DEFAULT NULL COMMENT '特殊要求',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_job_number` (`job_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
course_schedule表:
sql复制CREATE TABLE `course_schedule` (
`id` bigint NOT NULL AUTO_INCREMENT,
`course_id` bigint NOT NULL,
`teacher_id` bigint NOT NULL,
`classroom_id` bigint NOT NULL,
`weekday` tinyint NOT NULL COMMENT '1-7对应周一到周日',
`start_section` tinyint NOT NULL COMMENT '开始节次',
`end_section` tinyint NOT NULL COMMENT '结束节次',
`week_range` varchar(20) NOT NULL COMMENT '1-16周',
`schedule_status` tinyint DEFAULT '0' COMMENT '0未确认1已确认',
PRIMARY KEY (`id`),
KEY `idx_teacher_time` (`teacher_id`,`weekday`,`start_section`),
KEY `idx_classroom_time` (`classroom_id`,`weekday`,`start_section`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
4. 开发难点与解决方案
4.1 排课冲突检测优化
初期采用全量检测方式,当数据量超过5000条时响应时间超过5秒。通过以下优化降至200ms内:
- 空间换时间:预生成教师-时间位图索引
- 增量检测:只检查变动涉及的关联数据
- 异步计算:非实时需求走消息队列处理
4.2 多级审批流实现
基于Activiti改造的轻量级流程引擎:
java复制public class LeaveApprovalService {
// 发起请假流程
public String startProcess(LeaveApplication leave) {
ProcessInstance instance = runtimeService.startProcessInstanceByKey(
"leaveApproval",
Map.of(
"applicant", leave.getTeacherId(),
"department", leave.getDepartmentId(),
"days", leave.getLeaveDays()
)
);
return instance.getId();
}
// 审批通过
public void approve(String taskId, String comment) {
taskService.complete(taskId, Map.of(
"approved", true,
"comment", comment
));
}
}
4.3 课表可视化渲染性能
使用Canvas替代DOM渲染的优化对比:
| 方案 | 100条数据 | 1000条数据 | 5000条数据 |
|---|---|---|---|
| DOM渲染 | 120ms | 850ms | 卡死 |
| Canvas | 40ms | 180ms | 600ms |
关键实现代码:
javascript复制function drawTimetable(courses) {
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 批量绘制
courses.forEach(course => {
ctx.fillStyle = getCourseColor(course.type);
ctx.fillRect(
getXPosition(course.weekday),
getYPosition(course.startSection),
COL_WIDTH,
(course.endSection - course.startSection + 1) * ROW_HEIGHT
);
// 文字绘制优化
ctx.font = '12px Arial';
ctx.fillText(course.name, ...);
});
}
5. 项目部署与运维
5.1 服务器配置建议
生产环境最小化部署方案:
- 应用服务器:2核4G × 2台(Nginx负载均衡)
- 数据库:4核8G + SSD磁盘
- Redis:1核2G(持久化开启)
- 对象存储:MinIO集群(3节点)
5.2 关键监控指标
配置的Prometheus监控项:
- 接口响应时间P99 < 500ms
- 排课冲突检测队列积压 < 10
- 数据库连接池使用率 < 80%
- 请假审批平均处理时长
Grafana监控看板包含:
- 实时在线用户数
- 排课操作热力图
- 审批流程时效统计
5.3 数据备份策略
采用全量+增量备份方案:
code复制0 2 * * * /usr/bin/mysqldump -uadmin -p xxxx --all-databases > /backup/full_$(date +%F).sql
*/30 * * * * /usr/bin/mysqlbinlog --read-from-remote-server ... > /backup/binlog/incr_$(date +%s).log
6. 毕业设计特别建议
对于需要将此作为毕业设计的同学,建议重点关注:
- 创新点挖掘方向:
- 基于遗传算法的智能排课优化
- 教师能力画像与课程匹配推荐
- 移动端课表冲突实时提醒
- 答辩准备要点:
- 准备1-2个典型用户场景演示
- 对比传统管理方式的效率提升数据
- 重点说明自己负责的核心模块
- 文档编写技巧:
- 用例图要包含主要角色和关键功能
- 时序图选择核心业务流程绘制
- 数据库设计需说明范式考量
我在项目验收时发现,评委最关注的是:
- 系统是否真正解决实际管理痛点
- 异常情况处理是否完备(如调课冲突)
- 数据统计分析维度是否全面
建议在测试阶段重点检查:
- 学期切换时历史数据归档流程
- 批量导入时的数据校验机制
- 高并发时的课表查询性能