基于SpringBoot的人事管理系统设计与实现:从技术选型到答辩全攻略
2026/8/30 3:28:37 网站建设 项目流程

简介:在企业级应用开发中,SpringBoot凭借其简化的配置、自动装配机制和内置容器,已成为后端工程师必须掌握的核心框架。它大幅降低了项目搭建与部署的门槛,让开发者能更专注于业务逻辑本身。通过结合MyBatis-Plus实现高效的数据持久化,配合JWT与Spring Security完成无状态认证和细粒度权限控制,即可构建一套稳定可扩展的管理系统。人事管理系统正是这一技术栈的绝佳实践场景,它围绕员工、部门、考勤、薪资等核心业务,覆盖了增删改查、分页检索、Excel导入导出、树形结构处理等主流开发需求,既能锻炼全栈工程能力,也是毕业设计与求职项目的常见选择。本文以该选题为线索,完整梳理了从技术选型、数据库设计、后端分层实现到论文撰写与答辩准备的实践路径,为正在规划相关系统开发的同学提供可复用的参考方案。 现在很多同学都在做SpringBoot方向的人事管理系统作为毕业设计或者求职项目,这确实是个务实的选择。SpringBoot本身在企业级应用里普及率极高,人事管理又覆盖了增删改查、权限控制、文件上传、报表导出这些最常见的业务场景,做一遍等于把后端开发的核心能力都过了一遍,简历上和答辩时都有东西可讲。这篇就基于我前阵子带一个学弟完整梳理这套系统的过程,把设计和落地思路讲清楚,顺带把踩过的坑和论文写作的关键点都写进去,给正准备动手的人一个可以直接参考的路径。

1. 项目整体设计与技术选型

1.1 为什么这个选题适合拿来练手和毕业设计

选人事管理系统当开发项目,最大的好处是业务边界清晰。不像电商系统那样要面对商品、订单、库存、支付这些复杂链路,人事管理系统的核心就是围绕“人”和“组织”这两条线展开,员工信息管理、部门结构维护、考勤记录、薪资核算、公告发布,每个模块单独拆出来都是标准的CRUD场景,组合起来又能串成一条完整的业务流。

从工作量角度看,这个选题也比较好控制。一个人在三到四个月里完全可以完成从需求分析、数据库设计、编码实现到论文撰写的完整流程。数据库不复杂,核心表控制在十张以内就够用;接口层面没有太复杂的状态机流转;前端界面如果不用太花哨的设计,精力可以大部分放在后端逻辑上。相比之下,如果你去选一个类似“基于微服务的某某系统”,光是把服务拆分、注册中心、配置中心、网关这套基础设施跑通就得耗费大量时间,真正做业务逻辑的精力反而被挤占了。

从答辩角度来说,SpringBoot人事管理系统也容易讲清楚。评审老师一般关注三件事:你做的系统是否能跑起来、核心功能是否完整、你对关键技术点的理解是否到位。这三件事在这个项目里都能做到可控。

1.2 技术栈选型的取舍逻辑

先直接给出一套稳妥的、适合绝大多数人的技术栈组合:

层面技术选型说明
后端框架Spring Boot 2.7.x稳定版本,资料多,配套的第三方库兼容性好
持久层MyBatis-Plus单表CRUD几乎不用写SQL,自带分页插件
数据库MySQL 5.7 / 8.0主流关系型数据库,简历上必备
权限认证Spring Security + JWT无状态Token认证,前后端分离场景下的标准方案
接口文档Knife4j(Swagger增强版)自动生成接口文档,答辩演示效果好
前端Vue 2 + Element UI组件化开发效率高,表格、表单、弹窗都有现成组件
构建工具Maven大多数项目的标配,没必要在毕设阶段折腾Gradle

