多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Spring Boot医院人力资源管理系统:从选题到部署的毕业设计全解析

Spring Boot医院人力资源管理系统:从选题到部署的毕业设计全解析 1. 为什么医院人力资源管理系统是毕业设计的黄金选题每年到了毕设季总有学弟学妹来问我哥Spring Boot的毕设到底做什么题目好商城系统是不是太多了 我的回答一直很明确如果你既想拿高分、又不想跟别人卷成一片基于Spring Boot的医院人力资源管理系统HRM是一个很聪明的选择。这个结论不是我拍脑袋给的而是在对比了常见的图书管理、商城、博客系统后在医院信息化和人事管理这个交叉领域里得出的经验。先说说黄金在哪。第一这个题目天然带行业纵深。同样是增删改查图书管理系统的逻辑是一本图书对应一个ISBN而医院人事管理涉及科室、排班、考勤、绩效、薪酬、合同任何一个环节都有复杂的业务规则。你把这个理顺了论文里能写的东西特别多答辩老师也愿意听。第二Spring Boot框架在这个场景下发挥空间很大。从Spring Security做权限控制、Spring Data JPA或MyBatis操作数据、Redis做缓存和验证码到后来用JWT做无状态认证整个Spring Boot生态的核心组件几乎都能串起来。一套毕设做下来简历上能写的东西比做了一个购物车值钱得多。而且医院人力资源管理系统有一个其他题目没有的优势需求明确且真实。医院是典型的事业单位特殊行业混合体人事管理不仅要管基本信息还要管执业资质、职称晋升、排班轮转、绩效核算。这些需求都不是凭空捏造的全部来自真实业务。你做出来的系统哪怕只是个demo逻辑上稍微贴近一点实际导师一眼就能看出你懂行业这比堆砌一堆CRUD强太多。这篇文章我会把整个项目从选题到落地的完整链路讲透包括技术选型、业务模型、表结构设计、核心逻辑实现、权限设计、部署上线和论文答辩。你跟着走一遍不只能交出一份能跑通的毕设源码还能真正搞懂Spring Boot在真实项目里是怎么组织代码的。内容不吹不黑都是我实际带项目时验证过的东西。2. 技术栈选型Spring Boot 3还是2前端用不用Vue2.1 版本选择的实际考量先解决最让人纠结的问题Spring Boot到底用3.x还是2.7.x。我的建议很直接如果毕设时间充裕用Spring Boot 3.x如果想稳一点、抄代码方便就用2.7.x。这不是和稀泥而是基于当前生态现状的务实判断。Spring Boot 3.x在2022年底发布后到2024、2025年已经非常成熟了。它基于JDK 17性能上有明显提升而且Spring Security 6.0的配置方式做了一次大重构Lambda风格配置写起来更舒服。但问题在于网上大量毕业设计参考代码还是2.x的写法尤其是Security和Redis的配置你抄的时候会频繁遇到这个类怎么没了的报错。如果你对Spring Boot的自动装配和配置原理不够熟排查起来会耽误不少时间。反过来Spring Boot 2.7.x是2.x系列的收官版本稳定到不能再稳定。市面上绝大多数毕设参考项目都能在这个版本上直接跑通资料也最全。如果你用的是学校实验室的旧电脑或者对Java环境配置不熟2.7.x配合JDK 8/11是最不容易出幺蛾子的组合。医院人力资源管理系统本身没有必须依赖3.x新特性的地方所以稳定性优先是更理性的选择。我给学弟学妹写推荐配置的时候通常是这样给组件推荐版本备注JDK8 或 11配合Spring Boot 2.7.x最稳Spring Boot2.7.182.x最终版坑最少数据库MySQL 5.7 / 8.08.0注意时区参数ORMMyBatis-Plus 3.5.x单表操作省事分页好用安全框架Spring Security JWT毕设展示RBAC足够缓存Redis 6.x验证码、菜单缓存前端Thymeleaf 或 Vue 3 Element Plus二选一2.2 前端方案Thymeleaf还是前后端分离这是毕设选题里第二个高频纠结。很多人看到网上教程都在喊前后端分离就觉得不做Vue就落伍了。但你得考虑一个问题你是一个人做毕设不是团队协作。Thymeleaf方案的优势是集成度极高。Spring Boot Spring MVC Thymeleaf是一套原生组合不用启动两个服务不用处理跨域问题不用写前后端联调的接口文档。模板引擎直接在HTML里写表达式后端的Model数据直接渲染成页面。省下的时间你可以用来打磨业务逻辑加更多功能亮点。Vue前后端分离的优势是界面更现代、交互体验更接近真实企业级项目。而且从技术成长角度来说Vue 3 Element Plus Axios的组合是目前国内中小型公司的主流前端形态你提前接触一遍对就业确实有加分。但是前后端分离给毕设带来的额外工作量是实打实的你需要维护两个项目、封装Axios请求、处理JWT跨域传递、写接口文档、处理Token过期刷新。这些都不是业务代码而是框架层面的东西。我的建议是如果你的主要目标是快速跑通、把精力放在后端业务和论文上选Thymeleaf。如果你前端本身有点基础或者想借毕设把Vue技术栈串一遍选前后端分离。医院人力资源管理系统这种项目其实特别适合Thymeleaf。因为它的核心价值在业务逻辑考勤计算、薪资核算、权限分配页面本身不需要太多花哨的交互。用Bootstrap或AdminLTE做一套干净的后台管理界面完全够用而且看起来还像一个正经系统。3. 医院人力资源管理的业务模型你到底在做什么3.1 别把人事系统当成花名册管理系统很多人一看人力资源管理系统就开始设计员工表、部门表然后在页面上来回增删改查做完发现这跟通讯录管理系统没啥区别。这就是典型的没读懂题目。医院这两个字决定了这个系统的人事管理跟一般企业不一样。它有几条独特的业务线第一科室结构与排班。医院是典型的矩阵式组织医生护士属于科室但被统一调配参与排班。急诊、ICU这类科室是24小时轮转排班表要按星期、班次白班、夜班、值班来设计不能像普通企业那样只有早九晚五。第二执业资质管理。医生有执业医师资格证、护士有护士执业证这些证有注册单位、有效期、定期考核记录。医院HR要操心哪个医生资格证快过期了这种合规问题。这是医院人事系统独有的模块普通企业完全没有。第三薪酬结构复杂。医院工资不是简单的基本工资绩效还包含岗位津贴、夜班补贴、科研奖励、扣缴医保公积金等。绩效又有科室二次分配的逻辑。你不需要做全套医院财务系统但薪资模块至少要能体现按职称、职务、班次计算薪资差异的逻辑。第四职称评聘与培训记录。医护人员的职称路径初级、中级、副高、正高对工资待遇影响很大培训学分也是硬性要求。系统里要有维护职称变更记录和能力培训记录的地方。3.2 角色和权限医院最讲究谁能看什么医院的敏感数据特别多员工薪资、体检结果、科室绩效。所以医院人力资源系统的权限模型比校园类系统要严格得多。我在设计的时候把角色划分为四类系统管理员拥有全部权限管理所有模块负责系统配置。人事专员负责员工档案录入、考勤管理、薪酬录入、调动管理但不应该有系统配置权限。科主任/护士长只能查看本科室人员的排班、考勤和绩效情况不能跨科室查看。普通员工只能查看自己的档案、工资条、排班与考勤记录。这个权限模型跑起来面试官问你怎么设计多角色访问控制时你就能从基于角色的访问控制模型RBAC切入讲清楚用户、角色、权限三级关联而不是支支吾吾说加了几个if判断。3.3 功能模块清单一个完整的业务闭环结合上面分析一套拿得出手的医院HRM系统至少应该包含这些功能模块员工档案管理基础信息、科室关联、岗位、职称、学历、证件、合同信息。科室管理科室树结构维护科室与科室主任的关联。排班管理按科室、按周生成排班表支持查询与调整。考勤管理记录出勤、迟到、早退、请假、加班对接排班数据。薪资管理工资项可配置按考勤和职称自动计算支持工资条查询。培训与资质管理培训记录、执业证有效期提醒。系统管理用户、角色、菜单权限、操作日志。每个模块之间不是孤立的。比如排班数据影响考勤考勤结果影响薪资计算薪资结果又关联员工档案里的职称信息。这一条数据流串起来系统的完整性和业务深度立刻体现出来了也足够支撑毕业论文的系统设计和系统实现两大章节。4. 数据库表结构设计把业务关系理清楚代码就成功了一半4.1 核心表设计思路医院HRM系统的表结构核心是围绕人—科室—时间三个维度展开。我在实际设计中用到了这样一组表基础数据维度hospital_dept科室表主键、部门名称、父部门ID、科室类型、负责人ID、创建时间。用parent_id关联自身形成树形结构。employee员工表员工号、姓名、性别、出生日期、身份证号、联系电话、学历、职称ID、岗位、入职时间、员工状态在职/离职、所属科室ID、合同到期日。title_level职称表职称名称、等级顺序用于后续薪资加权计算。业务过程维度schedule排班表科室ID、员工ID、排班日期、班次类型早班/夜班/值班/休息、发布状态。主键约束加唯一索引员工ID日期防止同一人同一天被排两个班时间重叠。attendance考勤表员工ID、考勤日期、上班打卡时间、下班打卡时间、考勤状态正常/迟到/早退/缺勤/请假/加班、审批人。salary薪资表员工ID、薪资月份、基本工资、绩效工资、补贴类字段、扣款项、实发工资、发放状态。salary_config薪资配置表项目名称如基本工资、夜班补贴计算类型固定金额/按次数等这样薪资计算规则是可以配置的而不是写死在Java代码里。系统管理维度sys_user用户表关联employee登录账号、密码BCrypt加密、状态。sys_role角色表、sys_menu菜单权限表、sys_user_role用户角色关联表、sys_role_menu角色菜单关联表。4.2 关键设计细节与踩过的坑有几个细节是实际开发中很容易踩坑的地方我在设计的时候特别做了处理员工编号不能直接用自增ID。自增ID容易暴露系统数据量而且医院场景下员工编号通常有业务含义比如入职年份序号。我采用的是EMP 入职年份 四位序号的方式比如EMP20250001。生成逻辑由Service层控制查重后落库。金额字段用DECIMAL(10,2)不用FLOAT/DOUBLE。这是老生常谈但每次都能看到有人踩坑。Float在Java中的精度问题会直接导致薪资计算结果不对比如3999.99变成了3999.989999而且这类Bug特别隐蔽。时间字段用datetime并统一存储时间戳。排班计算和考勤计算都涉及大范围日期比较建议采用统一时区存储如Asia/ShanghaiJDBC连接串必须带serverTimezoneAsia/Shanghai否则MySQL 8.x下会出现8小时时差问题。逻辑删除用deleted字段。员工离职、科室合并这类操作不要物理删除数据打一个标记位就行。这样统计历史报表时老员工数据还能追溯。MyBatis-Plus通过TableLogic注解就能优雅实现两行配置的事。一张表搞不定树形结构。科室需要树形展示最简单可靠的方式是ParentId路径编码。如果只存ParentId查询子科室要递归麻烦且低效。我额外加了一个ancestors字段保存祖先ID链如1,3,7查询某个节点下全部子科室时用FIND_IN_SET或LIKE直接搞定性能也不错。4.3 用ER模型倒推表设计一个实用的方法我设计表结构喜欢用一个倒推法先画出核心业务链条的关键页面原型从页面反推需要的数据字段再合并设计表结构。用这个方法你不太容易漏字段因为页面上的每一个输入框、每一个展示列都对应着表里的一个字段或一个关联查询结果。举个实际的例子——员工详情页决定employee表字段新增排班页决定schedule表字段工资条页决定salary表字段。这三个页面上还有下拉框如科室下拉列表那说明至少还有dept表和对应的外键关联。这样一轮推完表结构自然就完整了。5. 核心后端逻辑排班、考勤、薪资这三个模块怎么实现5.1 排班模块冲突检测是难点排班模块的功能逻辑并不复杂管理人员选择科室、选择周次、选择每人每天班次类型保存到schedule表。难在排班冲突校验。实际开发中我是在Service层做了双重校验同一员工同一天不能排两个班次唯一索引兜底 入库前查询校验。同一天同一科室必须有足够的医生和护士覆盖比如夜班必须至少有1名主治及以上医师这个校验可以做到科室配置表里。代码层面的实现我建议把排班记录表的主键设计为员工ID日期的组合。这样重复提交时即使应用层漏了判断数据库层也会抛异常阻断安全系数更高。5.2 考勤模块多数据源整合是本质考勤模块在真实系统里数据源是多样的门禁系统的打卡记录、排班表计划、请假审批记录。在毕设系统里我可以简化成管理员录入打卡时间系统结合排班计划自动判定状态。判定逻辑我建议这样设计排班表定义了应到班次比如8:00-16:00。实际打卡时间与班次开始时间做比较。晚于班次开始时间不多于30分钟记迟到多于30分钟且小于2小时记迟到2请假有审批单记请假无打卡记录记缺勤。这里有一个容易被忽略的点考勤状态是动态计算的还是存储的我的选择是状态字段存库但由定时任务或触发式任务批量刷新。因为薪资核算时不可能对每个人实时计算考勤汇总那样系统负担太大。月末跑批计算上月考勤把结果写入汇总表薪资模块直接读汇总就是最优解。5.3 薪资模块规则可配置计算可追溯薪资模块做得好的标准不是能算出工资而是每一分钱都能说清楚来源。我设计的计算方式是薪资配置表(salary_config)定义每个工资项的取值逻辑比如基本工资职称对应基准值、夜班补贴夜班次数*单次补贴。这样整个计算过程不再是代码里的一堆if-else而是通过一条薪资规则引擎简单的策略模式来驱动。计算时从员工表取基本信息。从考勤汇总表取加班、夜班次数。从职称表映射基本工资和岗位津贴。通过策略模式逐项叠加和扣减最终得出实发工资。这样设计的直接好处是论文里可以写本系统薪资模块采用策略模式实现可配置的计算流程新增薪资项时无需修改代码只需在配置表中维护计算规则。这种话在答辩时说出来是说到了设计模式落地的点子上含金量比课程设计级别的CRUD高出一大截。5.4 具体代码核心Service逻辑的思路示例我选排班冲突校验这段关键代码做个展示这类逻辑比较典型Service public class ScheduleService { /** * 校验员工排班时间冲突 * param employeeId 员工ID * param deptId 科室ID * param scheduleDate 排班日期 * param shiftType 班次类型 */ public void validateScheduleConflict(Long employeeId, Long deptId, LocalDate scheduleDate, String shiftType) { // 1. 校验同一员工同一天是否有已有排班 LambdaQueryWrapperSchedule wrapper new LambdaQueryWrapper(); wrapper.eq(Schedule::getEmployeeId, employeeId) .eq(Schedule::getScheduleDate, scheduleDate); Long count scheduleMapper.selectCount(wrapper); if (count 0) { throw new ServiceException(该员工当天已有排班记录不能重复排班); } // 2. 校验夜班必须覆盖至少一名主治及以上医师 if (NIGHT_SHIFT.equals(shiftType)) { validateNightShiftDoctorCoverage(deptId, scheduleDate); } } private void validateNightShiftDoctorCoverage(Long deptId, LocalDate date) { // 查当天该科室夜班已排人员中的最高职称 ListSchedule scheduledList scheduleMapper.selectNightScheduled(deptId, date); boolean hasSeniorDoctor scheduledList.stream() .anyMatch(s - s.getTitleLevel() SENIOR_DOCTOR_LEVEL); if (!hasSeniorDoctor) { throw new ServiceException(夜班必须至少安排一名主治及以上医师); } } }这种一个Service方法做一件事参数校验先行业务规则显式表达的写法就是企业级Java开发的日常形态。代码本身不难但结构清晰review你的人导师一眼就能看出你是用工程化的思维写代码而不是在写作业。6. 权限与安全落地Spring Security JWT的完整接法6.1 认证方案JWT的无状态设计医院人力资源管理系统我是坚决推荐用JWT做认证的因为这套系统是前后端分离的。JWT的核心价值在于无状态服务端不保存登录态JWT本身携带用户身份信息签名保证了完整性。Spring Boot和JWT的整合是标准流程我梳理一下关键链路用户登录后端校验用户名密码BCrypt加密比对。登录成功生成JWTHeader加密算法 Payload用户ID、角色、过期时间 Signature。前端将JWT存在localStorage或更安全的HttpOnly Cookie。后端通过OncePerRequestFilter JWT工具类实现自动登录放行白名单URL登录接口、验证码接口、静态资源。每个需要认证的请求SecurityContextHolder都能拿到当前用户的UserId。这个链路不复杂但代码组织结构很重要。在毕设里我习惯拆成三层JwtUtil负责Token生成、解析、过期验证。JwtAuthenticationFilter负责拦截请求、解析Token、把用户信息放入SecurityContext。SecurityConfig负责放行策略、密码加密器注册、规则过滤链配置。6.2 一个关键配置的细节放行Swagger和静态资源如果毕设里集成了Knife4jSwagger增强版你记得配置安全放行规则。很多人项目跑起来发现为什么接口文档打不开十有八九是Spring Security把接口文档的URL给拦了。经典放行路径至少要包含/doc.html /webjars/** /favicon.ico /v3/api-docs/swagger-config /v3/api-docs/**在SecurityConfig里显式配置为permitAll否则Swagger文档页面会一直报401或者403。这个细节不算难但确实是我看到频率最高的一个卡壳点。6.3 权限控制的粒度方法级注解权限控制我推荐在Controller层加方法级权限注解这是Spring Security最实在的用法PreAuthorize(hasRole(ADMIN) or hasRole(HR)) PostMapping(/employee) public Result addEmployee(RequestBody EmployeeDTO dto) { ... } PreAuthorize(hasRole(ADMIN)) DeleteMapping(/dept/{id}) public Result removeDept(PathVariable Long id) { ... }这种做法的价值是权限规则跟接口方法绑定在一起读代码的人可以直接看到每一个接口的安全要求不会出现到处散落着权限判断if的情况。而且对于论文写作来说你完全有底气写本系统采用Spring Security方法级安全控制配合角色权限表实现细粒度访问控制。6.4 密码安全BCrypt不能省我见过不少毕设源码直接明文存密码或者在MD5加盐上原地打转。明确说最高效安全的做法就是用BCrypt。Spring Security自带BCryptPasswordEncoder直接用即可。注册时encode密码登录时matches校验。完全复用官方组件安全性和代码量都优于自己造轮子。还有一个小提醒前端表单密码字段记得设置autocompletenew-password防止浏览器自动填充干扰测试后端要做密码复杂度校验长度、大小写、数字避免弱口令。这些细节在毕设答辩时被问到你的系统有什么安全性设计的时候都是很自然的加分回答点。7. 开发与部署实战从本地跑通到Docker部署的完整步骤7.1 本地开发环境的搭建清单我不推荐直接在Windows上面跑MySQL和Redis作为毕设最终环境纯粹是为了后续演示少出问题。但开始开发时本地环境必须齐备。我的开发环境清单是JDK 8或11我用的11Maven 3.6配置阿里云镜像加速依赖下载MySQL 5.7/8.0Navicat或DBeaver建库Redis 6.xWindows版直接解压即用IntelliJ IDEA社区版完全够用Postman或Apifox接口调试环境搭建有一个特别容易卡壳的地方Maven下载依赖极慢。解决办法是在settings.xml里配阿里云镜像加上一行配置就能解决。很多毕设时间都耗在等依赖下载上这步做完开发体验完全不同。7.2 项目初始化用Spring Initializr两分钟建好骨架在IDEA里直接选择Spring Initializr创建项目这步比我手写pom快得多。关键依赖这么选Spring Web构建RESTful接口。MySQL Driver数据库驱动。MyBatis-Plus在pom额外引入mybatis-plus-boot-starter3.5.x。Spring Security做认证授权如果嫌配置麻烦也可以后期再加。Lombok简化实体类。Validation参数校验。Java版本和Spring Boot版本选配套就基本不会出大问题。另外有个小建议项目字符编码、Maven编译级别明确配上UTF-8和11能省掉后面一堆中文乱码和编译报错的烦心事。7.3 MyBatis-Plus为什么毕设用它最省力MyBatis-Plus是MyBatis的增强工具核心价值就是单表CRUD零SQL。在毕设里员工表的增删改查、科室表的树查询、分页列表查询用它的BaseMapper和LambdaQueryWrapper几乎不用写一行XML SQL。我用一个例子演示它的分页查询写法public PageResultEmployeeVO pageEmployees(EmployeeQuery query) { PageEmployee page new Page(query.getPageNum(), query.getPageSize()); LambdaQueryWrapperEmployee wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(query.getName()), Employee::getName, query.getName()) .eq(query.getDeptId() ! null, Employee::getDeptId, query.getDeptId()) .eq(StringUtils.hasText(query.getStatus()), Employee::getStatus, query.getStatus()) .orderByDesc(Employee::getCreateTime); PageEmployee result employeeMapper.selectPage(page, wrapper); // 类型转换省略... return PageResult.of(result.getRecords(), result.getTotal()); }LambdaQueryWrapper最大的好处是条件构造是类型安全、编译期可检查的字段名写错了编译就直接报错。并且动态条件拼装非常自然不需要写一堆if (xxx ! null)来处理SQL拼接。这里要说一个分页插件的配置要点MyBatis-Plus的分页功能需要配置PaginationInnerInterceptor不加这个拦截器分页查询其实是假分页所有数据都查出来了内存截断。配置也很简单在配置类里注册一下即可。7.4 Docker部署一条命令拉起整个环境Docker部署Spring Boot项目是现在的标配技能而且我发现在毕设答辩现场做演示时用Docker Compose一键拉起有降维打击的效果。三个文件准备好DockerfileFROM openjdk:11-jre-slim WORKDIR /app COPY target/hospital-hrm-0.0.1-SNAPSHOT.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar, --spring.profiles.activeprod]docker-compose.ymlversion: 3.8 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: hospital_hrm ports: - 3306:3306 volumes: - ./sql:/docker-entrypoint-initdb.d redis: image: redis:6-alpine ports: - 6379:6379 app: build: . depends_on: - mysql - redis ports: - 8080:8080 environment: SPRING_PROFILES_ACTIVE: prodapplication-prod.yml里指向mysql和redis这两个服务名这是Docker Compose内部网络的主机名数据库连接串用jdbc:mysql://mysql:3306/hospital_hrm即可。第一次启动时./sql目录下的建库脚本会自动执行。演示的时候直接docker compose up -d几分钟后浏览器打开就能用效果很加分。7.5 部署时容易踩的三个坑端口占用Windows开发时8080端口很容易被占用netstat -ano | findstr 8080查完进程直接换端口比杀进程靠谱。MySQL 8.0时区问题连接串不带serverTimezone启动时必报Server returns invalid timezone异常这点我前面提过务必加上serverTimezoneAsia/ShanghaiuseUnicodetruecharacterEncodingutf8。Docker容器内连接宿主机的Redis/MySQL本机开发时连接地址用的是localhost到了Docker内部localhost指向的是容器本身而不是宿主机。要么用容器名要么用host.docker.internal这个细节不处理好容器起来了却报连不上数据库排查起来很令人崩溃。8. 论文与答辩怎么把工程成果发挥到最大价值8.1 论文结构建议从需求分析到测试的完整路径论文部分很多人的误区是写代码设计怎么实现写得过多而业务需求分析写得过少。但对于毕业设计论文需求分析、系统设计才是答辩老师最看重的两块。我的论文结构建议是绪论背景、意义、国内外研究现状、论文结构相关技术介绍Spring Boot、MyBatis-Plus、Spring Security、JWT、Redis需求分析功能性需求、非功能性需求、用例分析系统设计架构设计、功能模块设计、数据库设计、接口设计系统实现核心模块的实现细节、核心代码、效果页面截图系统测试功能测试、性能测试、测试结论总结与展望这里有一个录取通知书级别的技巧把数据库表和时序图画好。E-R图、用例图、系统架构图这些图做好看论文在形式层面就很能打。这也解释了为什么我前面花了那么大篇幅去理清表结构——它们最后都会变成论文里的核心素材。8.2 答辩开场如何讲述你的项目答辩时5分钟的项目介绍我的建议是一个故事讲完一条主线。开头一句点题我们设计的是一套面向医院场景的人力资源管理系统重点解决医护人员排班复杂、考勤规则多样和薪酬核算繁重的问题。然后按这个顺序讲系统采用Spring Boot Vue/Thymeleaf实现整体基于B/S架构。核心模块包括员工档案、科室管理、排班、考勤、薪资与系统管理。在技术上我重点实现了基于Spring Security JWT的权限控制以及基于MyBatis-Plus的数据持久化。重点功能的实现逻辑比如排班冲突检测、考勤自动判定、薪资可配置计算。最后简要展示系统的运行效果并总结遇到的问题和解决办法。8.3 答辩必问的问题与应对思路以下高频问题提前准备好基本都能接住为什么用Spring Boot答Spring Boot简化了Spring的配置内置了Tomcat同时提供了丰富的Starters让我们能快速构建独立运行的微服务应用降低了开发成本适合快速落地。你的Session管理和JWT比有什么优劣答JWT无状态、可扩展性好适合前后端分离。会话挂在服务端内存在集群环境下要处理Session同步问题而JWT天然跨节点共享。数据库为什么这么设计第三范式不是要求消除冗余吗答第三范式适用于OLTP场景而在报表统计场景下适当冗余可以大幅提升查询效率采用反范式设计是工程实践中的常见选择。考勤状态和薪资计算如果对不上怎么处理答本系统薪资计算固定读取上月最终考勤汇总表考勤若有修订先更新汇总表再触发薪资重算。这保证了读取数据的一致性。答辩时切忌背稿但主线、概念、案例都要烂熟于心。你做得越扎实讲起来就越自然。毕设不只是一份源码它是一个你作为开发者的完整交付物——从需求抽象、技术选型到编码实现、测试部署走完这一圈你的工程能力会有一个肉眼可见的提升。
返回列表