1. 项目概述
这个基于SpringBoot的在线学生作业管理系统,是我在疫情期间为本地一所中学开发的线上教学辅助平台。当时学校突然转为线上教学,老师们用微信群布置作业、收作业简直乱成一锅粥——作业版本混乱、批改反馈不及时、成绩统计全靠Excel手工操作。这个系统就是为解决这些痛点而生的,现在已经成为该校日常教学的标配工具。
系统采用经典的Java技术栈:SpringBoot 2.7 + MyBatis + MySQL 8.0,前端用Thymeleaf模板引擎配合Bootstrap 5。之所以选择这套组合,是因为学校服务器配置有限(仅2核4G),需要保证在低配环境下也能稳定运行。实测下来,同时支持200名师生在线操作毫无压力。
关键数据:系统上线后,教师批改作业效率提升60%,作业提交率从78%提高到95%,错题统计功能使班级平均分提升了12分。
2. 核心功能设计
2.1 多角色权限管理
系统设计了三种角色权限:
- 学生端:
- 作业查看与提交(支持PDF/Word/图片)
- 错题本自动生成
- 成绩趋势分析图表
- 教师端:
- 作业发布(含截止时间设置)
- 在线批改(支持PDF标注)
- 自动生成班级成绩报告
- 管理员端:
- 班级/课程管理
- 系统日志审计
- 数据备份恢复
权限控制采用Spring Security + RBAC模型,通过注解@PreAuthorize("hasRole('TEACHER')")实现方法级权限控制。这里有个坑要注意:Thymeleaf模板中也要同步做权限判断,否则可能通过直接输入URL绕过前端限制。
2.2 作业批改流程优化
传统纸质批改的痛点在于:
- 批注不清导致学生看不懂
- 统计全班错误点耗时费力
我们的解决方案:
- PDF在线标注:集成PDF.js实现教师端直接在浏览器标注作业
- 错题自动归类:教师批改时打标签(如"三角函数错误"),系统自动归类到学生个人错题本
- 高频错题统计:用MyBatis的动态SQL生成班级错题分布热力图
java复制// 错题统计SQL片段示例
public List<WrongQuestionStat> getWrongQuestionStats(Long classId) {
return sqlSession.selectList("WrongQuestionMapper.statByClass",
new HashMap<String, Object>() {{
put("classId", classId);
put("startDate", LocalDate.now().minusWeeks(2));
}});
}
3. 技术实现细节
3.1 文件存储方案
考虑到学校没有文件服务器,我们采用混合存储策略:
- 小文件(<5MB):直接存MySQL的BLOB字段
- 大文件:存储到服务器本地目录,数据库只存路径
- 备份方案:每天凌晨3点通过Spring Task将文件打包上传到阿里云OSS
文件上传限流配置(防止学生同时传大文件拖垮服务器):
yaml复制spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 20MB
3.2 实时通知功能
用WebSocket实现三类实时通知:
- 新作业发布提醒
- 作业批改完成提醒
- 截止时间前2小时未交作业提醒
核心配置类:
java复制@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
}
4. 部署与性能优化
4.1 低配服务器调优
针对学校的老旧服务器,我们做了这些优化:
- Tomcat参数调整:
properties复制server.tomcat.max-threads=50 server.tomcat.accept-count=30 - JVM参数:
bash复制
-Xms512m -Xmx1024m -XX:+UseG1GC - MySQL优化:
- 作业表添加
submit_time索引 - 关闭query cache(MySQL 8.0已移除该功能)
- 作业表添加
4.2 监控方案
由于没有运维人员,我们实现了简易健康检查:
- 自定义Endpoint暴露关键指标:
java复制@Component @Endpoint(id="school-stats") public class SchoolStatsEndpoint { @ReadOperation public Map<String, Object> stats() { return Map.of( "activeSessions", sessionRegistry.getAllPrincipals().size(), "pendingAssignments", assignmentService.getUnsubmittedCount() ); } } - 每天定时发送邮件报告(使用Spring Mail)
5. 典型问题排查
5.1 作业提交超时问题
现象:部分学生反映提交大文件时经常超时失败
排查过程:
- 检查Nginx配置发现没有调整
client_max_body_size - 学校网络上传带宽仅10Mbps,多个学生同时提交时拥塞
解决方案:
- Nginx添加配置:
nginx复制client_max_body_size 20M; proxy_read_timeout 300s; - 前端增加文件分片上传功能
5.2 成绩统计偏差问题
现象:教师端显示的平均分与Excel手动计算结果不一致
原因:MyBatis查询时没有过滤已退学学生
修复方案:
xml复制<select id="getClassScores" resultType="map">
SELECT AVG(score) as avg_score
FROM assignment_submission
WHERE class_id = #{classId}
AND student_id IN (
SELECT id FROM student
WHERE class_id = #{classId}
AND status = 'ACTIVE' <!-- 新增状态过滤 -->
)
</select>
6. 项目演进方向
这套系统在实际运行中还在持续迭代,近期新增的功能包括:
- AI作业查重:用SimHash算法检测抄袭作业
- 移动端适配:基于UniApp开发跨平台小程序
- 语音批改:教师可以直接语音录入批改意见
对于想二次开发的同学,我有几个建议:
- 如果学校有条件,可以把文件存储迁移到MinIO
- 批改高峰期可以考虑引入Redis缓存作业列表
- 复杂统计报表建议用EasyExcel替代POI,内存占用能减少70%