这套方案里,核心的决策点是两个:持久层选MyBatis-Plus而不是纯MyBatis,权限认证选JWT而不是传统的Session。选MyBatis-Plus的原因很直接,它的BaseMapper接口自带selectByIdselectPageinsertupdateById这些基础方法,你在毕设阶段写的最多的就是单表CRUD,这些方法直接帮你省掉了一大半的SQL编写量,而且它的分页插件用起来非常顺,Page对象直接返回给前端,都不用自己封装。至于为什么不用Spring Data JPA,原因也简单,JPA的查询和映射机制对初学者来说不够直观,你很难一眼看出它会生成什么SQL,出了问题排查起来也更费劲。

权限认证选JWT是基于前后端分离的架构来的。后端只需要在用户登录成功后签发一个Token,前端请求接口时把它放在请求头里,后端通过拦截器或者过滤器统一校验Token的合法性。这样做的好处是服务端不保存用户登录状态,天然支持横向扩展,如果你后面想把系统部署到多台服务器上,不需要额外做Session共享。当然,JWT也有它的短板,最主要的是无法主动让Token失效,对于人事系统这种低并发、权限要求不太苛刻的场景,完全够用。

1.3 功能模块怎么划分才合理

人事管理系统的功能模块划分,直接影响后面的数据库设计和代码结构。我建议按下面这套思路来划分,它基本覆盖了中小型企业人事部门的核心需求:

  • 系统登录与用户管理:登录、退出、修改密码,用户账号的创建和禁用
  • 部门管理:部门信息的增删改查,支持多级部门树形结构
  • 员工管理:员工基本信息的维护,包括姓名、性别、手机号、学历、入职时间、岗位等,支持条件检索和Excel导入导出
  • 考勤管理:维护员工的出勤记录,支持按月份查看考勤统计
  • 薪资管理:按员工岗位和基本工资生成薪资记录,支持调整和查看
  • 公告管理:发布和查看公司内部公告,公告列表分页展示

这套模块的设计逻辑是:员工和部门是核心主数据,考勤和薪资是围绕员工产生的业务数据,公告是系统内的信息流通渠道,用户管理则是系统本身的基础设施。虽然功能看着传统,但在源码层面仍有优化空间:比如你可以把员工管理做成支持批量导入导出,把考勤管理做成导入Excel后自动生成月度统计报表,这些点写进论文里会显得工作更有厚度。

2. 核心功能实现与关键细节

2.1 登录认证与权限控制

登录模块做得好不好,直接影响评委对系统整体的第一印象。实现路径是这样:用户提交用户名和密码,后端用BCryptPasswordEncoder校验密码,比对通过后生成一个包含用户ID、用户名、角色信息的JWT Token返回给前端。前端把Token存在localStorage里,之后每次请求都通过Axios的请求拦截器在请求头里带上Authorization: Bearer ${token}

权限控制这块,用Spring Security的@PreAuthorize("hasRole('ADMIN')")注解就能很好地控制接口访问权限。实现时要注意几个细节:

  • 自定义UserDetailsService来从数据库加载用户信息,而不是用默认的内存用户
  • 配置一个SecurityFilterChain来放行登录接口、静态资源和Swagger文档,其余接口都需要认证
  • 添加一个JwtAuthenticationFilter继承OncePerRequestFilter,在每个请求进来时解析Token,把用户信息放到SecurityContextHolder
  • 处理异常时自定义AuthenticationEntryPointAccessDeniedHandler,否则前端拿到的是默认的403页面,而不是友好的JSON提示

另一个容易被忽略的细节是密码存储。毕设项目里很多人图省事直接用明文存数据库,这个在答辩时几乎必被问到。用BCryptPasswordEncoder加密很轻松,加密后的字符串里包含随机盐值,同一个密码每次加密的结果都不一样,安全性比MD5加固定盐要稳妥得多。

2.2 员工管理模块的实现要点

员工管理是整个系统里代码量最大的模块,也是最能展示编码能力的地方。它本质上是一个多条件分页查询,但实现时能看到的层次感会明显不同:

  • Controller层:接收查询参数和分页参数,调用Service层方法,返回统一的结果封装
  • Service层:拼接查询条件,调用Mapper层进行分页查询
  • Mapper层:使用LambdaQueryWrapper构建动态查询条件,比如当员工姓名不为空时加上like条件,当部门ID不为空时加上eq条件

