接高校人事系统项目久了会发现,真正难的不是功能多,而是“看起来简单”的流程细节特别磨人。最近和朋友一起复盘了一个springboot-java高校人事教师请假工资管理系统,它属于典型的高校内网业务平台,核心覆盖三块:教师基础人事信息、请假流程审批、工资核算与发放。听上去不复杂,但实际上手做起来,光状态流转和权限边界就能绕晕一批新手。
这篇文章我打算把整个系统的思路、结构、核心业务流程、数据库设计、技术难点和部署经验全拆开讲一遍。讲的时候不会刻意端着“框架教程”的架子,更多的像是一线干活的人聊项目:为什么这么设计,哪里容易踩坑,怎么排查问题。如果你正在做类似的人事OA、请假审批、薪资管理类系统,或者打算拿springboot+java做毕业设计、转行练手项目,这篇可以直接当参考底稿。
1. 项目整体设计与模块架构思路
1.1 高校人事系统的核心痛点与功能需求
高校和普通企业的人事系统最大的差异在于编制、岗位、职称、系部归属这些维度比企业复杂得多。教师请假不只涉及到调课,还牵动着课时费结算、考勤统计、工资核算,所以这三个模块不能做成彼此孤立的功能堆叠,要把数据流串起来。
这个系统的需求可以拆成四个大块:
- 系统管理:用户登录、角色权限、部门(院系)管理、菜单管理、操作日志。
- 人事档案:教师基本信息、入职状态、职称信息、所属院系、联系方式、异动记录。
- 请假管理:请假申请、流程审批(多级审批)、销假、请假记录查询、按月度统计汇总。
- 工资管理:基础工资设置、课时费/补贴核算、扣款(请假扣款、考勤扣款)、月度工资单生成、历史工资查询与导出。
模块之间的关联逻辑要很清楚:教师请假获批后,考勤模块才能拿到请假天数,工资模块再根据请假类型(病假、事假、公出)来决定是否扣款、扣多少。如果后期加了调课管理,还需要更新课表状态,这里就体现出一个后台管理系统的数据联动设计思路。
用SpringBoot做这类项目,我个人觉得比用传统的SSH或纯粹Servlet要省心得多。SpringBoot自带Tomcat、自动配置、Starter依赖管理,开发阶段可以快速跑起来,部署阶段打jar包也简单。再加上Java在企业级应用里的稳定生态,学校信息中心一般都有技术积累,维护起来不会出现“人走技术断层”的情况。
1.2 技术栈选型:为什么是SpringBoot+Java+前端分离
后台框架用SpringBoot,前端这块我建议直接上Vue,做成前后端分离。如果你的项目要以最稳妥的方式部署到学校机房服务器,更省事的是用Thymeleaf做服务端渲染。考虑到这个系统涉及审批、表单、数据报表,交互复杂度不算低,前后端分离的体验好很多。
技术栈清单大概是:
| 层级 | 选型 |
|---|---|
| 后端框架 | Spring Boot 2.x / 3.x,Java 8/11 |
| 权限认证 | Spring Security + JWT |
| ORM | MyBatis-Plus(或 Spring Data JPA) |
| 数据库 | MySQL 5.7 / 8.0 |
| 定时任务 | Quartz 或 Spring Task |
| 消息队列 | ActiveMQ 可选,用于异步通知 |
| 前端 | Vue 2/3 + Element UI / Element Plus |
| 部署 | Docker Desktop / 云服务器,jar 包部署 |
这里要特别说一下版本选择。最近很多人问“SpringBoot版本太高是不是坑”,尤其是用JDK8的老项目升级时,经常踩到 javax 变 jakarta 的兼容性问题。如果你还在用JDK8,SpringBoot老老实实选 2.7.x 系列就好;新项目若用JDK17,可以上SpringBoot 3.x,但要注意MyBatis-Plus、一些老工具包对SpringBoot 3的适配进度。
1.3 项目目录结构与代码组织规范
实际编码之前,先把包结构定好。很多新手一上来就把所有Controller挤在一个包,写到后面找代码全靠全局搜索。我常用的分层结构是:
code复制com.school.hrms
├── common // 通用结果返回、异常处理、工具类
├── config // 配置类:Security、JWT、Swagger、Quartz
├── controller // 接口层
├── service // 业务层
│ └── impl
├── mapper // MyBatis-Plus Mapper接口
├── entity // 数据库实体
├── dto // 请求/响应对象
├── vo // 视图对象,如工资单VO、请假审批VO
└── job // 定时任务
Controller层只做参数接收和结果封装,不写业务逻辑;Service层承载业务规则;Mapper层只做数据访问。有人觉得“Service还要写个接口再写个实现类”很啰嗦
