十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring Boot学生请假管理系统:核心流程与实现指南

Spring Boot学生请假管理系统:核心流程与实现指南 简介一份基于SpringBootVueMySQL的学生请假管理系统毕业设计论文面向计算机相关专业毕业生、课程设计学生及Java学习者。文档从传统请假流程痛点切入阐述系统开发背景、技术选型与设计目标并围绕个人中心、班级管理、基础数据管理、辅导员管理、公告管理、老师管理、留言管理等模块展开完整展示从需求分析、数据库设计到系统测试优化的过程可作为同类管理系统的设计与论文写作参考。资源共1个docx文件大小约3.05MB包含论文完整结构中英文摘要、目录、正文章节内容结构清晰便于直接查阅和修改。已有180人学习下载适合需要快速搭建毕业设计框架或撰写相关技术文档的读者。1. 一张论文封面背后的真实需求学生请假系统到底在解决什么问题如果你在写“基于Spring Boot学生请假管理系统”这个课题不管是毕业设计还是课程设计首先要想的不是怎么写代码而是先想清楚一个问题学校现有的请假流程到底痛在哪里。传统请假流程大概是这样的学生打印请假条、填写理由和时间、找辅导员签字、再找学院领导签字、交到教务处备案请假超过规定天数还需要家长电话确认。一套流程走下来少则半天多则两三天。一旦某个老师出差或者开会请假单就卡在某个人的抽屉里等学生回学校了可能还没批完。更麻烦的是请假记录都是纸质存档期末想统计哪个班请假率高、哪个时间段是请假高峰期全靠人工翻表格数据就是一笔糊涂账。所以这个课题目的一目了然用Spring Boot做一个Web系统把请假这件事从线下挪到线上学生在线提交申请辅导员和学院领导在线审批所有记录落库可查。从技术角度说这是一个非常典型的“用户角色管理 业务流转 审批状态机”项目难度比单纯的学生管理系统高一点但比真正的企业级工作流系统简单得多正好适合用来做毕业论文或课设。这篇文章不会给你一份可以直接交差的论文模版而是从一个实际做过这类项目的人的角度把这套系统的需求拆解、表结构设计、核心代码实现、常见坑点一次性讲透你照着这个思路去写文档和改代码拿个不错的成绩是稳的。2. 技术栈和表结构怎么定Spring Boot请假系统的地基2.1 技术选型不追新只求稳很多同学一上来就想用微服务、Redis、消息队列这是典型的“技术选型过度”。一个学生请假系统并发量撑死也就是全校几千人同时访问用单体应用绰绰有余。技术选型的核心原则是你自己能讲清楚为什么用它能 Hold 住它的复杂度。我推荐这套组合理由都很实在Spring Boot 2.7.x 版本这是目前教程最多、问题排查资料最全的版本别去用 Spring Boot 3.x虽然它也出了好几年了但很多老教程的写法都不兼容遇到问题想搜答案都费劲。持久层用 MyBatis Plus它把单表增删改查封装好了省去大量写 XML 的时间生成代码的效率翻倍。权限控制用 Sa-Token 或者 JWT 都行个人建议用 Sa-Token它对“登录状态 角色权限”的封装很友好拦截器配置简单比 Shiro 更轻量。前端用 Thymeleaf 或者直接写 Vue 都行如果你是主攻 Java就用 Thymeleaf 加 Bootstrap这样论文里可以写“模板引擎渲染”也不需要额外部署 Node.js 环境。数据库必须是 MySQL这是毋庸置疑的。MySQL 5.7 或 8.0 都可以建议 8.0因为它对时间类型、JSON 类型的支持更友好。开发工具方面IDEA Navicat Postman 这三件套足够用了。2.2 核心表设计五张表讲清楚整个业务表结构设计是整个系统最核心的部分表设计好了代码写起来会非常顺表设计有问题后面写 Service 层的时候会被各种 JOIN 折磨。第一张表是用户表字段包含用户ID、用户名、密码、真实姓名、角色、班级ID学生需要、手机号。角色字段我建议用 int 类型存1代表学生、2代表辅导员、3代表学院管理员、4代表系统管理员不要用字符串因为字符串比较慢而且容易写错。第二张表是班级表包含班级ID、班级名称、所属学院。这个表必须单独拆出来不要直接存学院名称到用户表里。原因很简单一个学院下面有几十个班级如果不拆表你后面做“按学院查请假统计”的时候会非常痛苦。第三张表是请假单主表包含请假单ID、学生ID、请假类型、开始时间、结束时间、请假天数、请假事由、当前状态、创建时间。请假类型可以存字典值1事假、2病假、3丧假、4其他。当前状态是核心记住用 int 存0待辅导员审批、1辅导员通过待学院审批、2辅导员驳回、3学院通过完成、4学院驳回。这里要特别注意不要把状态设计成那种单一的“通过/不通过”因为学生请假审批是两级的状态必须能表达“走到哪一步了”。第四张表是审批记录表包含记录ID、请假单ID、审批人ID、审批人角色、审批动作、审批意见、审批时间。这张表的用途很大一是让审批人能看到这个请假单已经过哪些人的手二是论文里可以写“审计留痕”是个很好的亮点。很多同学会忽略审计表但加了之后论文内容能多写两页。第五张表是课程表这不是必须的但如果你想扩充功能比如学生请假时可以选择请假课程那就要有课表。基础版本可以不加但作为论文亮点模块可以后面扩展。3. 请假审批主流程怎么实现核心模块开发手记3.1 登录与角色鉴权一个注解搞定权限登录模块是所有模块的基础。密码必须加密存储这是论文答辩时老师大概率会问的点。用 Spring Boot 自带的 BCryptPasswordEncoder 就可以它会自动加盐同一密码每次加密结果都不同比 MD5 那种可反查的算法安全得多。登录成功之后把用户信息和角色放进 Sa-Token 的 Session 里然后配置一个拦截器拦截所有请求Shiro 的配置方式是在 WebMvcConfigurer 里注册拦截器Sa-Token 则在它的拦截器配置类里完成。核心配置大概是这样的Configuration public class SaTokenConfig implements WebMvcConfigurer { // 注册 Sa-Token 拦截器打开注解式鉴权功能 Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaInterceptor(handle - StpUtil.checkLogin())) .addPathPatterns(/**) .excludePathPatterns(/login, /register, /static/**); } }之后在每个 Controller 的方法上用SaCheckRole(student)或者SaCheckRole(counselor)做权限控制。这种方式的好处是你的权限控制直接写在方法上一目了然论文里解释起来也简单。这里说一个我踩过的坑一定要把静态资源路径排除掉不然你没登录的时候页面加载不进去 CSS 和 JS。3.2 提交请假与审批状态流转别写 if-else 地狱请假单的状态流转是整个系统最核心的业务逻辑很多同学的代码写成这样根据当前状态判断能不能执行某个操作比如如果状态是 0可以执行辅导员通过否则报错如果状态是 1可以执行学院通过否则报错。这种写法逻辑没错但全部叠加在一个 Service 方法里代码会非常难看。更好的做法是抽一个状态流转的 Service 类核心用一个 Map 来维护状态机。比如// key当前状态, value可以执行的操作列表 private static final MapInteger, ListString STATE_MACHINE new HashMap(); static { STATE_MACHINE.put(0, Arrays.asList(counselor_approve, counselor_reject)); STATE_MACHINE.put(1, Arrays.asList(school_approve, school_reject)); }那么审批的方法就可以统一处理public void approve(LeaveOrder order, String approverRole, boolean result, String comment) { ListString allowedActions STATE_MACHINE.get(order.getStatus()); // 判断当前角色是否可以执行该操作 if (allowedActions null || !allowedActions.contains(approverRole approve)) { throw new ServiceException(当前状态不允许此操作); } // 更新请假单状态 order.setStatus(result ? nextStatus(order.getStatus()) : rejectStatus(order.getStatus())); // 插入审批记录 auditMapper.insert(new AuditRecord(order.getId(), StpUtil.getLoginIdAsInt(), comment)); }这样做的好处是状态流转规则集中管理新增状态的时候只需要改 STATE_MACHINE不会影响其他逻辑。论文里你可以画一张状态流转图配这段代码说明“本系统采用状态机驱动审批流程”这个表述非常加分。3.3 请假时间冲突校验一个特别容易忽略的点当学生提交一个请假申请时如果该学生在这个时间段内已经有请假单通过了系统应该给出提示。这是实际使用中很常见的需求但很多课设项目根本不校验。代码实现也不复杂查询同一学生在相同时间段内是否存在状态为“待审批”或“通过中”的单子即可long count leaveOrderMapper.selectCount( new LambdaQueryWrapperLeaveOrder() .eq(LeaveOrder::getStudentId, studentId) .and(wrap - wrap .eq(LeaveOrder::getStatus, 0) .or() .eq(LeaveOrder::getStatus, 1)) .and(wrap - wrap .lt(LeaveOrder::getStartTime, endTime) .gt(LeaveOrder::getEndTime, startTime)) );这个方法用了区间重叠判断的标准写法已有假期的开始时间小于本次结束时间且已有假期的结束时间大于本次开始时间说明两段时间有重叠。这个校验逻辑写进论文里是实打实的亮点说明你不仅会 CRUD还考虑了业务一致性。4. 权限控制、文件上传和时间冲突绕不开的三个坎4.1 数据权限学生不该看到别人的请假单很多同学做完登录权限就完事了但忽略了一个更细的问题——数据权限。学生登录系统后列表查询只应该看到自己的请假单不能看到其他同学的。这个实现方式有两种第一种是简单方案查询的时候强制加一个条件where student_id 当前登录用户ID。这个方案直接、易懂、安全是基础版的首选。第二种是我的个人建议升级方案做一个 MyBatis Plus 的拦截器或者用自定义注解实现数据权限自动注入这样代码里不用每个方法都写条件。但考虑到毕业设计的代码量不大第一种方案完全够了。写论文的时候可以用一段话描述“为保证用户数据隔离本系统在请假单列表、详情查询等业务方法中通过 Session 获取当前登录用户动态拼接数据权限条件确保低风险用户只能访问本人的数据。”4.2 请假天数自动计算为什么不能直接减日期学生填了开始时间和结束时间请假天数应该由系统自动算出来。很多人拿到日期直接相减但这样会有两个问题第一如果开始和结束是同一天直接减得到 0但实际请假应该是 1 天第二如果请假时间段跨越周末是否要剔除周末这个规则应该怎么定项目里推荐的做法是这样前端只选开始和结束日期后端统一计算。如果不考虑剔除周末那么long days ChronoUnit.DAYS.between(startDate, endDate) 1;这个 1 是很多同学容易忘的。如果你的论文里写了“考虑到课程安排在周一至周五请假天数按自然日计算”那就不用考虑周末剔除如果你想做得更高级一点可以写一个专门的方法把周末去掉LocalDate temp startDate; int count 0; while (!temp.isAfter(endDate)) { DayOfWeek day temp.getDayOfWeek(); if (day ! DayOfWeek.SATURDAY day ! DayOfWeek.SUNDAY) { count; } temp temp.plusDays(1); }这个循环逻辑很基础但很多同学现场答辩的时候就是算不对建议你把这段单独抽出来做个工具类并且写几个单元测试验证例如周五到下周一请假天数自动算应该是 2 天周五、周一而不是 4 天。4.3 文件上传病假证明这块“鸡肋”怎么处理病假通常需要上传医院证明这个功能在论文里很容易被写成亮点但也很容易踩文件类型和大小校验的坑。我的建议是先限制文件不可执行类型再校验大小再把文件名重命名。实操中用一个 UUID 作为新文件名就能彻底规避中文文件名乱码问题文件路径也建议存相对路径不要存绝对路径。如果上传到本地磁盘部署时记得修改配置文件的路径不然打包成 jar 以后你会发现文件根本存不进去。我见过太多人在这里折腾半天其实是没注意 Spring Boot 打包后拿不到外部相对路径。如果你不想把文件存本地也可以用 MinIO 做对象存储但考虑到这是课设本地存储完全够用重点是要在代码里把文件名、存储路径、访问映射写清楚。5. 一整套能跑的代码目录长什么样为了论文答辩你该写成这样这一节我直接给你一个我做这类项目时会用的标准包结构保证代码层次清楚论文描述也方便。com.example.leave ├── config // 配置类Sa-Token拦截器、跨域配置 ├── controller // 控制层按角色拆分StudentController、CounselorController、AdminController ├── service // 业务层接口 impl实现 ├── mapper // 数据访问层MyBatis Plus的Mapper接口 ├── entity // 实体类对应数据库表 ├── dto // 数据传输对象前端传参封装 ├── vo // 视图对象返回给前端的数据结构 ├── common // 公共工具类统一返回结果、异常处理、日期工具 └── LeaveApplication.java // Spring Boot启动类有几个细节需要特别强调第一统一返回结果类必须写。不管前端用什么框架后端返回 JSON 必须有个统一的壳子比如{ code: 200, message: success, data: {} }。有些同学图省事Controller 里直接把 Map 返回去表面看也实现了但一旦出现异常前端无法统一处理。统一封装之后配合全局异常处理器RestControllerAdvice系统所有的报错信息都能转换成结构一致的 JSON这在论文“系统测试”部分非常好写。第二Controller 层只做参数接收和返回所有业务逻辑都放到 Service 层。很多同学为了省事直接在 Controller 里写数据库查询这会在论文的“系统设计”章节暴露出很大的问题因为你画分层架构图的时候Controller 直接访问 Mapper 是说不通的。写完代码以后你可以自己检查一遍凡是 Controller 方法体里超过 10 行的基本就是业务逻辑泄露了该下沉的必须下沉。第三不要忘记分页。请假单列表、审批列表都必须支持分页查询MyBatis Plus 提供了一个简单的分页插件配置一个拦截器就行。分页这个点在答辩时被问到的概率非常高你可以用“数据量增长后分页可减小数据库查询压力”这句话来回答。6. 项目跑起来才能毕业环境搭建、部署与避坑记录6.1 从零到一跑通这个项目的关键顺序很多同学从 Github 上拉一个开源请假系统改一改但改完之后自己都不知道项目怎么跑起来。这里我给你一份稳妥的顺序装 MySQL 5.7 以上版本创建数据库执行项目里的sql脚本确认表和测试数据都导入了修改项目的application.yml配置文件重点检查数据库 URL、账号密码、文件上传路径启动项目看到 Spring Boot 启动成功的日志浏览器访问登录页用测试账号登录先跑通“学生提交请假 → 辅导员登录审批 → 学院登录审批”的完整链路。这里有一个很关键的建议不要用国内的宝塔面板里自动安装的 MySQL 默认编码一定要主动建库时指定utf8mb4否则请假事由里如果有中文表情符号数据库会报错。建库语句你可以写成CREATE DATABASE leave_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;utf8mb4和utf8的区别很多人不知道utf8在 MySQL 里最多存 3 个字节像 emoji 表情要 4 个字节所以必须用utf8mb4。这个细节答辩老师一问答上来就是加分项。6.2 打包部署时最常见的一个问题静态资源丢失本地运行一切正常但mvn package打成 jar 包后部署到服务器打开页面发现样式全丢了。这个问题核心原因是 Thymeleaf 静态资源路径配置不对或者打成 jar 包后静态资源没有被包含。解决方案是确认src/main/resources/static目录下的文件存在其次检查页面里有没有用绝对路径。有人问为什么不用 war 包部署其实现在 Spring Boot 推荐的就是直接java -jar运行内置 Tomcat方便很多。只需注意文件上传的目录要单独配一个对外映射Configuration public class WebMvcConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/files/**) .addResourceHandler(file: uploadPath /); } }否则部署到服务器以后上传的请假证明在页面上是显示不出来的。6.3 定时任务自动提醒审批人最后说一个小而美的扩展。前面提到审批流程可能卡在某个审批人那里因为审批人忘记登录系统查看。你可以用 Spring Boot 自带的Scheduled注解写一个定时任务每天早晨扫描所有“待辅导员审批”状态超过 24 小时的请假单把学生的姓名、班级、请假时间通过站内信或预留的邮箱字段推送给辅导员。这个功能代码量不大但写在论文“系统亮点”部分很有说服力生产环境里这种能力叫“超时提醒”它在研究课题里可以被描述成对工作效率的显著提升。Scheduled(cron 0 0 8 * * ?) public void remindPendingOrders() { ListLeaveOrder pendingList leaveOrderMapper.selectList( new LambdaQueryWrapperLeaveOrder() .eq(LeaveOrder::getStatus, 0) .lt(LeaveOrder::getCreateTime, LocalDateTime.now().minusHours(24)) ); // 逐个给对应辅导员发送提醒 }7. 写在最后关于这个课题我最想强调的三句话第一句不要在一开始纠结功能列表要多庞大。把“学生提交请假-辅导员审批-学院审批-学生查看结果”这条主链路打磨顺数据能对得上权限不越界已经超过了 60% 的同类课设。在此基础上每加一个深度功能比如时间冲突校验、超时提醒、审批审计记录都是亮点。第二句论文里的架构图和你代码的目录结构必须一一对应。很多人代码写的是三层架构论文里画了五层答辩时老师照着论文问代码答不上来直接穿帮。先定代码结构再画图顺序千万别反了。第三句一定要自己把项目部署到服务器上跑一遍完整流程。就算你用的是本地环境至少把 jar 包打出来纯命令行启动一次。很多毕业生在演示环节翻车都栽在环境问题上。栽在毫无准备的环境问题上是最不划算的。自己亲手走一遍“干净环境 手动部署”的流程你在答辩时心里会非常有底。本文还有配套的精品资源点击获取
返回列表