QueryWrapper的动态条件拼接能力是MyBatis-Plus里非常实用的一环,你不需要用<if>标签在XML里写一堆判断,代码干净很多。

员工模块另一个加分项是Excel导入导出。用EasyExcel这个库,导入时只需要定义和Excel列对应的实体类,然后用EasyExcel.read()配合一个数据监听器逐行读取,几行代码就能完成批量导入。导出时用EasyExcel.write(outputStream, Employee.class).sheet("员工信息").doWrite(list)就能把查询到的列表直接写入Excel。这个功能做完,要记得在答辩时提一句“数据导入采用EasyExcel实现”,很多老师对实际的项目效率提效点会比较感兴趣。

2.3 部门树形结构的两种实现方式

部门管理的核心难点是如何处理层级关系,以及前端怎么把扁平数据渲染成树形结构。最常规的做法是在department表里设计一个parent_id字段来表示上级部门,根部门的parent_id为0。查询时一次性把所有部门查出来,然后在内存中组装成树形结构。

组装树的代码并不难:先建立一个Map存放所有部门,key是部门ID,然后遍历列表,把当前部门挂到父部门的children列表下。如果你的部门层级比较深,也可以用递归查询的方式一层层往下查,但这样会执行多次SQL,效率上不如一次性查询后在内存中组装。考虑到人事系统部门数量一般不会超过几百个,一次性查询再组装树是最合理的方案。前端拿到树形数据后,用Element UI的el-tree组件直接渲染,或者在下拉选择框里用el-cascader实现级联选择,非常省事。

2.4 考勤与薪资模块的计算逻辑

考勤和薪资模块虽然也是CRUD,但如果能把计算逻辑写得清晰,论文内容会丰富很多。考勤模块的核心数据结构是:attendance表包含日期、员工ID、上班打卡时间、下班打卡时间、状态(正常、迟到、早退、缺勤),实现时用LocalDateTime记录打卡时间,根据部门设定的上班时间和下班时间来判断状态,默认可以写一个AttendanceCalculator组件来处理这块逻辑。

薪资模块可以做一个自动生成功能:用户选择月份后,系统根据员工的基础工资、岗位工资、考勤扣款计算出当月实发工资,并生成一条薪资记录。考勤扣款计算会用到前面考勤模块的数据,这就是模块之间天然的业务关联,写论文时可以用一张数据流转图把“考勤数据到薪资计算”的关联性画出来,会让系统整体逻辑显得更高级。

3. 数据库设计与底层安全机制

3.1 核心表结构设计与关联关系

数据库设计是论文里篇幅很大的部分,也是很多同学容易偷懒的地方。设计时建议遵循“宁可表结构清晰,不要过度冗余”原则。下面给出和上面功能模块对应的核心表设计:

表名核心字段说明
sys_userid, username, password, real_name, role_id, status系统用户表,关联角色表
sys_roleid, role_name, role_key角色表,如ADMIN、HR、EMPLOYEE
departmentid, parent_id, name, leader, phone部门表,用parent_id实现树形结构
employeeid, emp_no, name, gender, dept_id, position, phone, email, entry_date员工表,关联部门表
attendanceid, emp_id, work_date, clock_in_time, clock_out_time, status考勤表,关联员工表
salaryid, emp_id, month, base_salary, post_salary, attendance_deduct, total_salary薪资表,一个员工一个月一条记录
noticeid, title, content, create_time, publisher公告表

表之间用外键不是必须的,但强烈建议在employee.dept_idattendance.emp_idsalary.emp_id这些字段上加上普通索引。原因很简单,系统跑起来后最频繁的查询就是按员工或部门查考勤、查薪资,如果没有索引,随着数据量增大查询会越来越慢。用MySQL的EXPLAIN命令看一下执行计划,你就知道加索引前后的差距了。关于索引这个点,答辩时深问的概率非常高,务必提前准备好。

3.2 密码加密与数据脱敏

