1. 项目概述
这个基于SpringBoot+Vue+MySQL的作业管理系统是我去年指导的一个本科毕业设计项目,经过三个月的开发和优化,最终形成了一套完整的解决方案。系统采用前后端分离架构,后端使用SpringBoot框架提供RESTful API,前端采用Vue.js构建用户界面,数据库选用MySQL 8.0进行数据存储。
提示:这个架构选择特别适合在校学生作为毕业设计项目,因为技术栈主流且文档丰富,遇到问题容易找到解决方案。
系统主要功能包括:
- 教师端:作业发布、批改、成绩管理
- 学生端:作业提交、查看成绩
- 管理员端:用户管理、系统监控
- 特色功能:文件上传、在线预览、作业查重
2. 技术选型与架构设计
2.1 后端技术栈
SpringBoot 2.7.x作为后端框架,主要基于以下考虑:
- 自动配置简化了传统Spring项目的繁琐配置
- 内嵌Tomcat服务器,部署方便
- 丰富的starter依赖,整合MyBatis、Redis等组件非常便捷
数据库访问层采用MyBatis-Plus 3.5.x,相比原生MyBatis:
- 减少了约60%的样板代码
- 内置分页插件简化了分页查询
- 强大的条件构造器方便复杂查询
// 典型Service层代码示例 @Service public class AssignmentServiceImpl extends ServiceImpl<AssignmentMapper, Assignment> implements AssignmentService { @Override public Page<AssignmentVO> getAssignmentPage(PageParam param) { return baseMapper.selectPage(param.toPage(), new LambdaQueryWrapper<Assignment>() .eq(Assignment::getCourseId, param.getCourseId()) .orderByDesc(Assignment::getDeadline)); } }2.2 前端技术栈
Vue 3.x + Element Plus作为前端框架组合:
- 组合式API比Options API更灵活
- Vite构建工具显著提升开发体验
- Element Plus提供了丰富的UI组件
前端工程采用典型模块划分:
src/ ├── api/ # 接口定义 ├── assets/ # 静态资源 ├── components/ # 公共组件 ├── router/ # 路由配置 ├── stores/ # Pinia状态管理 ├── utils/ # 工具函数 └── views/ # 页面组件2.3 数据库设计
MySQL 8.0数据库设计了12张核心表,主要表关系如下:
| 表名 | 主要字段 | 说明 |
|---|---|---|
| user | id, username, password, role | 用户基础表 |
| student | id, user_id, class_id | 学生扩展信息 |
| teacher | id, user_id, title | 教师扩展信息 |
| course | id, name, credit | 课程信息 |
| assignment | id, course_id, title, content, deadline | 作业发布 |
| submission | id, assignment_id, student_id, file_url, submit_time | 作业提交 |
注意:密码字段使用BCrypt加密存储,切勿明文保存用户密码
3. 核心功能实现
3.1 作业发布与提交
教师发布作业时,系统支持富文本编辑和文件上传。使用WangEditor作为富文本编辑器,文件上传采用分片上传方案:
@PostMapping("/upload") public R<String> upload(@RequestParam("file") MultipartFile file) { // 1. 校验文件类型和大小 // 2. 生成唯一文件名(UUID + 时间戳) // 3. 分片上传到OSS/MinIO // 4. 返回文件访问URL }学生提交作业时,系统会自动记录提交时间并与截止时间比对,超时提交会标记为"迟交"状态。
3.2 作业查重功能
实现基于SimHash算法的简易查重系统:
- 对作业文本进行分词处理(使用HanLP)
- 计算SimHash指纹
- 比对已有作业的指纹库
- 返回相似度报告
public class PlagiarismChecker { public static double checkSimilarity(String text1, String text2) { // 1. 预处理文本(去停用词、标点) // 2. 提取关键词 // 3. 计算SimHash // 4. 计算汉明距离 // 5. 转换为相似度百分比 } }3.3 成绩统计分析
使用ECharts实现可视化统计:
- 班级成绩分布直方图
- 课程成绩趋势折线图
- 学生个人成绩雷达图
前端通过WebSocket实时接收成绩更新通知,保持数据同步。
4. 系统部署方案
4.1 开发环境配置
- JDK 17 + IntelliJ IDEA
- Node.js 16.x + VSCode
- MySQL 8.0 + Redis 6.x
- 推荐使用Docker容器化依赖服务
# 启动开发环境依赖 docker-compose -f dev-env.yml up -d4.2 生产环境部署
采用Nginx + Docker组合部署方案:
- 前端构建静态文件部署到Nginx
- 后端打包为JAR运行在Docker容器
- MySQL配置主从复制
- Redis作为缓存和会话存储
Nginx关键配置:
server { listen 80; server_name your.domain.com; location / { root /var/www/html; try_files $uri $uri/ /index.html; } location /api { proxy_pass http://backend:8080; proxy_set_header Host $host; } }5. 项目优化与扩展
5.1 性能优化实践
接口响应优化:
- 启用SpringBoot Actuator监控
- 添加Redis缓存热点数据
- 使用@Cacheable注解缓存查询结果
前端性能优化:
- 路由懒加载
- 组件按需引入
- 开启Gzip压缩
5.2 常见问题排查
跨域问题:
- 确保后端添加@CrossOrigin注解
- 检查Nginx代理配置
- 验证前端axios baseURL设置
文件上传失败:
- 检查SpringBoot multipart配置
- 确认存储目录权限
- 查看Nginx client_max_body_size
MySQL连接超时:
- 调整连接池参数
- 检查服务器防火墙设置
- 验证数据库用户权限
5.3 扩展方向建议
- 增加移动端支持(Uniapp或React Native)
- 集成钉钉/微信消息通知
- 添加自动化测试(JUnit + Jest)
- 实现CI/CD流水线(Jenkins或GitHub Actions)
这个项目在实现过程中最大的收获是理解了前后端分离架构的实际应用场景。特别是在处理文件上传和WebSocket实时通知时,遇到了不少挑战,但最终通过查阅文档和社区讨论都得到了解决。建议后来者在开发类似系统时,先从简单的CRUD功能入手,逐步添加复杂功能,这样更容易把控项目进度。