这个基于SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0的教师工作量管理系统,是我去年为某高校开发的实际项目。系统解决了传统Excel统计方式存在的版本混乱、公式错误、多人协作困难等痛点,实现了教学任务分配、工作量计算、报表生成的全流程数字化管理。
核心功能模块包括:
关键设计原则:采用前后端分离架构,后端提供RESTful API,前端通过Axios消费接口,这种模式比传统JSP方案更利于团队协作和后期维护。
SpringBoot 2.7.x 作为基础框架:
MyBatis-Plus 3.5.x 增强ORM:
java复制// 示例:工作量统计的Lambda查询
wrapper.select(Workload::getTeacherId, Workload::getCourseName)
.eq(Workload::getSemester, "2023-2024-1")
.groupBy(Workload::getTeacherId);
特别注意:需要配置分页插件PaginationInnerInterceptor,否则Page对象不生效
Vue3 + TypeScript 组合优势:
典型组件示例(课程分配日历):
vue复制<template>
<el-calendar v-model="currentDate">
<template #date-cell="{ data }">
<div @click="handleDayClick(data.day)">
<p v-for="course in dayCourses(data.day)"
:key="course.id">
{{ course.name }}
</p>
</div>
</template>
</el-calendar>
</template>
MySQL 8.0关键特性应用:
核心表关系:
code复制teachers (1) → (n) workload_records (n) ← (1) courses
↑ ↑
└───── (n) audit_logs ──────┘
计算公式配置化实现:
yaml复制# application.yml
workload:
rules:
- courseType: 理论课
baseHours: 1.0
coefficient: 1.2
- courseType: 实验课
baseHours: 1.5
coefficient: 1.0
Java计算逻辑:
java复制public BigDecimal calculate(WorkloadDTO dto) {
Rule rule = ruleMap.get(dto.getCourseType());
return rule.getBaseHours()
.multiply(rule.getCoefficient())
.multiply(new BigDecimal(dto.getStudentCount()/50.0));
}
使用时间片算法检测教师时间冲突:
java复制BitSet teacherSchedule = loadTeacherBits(teacherId);
if (teacherSchedule.intersects(courseBits)) {
throw new ConflictException("时间冲突");
}
推荐部署架构:
code复制Nginx (负载均衡)
├── SpringBoot应用集群(2C4G×3)
└── Vue静态资源(CDN加速)
关键JVM参数:
code复制-server -Xms2g -Xmx2g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
缓存策略:
SQL优化案例:
sql复制-- 优化前(全表扫描)
EXPLAIN SELECT * FROM workload WHERE teacher_id LIKE '%张%';
-- 优化后(索引覆盖)
CREATE INDEX idx_teacher_name ON teachers(name);
SELECT w.* FROM workload w
JOIN teachers t ON w.teacher_id = t.id
WHERE t.name LIKE '张%';
实现方案:基于MyBatis-Plus的DataPermissionHandler
java复制@Override
public void dataPermissionFilter(DataPermission dataPermission) {
String deptId = SecurityUtils.getDeptId();
dataPermission.setDataFilter("dept_id = " + deptId);
}
解决方案:
java复制// 示例读取监听器
public class WorkloadListener extends AnalysisEventListener<Workload> {
@Override
public void invoke(Workload data, AnalysisContext context) {
if (batch.size() >= 500) {
mapper.insertBatch(batch);
batch.clear();
}
}
}
项目源码中已预留这些功能的接口定义和扩展点,二次开发时可以参考feature/目录下的设计文档。实际开发中我们发现,使用Lombok的@Builder注解能显著减少DTO类的样板代码,建议在团队内统一使用。