密码加密在上文已经提过用BCryptPasswordEncoder。数据脱敏这块,很多同学容易漏掉的是员工的手机号、身份证号这类敏感信息。不要直接在前端页面上完整展示手机号,可以在返回数据时做一下脱敏处理,比如中间四位用*代替。实现方式是在实体类的getter方法里做处理,或者用Jackson的@JsonSerialize注解指定一个脱敏序列化器。写论文时把“用户隐私保护”作为一个小节来写,安全性章节会更有内容。

3.3 防SQL注入与XSS攻击

SpringBoot项目防SQL注入相对简单,MyBatis的#{}自带的预编译机制已经解决了大部分SQL注入风险。你要注意的是不要在代码里用字符串拼接SQL去写${},如果某些动态排序场景确实需要${},必须做白名单校验,只允许传ascdesc之类的固定值。

XSS攻击防护需要前后端配合。后端可以在Filter里对请求参数做HTML标签转义,把<script>这类关键字替换掉;前端用Vue自带的数据绑定机制其实已经过滤了一部分XSS风险,但对于v-html绑定内容要格外小心,如果公告里的内容支持富文本编辑器,v-html是必须用的,这时后端就必须做白名单过滤,不能把可执行的脚本存进数据库。建议使用Jsoupclean方法或OWASP的HtmlSanitizer来过滤富文本内容。

4. 实操过程与源码调试经验

4.1 从零初始化一个新项目

创建工程的时候,最容易踩的坑是SpringBoot版本选择。我见过有同学直接选了最新的Spring Boot 3.x版本,结果发现很多第三方库还没适配,JDK也要求17及以上,遇到问题去搜解决方案,一大半的资料还基于Spring Boot 2.x,最后只能推倒重来。这里我建议:除非你有特殊原因,否则统一选Spring Boot 2.7.x + JDK 1.8,这是目前兼容性最好、参考资料最多的组合,能够切实减少你在版本兼容问题上消耗的大量时间。

初始化方式有两种:一种是直接访问start.spring.io网站,勾选需要的依赖生成一个压缩包再导入IDEA,另一种是在IDEA里新建Spring Initializr项目。两种方式本质是一样的。创建时建议勾上这些依赖:Web、Spring Security、MyBatis-Plus(这个网站里没有,需要后面手动加依赖)、MySQL Driver、Validation、Lombok。

4.2 application.yml配置的最佳实践

配置文件是项目的入口关键,我第一次给学弟排错时发现他卡在了数据库连不上,后来发现是把配置写错了位置。这里直接给出一份标准配置:

server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hr_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: 你自己的密码 servlet: multipart: max-file-size: 10MB max-request-size: 10MB mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0 jwt: secret: 自己的加解密秘钥,至少32位 expiration: 86400000

有几个点要注意:serverTimezone=Asia/Shanghai是解决数据库和本地时区不一致导致的时间差问题的关键参数,漏了的话你会看到所有时间都比正常时间早8小时;MySQL 8.x的驱动类是com.mysql.cj.jdbc.Driver,5.x是com.mysql.jdbc.Driver,千万别配错;MyBatis-Plus的log-impl配置在开发阶段一定要开着,它能让你看到控制台打印的每条SQL语句,对接口调试帮助很大。

4.3 代码分层结构与目录组织

代码分层的清晰程度是评审老师最看重的维度之一。一个标准的SpringBoot项目的包结构应该这样组织:

com.example.hr ├── controller // 接口层,只做参数接收和结果返回 ├── service // 业务逻辑层,接口加实现类 │ └── impl ├── mapper // 数据访问层,继承BaseMapper ├── entity // 实体类,对应数据库表 ├── dto // 数据传递对象 ├── vo // 视图对象,返回给前端的结构 ├── config // 配置类,如SecurityConfig、MybatisPlusConfig ├── common // 通用工具,如Result封装、异常处理、常量类 ├── filter // 过滤器,如JwtAuthenticationFilter └── exception // 全局异常处理

