1. 项目概述
这个基于SpringBoot的学生日常事务管理系统是我去年指导的一个本科毕业设计项目,系统采用前后端分离架构,后端使用SpringBoot+MyBatis技术栈,前端采用Vue.js框架。整个系统从需求分析到最终部署上线历时4个月,目前已在某高校试点运行半年,日均处理学生事务请求300+次。
系统主要解决了传统纸质化学生事务管理中的三大痛点:一是信息传递效率低下,二是流程审批周期长,三是数据统计困难。通过数字化手段将学生请假、活动报名、成绩查询、宿舍报修等12项高频事务全部线上化,管理员端还提供了完善的数据可视化分析功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端技术选型
选择SpringBoot 2.7.8版本(考虑毕业设计期间3.0刚发布存在兼容风险),主要技术组件包括:
- 核心框架:SpringBoot + Spring MVC
- ORM层:MyBatis + PageHelper分页插件
- 安全认证:Spring Security + JWT
- 数据库:MySQL 8.0(配置了主从复制)
- 缓存:Redis 6.2(用于会话管理和热点数据缓存)
- 消息队列:RabbitMQ 3.9(处理异步通知)
- 文件存储:MinIO(替代FastDFS更易部署)
特别注意:SpringBoot事务默认自动提交,在涉及多表操作时需要手动添加@Transactional注解,我们系统中在奖学金评定模块就遇到过因事务未生效导致的数据不一致问题。
2.2 前端技术方案
Vue 2.6 + Element UI构建的管理后台,主要特点:
- 采用动态路由实现权限控制
- 使用ECharts实现数据可视化
- 集成WangEditor富文本编辑器
- 通过axios拦截器处理JWT续期
3. 核心功能实现
3.1 多维度权限系统
设计RBAC+ABAC混合模型:
java复制// 权限注解示例
@PreAuthorize("hasRole('TEACHER') or hasPermission(#dormId,'dorm:manage')")
public void approveRepair(Long dormId) {
// 审批逻辑
}
权限表设计采用五张表:
- sys_user
- sys_role
- sys_menu
- user_role
- role_menu
3.2 事务流程引擎
使用状态模式实现请假审批流程:
mermaid复制stateDiagram
[*] --> 待提交
待提交 --> 辅导员审批: 学生提交
辅导员审批 --> 院系审批: 请假>3天
辅导员审批 --> 已完成: 请假≤3天
院系审批 --> 已完成
院系审批 --> 已驳回
3.3 高性能文件处理
采用分块上传解决大文件传输:
java复制@PostMapping("/chunk")
public R uploadChunk(@RequestParam MultipartFile file,
@RequestParam String md5,
@RequestParam Integer chunk) {
// 校验并存储分块
String path = minioService.uploadChunk(file, md5, chunk);
return R.ok().data("path", path);
}
4. 典型问题解决方案
4.1 JWT续期方案
采用双Token机制:
- access_token: 2小时过期
- refresh_token: 7天过期
前端在请求拦截器中自动处理:
javascript复制service.interceptors.response.use(
response => {
if (response.data.code === 401) {
if (!isRefreshing) {
return refreshToken().then(() => {
return service(originalRequest);
});
}
}
return response.data;
}
);
4.2 分布式锁应用
在选课模块使用Redis分布式锁:
java复制public boolean selectCourse(Long courseId, Long studentId) {
String lockKey = "lock:course:" + courseId;
String lockValue = UUID.randomUUID().toString();
try {
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, lockValue, 30, TimeUnit.SECONDS);
if (locked) {
// 执行业务逻辑
}
} finally {
if (lockValue.equals(redisTemplate.opsForValue().get(lockKey))) {
redisTemplate.delete(lockKey);
}
}
}
5. 部署实践
5.1 Docker Compose部署
docker-compose.yml关键配置:
yaml复制services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
redis:
image: redis:6.2
command: redis-server --appendonly yes
volumes:
- ./redis/data:/data
5.2 性能优化措施
- Nginx配置静态资源缓存:
nginx复制location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
- SpringBoot参数调优:
properties复制server.tomcat.max-threads=200
server.tomcat.accept-count=100
spring.datasource.hikari.maximum-pool-size=20
6. 毕业设计建议
- 技术选型要量力而行,不要盲目追求新技术
- 文档编写要同步进行(我们要求每周更新设计文档)
- 测试用例覆盖率建议达到70%以上
- 使用Git进行版本控制(推荐Git Flow工作流)
- 提前准备答辩演示数据(建议准备3套测试账号)
系统在实现过程中遇到的典型问题:
- MyBatis懒加载引发的N+1查询问题
- SpringCache与事务的协同问题
- 前后端跨域配置的细节处理
- 定时任务幂等性保证
- 验证码服务防刷机制
项目源码已托管在Gitee(需申请访问权限),包含:
- 完整后端代码(含单元测试)
- 前端Vue项目
- 数据库SQL脚本
- 接口文档(Swagger+Markdown双版本)
- 部署手册
- 答辩PPT模板
