1. 项目背景与核心价值
这个基于SpringBoot+Vue的教学管理平台,是我去年指导计算机专业学生完成的毕业设计项目。当时学生面临几个典型痛点:一是市面上教学系统要么功能过于简单(仅含基础增删改查),要么过于复杂(如商业级SaaS平台);二是现有开源项目要么技术栈陈旧(如纯JSP),要么文档缺失严重;三是教学场景的特殊需求(如课程表冲突检测、作业互评等)往往需要二次开发。
这套系统从实际教学场景出发,采用主流技术栈实现。后端用SpringBoot 2.7 + MyBatis-Plus构建RESTful API,前端用Vue3 + Element Plus实现响应式界面,前后端完全分离。特别针对毕设常见问题做了优化:
- 数据库设计包含完整的ER图和注释
- 接口文档用Swagger UI自动生成
- 关键业务代码(如排课算法)有详细注释
- 提供三种部署方案(开发/测试/生产)
提示:教学管理系统最容易被忽视的是并发场景。我们实测发现,课表查询在选课季的QPS会暴增10倍,系统在8核16G服务器上通过Redis缓存+数据库读写分离,成功将响应时间控制在300ms内。
2. 技术架构详解
2.1 后端技术选型
SpringBoot 2.7.3 + JDK11的组合经过严格验证:
- 相比SpringBoot 3.x,2.7.x对传统Java生态兼容更好
- 使用HikariCP连接池替代默认Tomcat连接池
- 集成Spring Security的RBAC扩展方案
数据库采用MySQL 8.0,关键优化包括:
sql复制-- 课程表添加复合索引
ALTER TABLE course
ADD INDEX idx_teacher_time (teacher_id, class_time);
缓存方案对比测试结果:
| 方案 | 平均响应时间 | 错误率 | 适用场景 |
|---|---|---|---|
| 纯数据库 | 420ms | 0.12% | 低频查询 |
| Redis单节点 | 85ms | 0.01% | 读多写少 |
| Redis集群 | 92ms | 0.03% | 高可用要求 |
| 本地Caffeine | 55ms | 0.15% | 单机临时缓存 |
2.2 前端工程化实践
Vue3组合式API大幅提升代码可维护性:
javascript复制// 课表组件逻辑封装
const useTimetable = () => {
const conflicts = ref([])
const checkConflict = (courses) => {
// 使用Temporal API处理时间交叉
return courses.filter(...)
}
return { conflicts, checkConflict }
}
性能优化关键点:
- 路由懒加载:将不同功能模块拆分为独立chunk
- 虚拟滚动:处理超长列表(如全校课表)
- Web Worker:将排课算法放到后台线程
3. 核心功能实现
3.1 智能排课系统
排课算法的核心难点在于处理"教师-教室-时间"三维约束。我们最终采用改进的遗传算法:
java复制// 染色体编码示例
public class ScheduleGene {
private int teacherId;
private int classroomId;
private DayOfWeek day;
private TimeSlot slot;
// 适应度函数计算冲突分
public double calculateFitness() {
// 检查教师时间冲突
// 检查教室容量
// 检查课程间隔要求
}
}
实测数据对比(1000次迭代):
| 算法类型 | 平均冲突数 | 运行时间 |
|---|---|---|
| 贪心算法 | 12.4 | 1.2s |
| 传统遗传算法 | 5.8 | 8.7s |
| 改进遗传算法 | 3.2 | 6.5s |
3.2 作业互评模块
采用双盲评审机制实现:
- 作业提交时自动脱敏(替换学号为随机ID)
- 使用Levenshtein距离检测抄袭
- 评价指标权重配置化
数据库设计关键表:
sql复制CREATE TABLE peer_review (
id BIGINT PRIMARY KEY,
submission_id BIGINT NOT NULL,
reviewer_id BIGINT NOT NULL,
-- 百分制评分
creativity_score TINYINT CHECK (creativity_score BETWEEN 0 AND 100),
technical_score TINYINT,
-- JSON格式的详细评价
comment JSON,
-- 防止重复评价
UNIQUE KEY uk_sub_reviewer (submission_id, reviewer_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
4. 部署与监控方案
4.1 多环境配置
通过Spring Profiles实现环境隔离:
yaml复制# application-prod.yml
spring:
datasource:
url: jdbc:mysql://cluster-mysql:3306/edu_platform?useSSL=false
hikari:
maximum-pool-size: 20
redis:
cluster:
nodes: redis-node1:6379,redis-node2:6379
Docker Compose生产配置:
dockerfile复制version: '3.8'
services:
backend:
image: edu-platform-backend:${TAG}
deploy:
resources:
limits:
cpus: '2'
memory: 2G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
4.2 监控告警体系
采用Prometheus+Grafana方案:
- JVM监控:Micrometer对接Prometheus
- 业务指标:自定义Meter统计登录/选课等事件
- 日志收集:Filebeat+ELK处理异常日志
关键监控指标看板:
- 课程API成功率(要求>99.9%)
- 作业提交峰值时段预测
- 数据库连接池使用率告警
5. 毕设开发经验谈
5.1 文档编写技巧
技术文档最容易忽视的几点:
- 接口变更记录:用Git Tag关联API版本
- 数据库变更日志:Liquibase优于纯SQL脚本
- 测试用例覆盖:Jacoco报告要包含边界条件
推荐文档结构:
code复制/docs
├── architecture.md # 架构决策记录(ADR)
├── api
│ ├── v1-spec.yaml # OpenAPI 3.0
│ └── changelog.md
└── deployment
├── local-setup.md
└── production-checklist.md
5.2 答辩常见问题
根据20+场答辩经验总结高频问题:
-
Q:为什么不用现成系统而要自己开发?
A:商业系统无法灵活适应教学改革需求,如我们新增的"课程思政"评价维度 -
Q:系统安全性如何保证?
A:三层防护:①Spring Security的BCrypt密码加密 ②JWT令牌的HS512签名 ③Nginx限流(100req/s/IP) -
Q:如果用户量增加10倍怎么办?
A:横向扩展方案:①MySQL分库分表 ②Redis Cluster ③前端静态资源CDN化
这套系统在实现过程中,我们发现教学管理场景最关键的其实不是技术复杂度,而是业务规则的灵活性。比如疫情期间突然需要支持"线上线下混合授课"模式,我们通过策略模式快速实现了授课方式的自适应切换。建议后续开发者预留足够的扩展点,特别是在课程规则引擎和权限模型这两个最容易发生变更的模块。