Controller层里做的只是参数校验,比如用@Validated注解校验DTO里的字段格式,然后调用Service层方法,把结果放到统一的Result<T>封装里返回。Service层承载实际的业务逻辑,比如员工查询时判断权限、薪资生成时计算考勤扣款。Mapper层只负责数据访问,不要在里面写业务代码。这样分层的核心好处是职责单一、便于测试,论文里画包结构图也就有了素材。

4.4 全局异常处理与统一返回格式

在真实开发中,全局异常处理是必不可少的一环。实现方式很简单:定义一个GlobalExceptionHandler类,标注@RestControllerAdvice注解,然后为不同异常类型编写处理方法:

  • @ExceptionHandler(BusinessException.class)处理自定义的业务异常
  • @ExceptionHandler(MethodArgumentNotValidException.class)处理参数校验失败
  • @ExceptionHandler(Exception.class)兜底处理未预料的异常

统一返回格式可以设计成Result<T>类,包含code(状态码)、message(提示信息)、data(业务数据)三个字段。所有接口返回这个对象,前端就可以在Axios的响应拦截器里统一判断code是否为200,不是则弹出提示信息。这样做的直接好处是前后端接口风格一致,之后写接口文档时也变得非常清晰。

4.5 源码调试时的常见启动失败排查

刚把项目拉下来运行时,大概率会遇到几个经典的启动问题,我把排查思路整理成了一张速查表:

现象原因分析解决办法
启动报Failed to configure a DataSource数据库配置缺失或连接不上检查application.yml里的url、用户名、密码,以及数据库服务是否启动
启动报Consider defining a bean of type 'xxxMapper'Mapper接口没有被扫描到在启动类上加@MapperScan("com.example.hr.mapper")注解
启动报Invalid bound statement (not found)没有指定Mapper XML文件位置检查MyBatis-Plus配置mapper-locations: classpath*:mapper/*.xml
java.lang.IllegalArgumentException: Could not resolve placeholder 'jwt.secret'配置文件里的占位符没找到确认配置文件的key和@Value注解里的引用路径一致
登录后接口返回401JWT过滤器没有放行登录接口在SecurityConfig的permitAll()里加上登录相关的URL

如果启动时报“找不到主类”或者依赖下载不下来,那就是Maven环境问题,优先检查IDEA里的Maven配置是否指向了你本地安装的Maven路径,以及settings.xml里的镜像仓库是否配置了阿里云镜像,国内直接访问Maven中央仓库经常超时。

5. 论文撰写与答辩准备要点

5.1 论文的结构安排与文字技巧

很多同学代码做得不错,但论文写得像流水账,甚至直接把代码贴进去了,这其实是个误区。论文不是代码的堆叠,而是你“为什么做、怎么做、做出什么效果”的系统梳理。一篇完整的人事管理系统论文,结构可以这样安排:

  • 第一章 绪论:介绍人事管理系统的背景和意义、国内外研究现状、论文主要工作
  • 第二章 相关技术介绍:SpringBoot、MyBatis-Plus、Vue、MySQL、JWT等技术的简介和选型理由
  • 第三章 系统分析:可行性分析、需求分析(功能需求和非功能需求)、用例图
  • 第四章 系统设计:总体架构设计、功能模块设计、数据库设计(E-R图和表结构)
  • 第五章 系统实现:每个功能模块的实现思路和核心代码片段、截图展示
  • 第六章 系统测试:测试用例设计、测试结果分析
  • 第七章 总结与展望

技术介绍那一章,不要通篇从百度百科复制,一定要在描述完技术后加上一句“在本系统中,该技术用于XX模块,起到了XX作用”,这句话能让评审老师觉得你是真的理解了技术而不是在抄书,对降低查重率也有帮助。

5.2 论文图表不会画怎么办

论文里最必要的三张图是系统架构图、功能模块图、数据库E-R图。如果你不会用专业的画图软件,用PowerPoint画就足够了,选一些简洁的图形,用连接线条把方框连起来,导出为高清图片插入论文,比用某些网页工具生成的花哨图示更清爽。E-R图用PowerPoint里的椭圆和矩形框也能画,唯一要注意的是实体关系用菱形框表示、属性用椭圆表示,这种规范的E-R图画法比随手画的一个表格连线图要专业很多。

5.3 答辩常见的12个追问与应对策略

答辩是整个毕设最后的一道坎,人事管理系统方向的老师通常会围绕下面几个方向追问,提前准备对答起来会比较从容:

  1. “为什么选SpringBoot而不是传统的SSM?”答:SpringBoot简化了配置和部署,内置Tomcat,生态成熟,社区资料多,现在企业里也基本都是SpringBoot为主。
  2. “SpringBoot的自动配置原理是什么?”答:@SpringBootApplication里的@EnableAutoConfiguration通过spring.factories里的自动配置类,根据条件注解@ConditionalOnClass等来决定是否生效。
  3. “解释一下JWT的组成,它相比Session有什么优势?”答:JWT包含Header、Payload、Signature三部分,服务端不存状态,天然支持分布式,但无法主动失效,安全性取决于密钥管理。
  4. “MyBatis-Plus的分页插件怎么实现?”答:它基于Page对象和PaginationInnerInterceptor,底层在执行查询前自动拼接LIMIT语句,原理是拦截器在SQL执行前对语句进行改写。
  5. “数据库里为什么要加索引?加索引有什么代价?”答:索引能加速查询,但会占用额外存储空间,并且增删改时要维护索引结构,所以不是越多越好。
  6. “如果用户量增长到几万人,系统哪些地方会出现瓶颈?”答:数据库连接池、SQL查询效率、文件存储、服务器单点压力等,可以提引入Redis做缓存、加消息队列削峰等手段。(知道思路即可)
  7. “考勤扣款的计算逻辑是什么?”答:根据考勤状态对应的扣款规则(如一次迟到扣多少钱)进行计算,这个规则在Service层集中管理,便于后续调整。
  8. “你做的Excel导入用的是什么库,底层原理是什么?”答:用的阿里的EasyExcel,底层基于POI封装,但通过流式读取降低了内存占用,大数据量导入时性能更好。
  9. “你这个系统安全性方面做了哪些措施?”答:密码BCrypt加密存储、JWT鉴权、基于角色的接口访问控制、SQL预编译、XSS过滤、敏感数据脱敏。
  10. “Spring Boot 2.x和3.x有什么区别?”答:3.x基于Spring Framework 6,要求JDK 17+,用了Jakarta EE命名空间(javax变成jakarta),部分第三方库需要适配新版本。
  11. “SpringBoot和SpringCloud是什么关系?”答:SpringBoot是快速构建单个微服务的框架,SpringCloud是在SpringBoot基础上提供一套完整的微服务治理解决方案(服务注册发现、配置中心、网关、断路器)。
  12. “你项目的难点是什么?如果某天产品方要求加一个权限按钮级别的控制,怎么改?”答:可以把权限从角色粒度细化到菜单/按钮权限,数据库增加权限表,配合@PreAuthorize按权限标识符控制,前端做按钮级v-if控制。

这些问题不需要背到一字不差,但核心逻辑一定要能讲明白。面试官和老师最反感的是“代码一看就是抄的,问了几个点全不会”的状态。

5.4 演示环节怎么准备更稳

答辩演示的时间通常只有5到10分钟,提前准备一个演示脚本很重要。我建议的演示顺序是:先登录系统,展示员工管理模块的查询和新增效果;再进入部门管理,展示树形结构;然后演示一次Excel导入导出,让老师看到实际数据的批量处理能力;最后可以展示一下Swagger接口文档页面,瞬间把系统的工程化细节拉满。每次演示前都要保证示例数据是完整的,有图标、有公告、有员工数据,别在老师面前出现“暂无数据”的空页面。

6. 常见问题与排查技巧实录

6.1 IDEA新建项目时找不到SpringBoot版本

现在IDEA里自动从Spring Initializr拉取版本列表,有时会显示不了最新版本选项。遇到这种情况不用着急,直接在start.spring.io网站页面左侧把Spring Boot版本改成2.7.18,生成项目后下载导入IDEA就行。如果你发现无论如何都连不上start.spring.io(有时候是网络原因),可以在IDEA设置里把HTTP代理配置一下,或者直接用阿里云的初始化地址https://start.aliyun.com

6.2 SpringBoot版本太高导致的依赖兼容问题

这些年越来越多同学直接选Spring Boot 3.4.x,但配套的很多依赖会遇上兼容问题。如果你确实用了高版本,要注意两个点:MySQL驱动要选com.mysql.cj.jdbc.Driver,MyBatis-Plus要用3.5.3以上版本才支持,Swagger相关的springfox基本不维护了,建议直接改用knife4j-openapi3-jakarta-spring-boot-starter。如果中间遇到某些包需要javax标准而高版本用jakarta标准,就会出现ClassNotFoundException,这一块很容易让人卡住。

6.3 前端访问后端接口时跨域报错

前后端分离项目跨域问题几乎人人会遇到。解决办法在后端添加一个CORS配置类,实现WebMvcConfigurer接口,重写addCorsMappings方法,允许前端地址(比如http://localhost:8081)的请求:

@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true) .maxAge(3600); } }

其中allowedOriginPatterns("*")这里的*表示允许所有来源,生产环境建议换成具体的前端域名。另外,如果配置了Spring Security,CORS配置必须在Security的过滤链之前生效,否则预检请求(OPTIONS请求)会被拦截。

6.4 Docker部署SpringBoot项目时资源路径问题

如果要让项目在服务器上跑起来,不建议直接java -jar裸奔,用Docker更规范也更方便。写一个Dockerfile挂载jar包:

FROM openjdk:8-jre-alpine COPY target/hr-system.jar /app/hr-system.jar WORKDIR /app EXPOSE 8080 ENTRYPOINT ["java", "-jar", "hr-system.jar", "--spring.profiles.active=prod"]

部署时注意把数据库连接配置放到生产环境的application-prod.yml里,通过--spring.profiles.active=prod切换,避免把本地的数据库账号密码打进镜像。

6.5 系统移植到其他电脑时的数据库版本问题

毕设提交的时候经常要换电脑演示,这里有个很典型的坑:你在自己电脑上用的MySQL 5.7,到教室电脑上装了MySQL 8.0,结果发现数据库连不上。原因是MySQL 8.0默认用的是caching_sha2_password认证方式,而旧的驱动或代码里用的连接方式不支持。解决办法:要么在部署环境统一用MySQL 8.0,要么在8.0里把用户的认证插件改回mysql_native_password

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;

另外要注意字符集问题,建库时尽量指定utf8mb4字符集,避免导入数据时遇到中文乱码或emoji用户名无法存储的尴尬情况:

CREATE DATABASE hr_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

6.6 控制台打印的SQL和日志怎么看

开发阶段一定要把MyBatis-Plus的SQL日志打开,就是前面配置文件里写的那行log-impl: org.apache.ibatis.logging.stdout.StdOutImpl。当接口返回的数据不对时,先看控制台打印的SQL语句是不是符合预期,重点检查WHERE条件有没有错、参数是否传进去、有没有把全部数据都查出来了。大多数查询问题看SQL就能定位个八九不离十。如果SQL正确但返回结果不对,再去看实体类字段和数据库表字段的映射关系,MyBatis-Plus默认开启驼峰映射,比如Java里的createTime映射到数据库的create_time,这块基本不用操心。

最后的经验总结

这个项目从选型到最终跑通,我用下来最大的感受是:SpringBoot人事管理系统并不是一个“玩具级”的题目,如果认真做,里面涉及的技能点在求职面试中非常实用。你提前把JWT认证、Excel处理、权限控制、分页优化这些细节做好了,后续换任何业务场景都能复用同一套方法论。唯一要提醒的是别贪多,先把基础功能做扎实,再考虑加工作流、公告推送这些额外功能。项目跑通之后,我建议你把整个系统从建库到部署完整再走一遍,最好能在另一台电脑上克隆下来独立跑通,这样演示、提交、答辩都会从容很多。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询