ARTICLE DETAIL

资讯详情

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

SpringBoot+Vue人事系统毕设源码拆解:从环境搭建到答辩技巧

SpringBoot+Vue人事系统毕设源码拆解:从环境搭建到答辩技巧 聊到Java方向的毕业设计和课程设计SpringBootVue这套前后端分离组合几乎已经成了默认答案而人事系统管理平台又是其中被问得最多的源码之一。这套项目用Java写后端接口用Vue写管理界面数据统一存到MySQL整体结构清晰难度正好卡在“学生自己能看懂”和“老师觉得有工作量”这个区间。我最近帮几个学弟学妹排查过同名源码里面既有值得学习的写法也有不少容易翻车的坑今天把拆解过程完整写出来给正在找参考的你一点实在的东西。如果你正在为毕设选题发愁或者刚学完Java基础想找个项目练手这套人事系统都是很合适的切入点。它不只是一堆增删改查拼凑而是把权限、部门、员工、考勤、薪资这些真实业务串在了一起。这篇内容会从整体设计开始拆一路拆到你能自己把项目跑起来再到答辩现场能跟老师讲清楚每个模块为什么这么写。1. 项目整体设计与技术选型思路1.1 人事系统到底在解决什么问题人事系统在真实企业和毕设课设里的定位是典型的“业务管理系统”。它解决的核心问题很简单让公司不用靠Excel和纸质表管理员工而是把员工档案、部门结构、考勤记录、薪资发放这些信息统一放到一个系统里按权限管理按流程走。具体到这套源码功能一般会拆成这样几块系统管理用户登录、角色管理、菜单权限、操作日志组织管理部门维护、员工档案、岗位信息业务管理考勤打卡记录、请假补卡、薪资核算数据统计员工人数、部门分布、月度薪资汇总为什么人事系统适合当毕设因为它的业务复杂度不高不低刚好能覆盖增删改查之外的几个关键点。你要做权限控制它有登录和角色你要做多表关联查询它有员工和部门你要做条件筛选它有按时间查询考勤、按月查询薪资。把这些功能讲清楚答辩时的素材就够用了。1.2 为什么毕设/课设最常选 SpringBoot Vue MySQL很多学生问过我用SSM行不行用JSP行不行用Python配Django行不行。答案是都行但为什么Java方向的主流推荐是SpringBootVueMySQL核心原因有几个。第一SpringBoot让后端开发的门槛降下来了。SSM时代要配一堆XMLSpringBoot把Tomcat内置、把各种starter封装好你写好Controller、Service、Mapper三层启动一个main方法就能跑。对于课设周期紧张的人来说这是决定性的优势。而且SpringBoot生态足够成熟遇到任何问题都能搜到解决方案。第二Vue组件化开发适合管理后台。人事系统这类项目页面高度重复左边菜单、顶部导航、中间表格每个页面几乎都是列表加表单。用Vue写一个可复用的表格组件、表单组件之后后面每个模块就是套用和改字段开发效率比传统JSP高太多。同时Vue的数据双向绑定也让“编辑员工回显”这类操作变得非常直观。第三MySQL是学习和部署成本最低的数据库之一。相比Oracle动辄几个G的安装包和复杂的环境配置MySQL安装简单、免费、语法通用简历上写“熟练使用MySQL”也比写其他小众数据库更有说服力。学校机房、自己电脑、云服务器上都能跑不会在环境上卡住太久。1.3 功能模块划分学完能掌握哪些硬技能这套源码如果你不是直接拿来交作业而是真的动手拆一遍至少能学到以下几层东西。第一层是基础Web技能SpringBoot请求接收、参数校验、返回统一结果Vue路由跳转、Axios请求封装、组件传值。这些是找实习时最常被问的。第二层是工程化技能Maven多模块或单模块管理依赖application.yml分环境配置前端打包后怎么部署到Nginx。第三层是业务设计技能多表数据怎么组织什么是逻辑删除金额字段为什么用Decimal而不用DoubleBCrypt加密密码和明文密码的差别。还有很重要的一点这套项目里通常包含分页查询。分页是几乎所有后台管理系统都绕不开的动作老师也很喜欢问“你的分页是怎么实现的”。用MyBatis-Plus接分页插件是主流做法稍微老一点的源码会用PageHelper或手写limit。不管哪种你都应该知道当前端传了currentPage和pageSize后端怎么把总数和列表一起返回。2. 数据库设计与核心业务逻辑2.1 表怎么拆用户、部门、员工、考勤、薪资看源码第一步不是看代码而是看数据库脚本。人事系统的表结构一般围绕这样几个核心实体展开你拿到任何一套源码先看这几张表是否齐全基本就能判断这个项目的完整度。第一张是用户表sys_user管的是“谁能登录系统”。和第二张角色表sys_role通常是一对一或者一对多。用户表不要和员工表混在一起原因很简单管理员可能不是一个真实员工而员工也不一定有系统登录账号。个人建议是把登录账号体系和员工档案分开设计这是企业开发里的常见习惯。第二张是部门表dept字段一般有部门id、部门名称、上级部门id、负责人、创建时间。部门表最常见的坑是父子关系无限套娃比如总部下面有研发部、研发部下面有前端组。如果源码里只有parent_id没有维护层级路径你就得在Java代码里递归遍历这块经常是课设里的加分点。第三张是员工表employee字段包括员工编号、姓名、性别、出生日期、部门id、岗位、手机号、邮箱、入职时间、离职时间、状态。员工编号emp_no在真实系统里是唯一且有一定规则的前缀编号源码里至少应该给这个字段加唯一索引。第四张是考勤表attendance记录某人某天上班打卡时间、下班打卡时间、考勤状态。第五张是薪资表salary记录某人某月基本工资、绩效、补贴、扣款、实发工资。这两张表都属于流水表数据量会随时间和人数增长所以查询时一定要有“月份”或“日期”的筛选条件。2.2 关键表结构与字段设计的细节我这里给你一份简化的建表脚本很多人事系统源码的初始版本基本就是长这样CREATE TABLE sys_user ( id bigint(20) NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL COMMENT 登录名, password varchar(100) NOT NULL COMMENT BCrypt加密后的密码, real_name varchar(50) DEFAULT NULL COMMENT 真实姓名, dept_id bigint(20) DEFAULT NULL COMMENT 部门id, status tinyint(4) DEFAULT 1 COMMENT 1启用 0禁用, create_time datetime DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT系统用户表; CREATE TABLE employee ( id bigint(20) NOT NULL AUTO_INCREMENT, emp_no varchar(30) NOT NULL COMMENT 员工编号, name varchar(50) NOT NULL, gender tinyint(4) DEFAULT 1 COMMENT 1男 2女, birth_date date DEFAULT NULL, dept_id bigint(20) DEFAULT NULL COMMENT 部门id, position varchar(50) DEFAULT NULL COMMENT 岗位, phone varchar(20) DEFAULT NULL, email varchar(100) DEFAULT NULL, entry_date date DEFAULT NULL COMMENT 入职日期, leave_date date DEFAULT NULL COMMENT 离职日期, status tinyint(4) DEFAULT 1 COMMENT 1在职 0离职, PRIMARY KEY (id), UNIQUE KEY uk_emp_no (emp_no) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT员工表;为什么密码字段长度给100而不是50因为BCrypt加密后密码字符串比较长给50容易存不下。为什么金额相关字段我们只提了基础设计真做薪资表时记得用Decimal(10,2)不要用double和float否则精度问题会让你的薪资汇总对不上账。表之间的关系也值得琢磨员工表通过dept_id关联部门表用户表通过dept_id关联到部门或者员工。之所以不直接把employee_id放在sys_user里是为了让管理员的创建更灵活。但如果你想把登录用户和员工信息绑定在一起用schema设计时加一个employee_id字段逻辑会更清楚。2.3 业务逻辑里最容易卡住的三个点第一个点是考勤状态计算。打卡时间拿到了怎么判断正常、迟到、早退、缺卡、请假最土的办法是在插入考勤记录时写一个判断方法把上下班时间跟设置的迟到阈值比较然后存一个状态值。比较好的做法是保留原始打卡时间状态字段单独维护。这样如果规则改了你还能用原始时间重新计算不至于丢数据。第二个点是薪资计算。实发工资等于基本工资加绩效加补贴减社保减考勤扣款这笔账看起来简单但源码里容易出问题的地方是“某个月员工离职了当月的考勤和薪资怎么算”。毕设里不需要你实现太复杂的薪资策略但至少要把计算公式单独写在一个service方法里并且每个月的数据要能按员工编号查出来。第三个点是权限数据隔离。普通人事专员登录后可能只能看本部门的员工管理员能看到全公司。很多简单源码只做了“有没有登录”没做“能不能看这行数据”。如果你的源码里SQL写死了全表查询答辩时老师只要问一句“怎么限制不同角色看到的数据范围”你就能意识到这里要做数据权限。最简单的方式是在SQL拼接条件的前面加上当前用户的部门id复杂一点就上MyBatis-Plus的拦截器但毕设阶段用第一种就够了。3. 前后端实操从源码到能跑起来3.1 人事系统源码跑起来的环境准备清单拿到的源码通常是一个后端文件夹加一个前端文件夹想让它们跑起来环境必须有版本意识。版本不匹配是源码跑不动的第一大原因。后端常规是JDK 8或JDK 11配Maven 3.6以上SpringBoot 2.x项目用JDK 8很稳定SpringBoot 3.x开始强制JDK 17所以你拿到源码先看pom.xml里的spring-boot-starter-parent版本。如果是2.x就不要非用JDK 17如果是3.x就不要用JDK 8否则编译都会报错。数据库方面MySQL 5.7和8.0都常见区别主要在JDBC驱动类名和时间时区问题上。MySQL 8建议用com.mysql.cj.jdbc.Driver同时连接串带上serverTimezoneAsia/Shanghai。前端部分看package.json里的vue版本Vue2配Node.js 14或16比较稳Vue3配Node.js 16以上。如果你电脑上Node版本太高导致npm install报错建议装一个nvm做版本切换。工具推荐反过来后端用IDEA前端可以继续用IDEA也可以配VSCode。数据库操作推荐Navicat或者DataGrip用命令行也不是不行但图形界面排查数据问题效率高很多。3.2 后端项目结构拆解与配置文件解读一套标准的人事系统后端包结构差不多长这样src/main/java/com/example/hr ├── controller # 接收前端请求 ├── service # 业务逻辑层 ├── mapper # 数据访问层对应MyBatis的Mapper接口 ├── entity # 实体类对应数据库表 ├── config # 跨域、MyBatis-Plus分页插件、拦截器配置 ├── common # 统一返回结果、统一异常处理、枚举 ├── util # JWT工具、日期工具 └── HrApplication.java # 启动类后端最关键的配置文件application.yml你拿到的源码大概率长这样server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/hr?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl jwt: secret: hr-system-secret-key expire: 604800看到这个配置你要能说出三个关键点。第一url里的useSSL和serverTimezone都是常见坑。第二mysql驱动类名MySQL 5.x是com.mysql.jdbc.DriverMySQL 8.x是com.mysql.cj.jdbc.Driver。第三jwt.secret和jwt.expire是自定义配置代码里有对应的ConfigurationProperties或Value读取。另外这个系统是前后端分离后端端口8080前端启动时通过代理转发这就绕开了浏览器跨域问题。如果源码里没有代理而是直接在后端写了CorsConfig那也行但你要能说明两种方式的区别。后端统一返回类一般是Result或RespBean结构里包含code、message、data三个字段前端拿这个判断接口成功失败。3.3 前端项目结构拆解与关键实现前端拿到手一般是已经用Vue CLI生成好的项目重点看src目录src ├── api # 封装好的请求方法比如 employee.js、login.js ├── assets # 静态资源 ├── components # 公共组件 ├── router # 路由配置文件 ├── store # Vuex状态管理 ├── views # 页面登录、员工管理、部门管理等 ├── App.vue └── main.js最关键的先看vue.config.js。没有重命名的话里面通常有一段devServer配置代理后端接口。// vue.config.js module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true, pathRewrite: { ^/api: } } } } };这样做的好处是前端开发时所有请求都写/api开头比如/api/employee/list代理到后端时自动去掉/api前缀请求真实地址是http://localhost:8080/employee/list。如果你在后端看到RequestMapping(/employee)前端却是/api/employee/list就是因为有这一层代理。然后是Axios封装。常规写法是把baseURL设置为/api然后加两个拦截器请求拦截器从localStorage取token放进请求头响应拦截器里统一处理业务code不等200的情况和HTTP 401状态。登录页拿到token后存到localStorage路由守卫里每次跳转前先判断有没有token。router.beforeEach((to, from, next) { const token localStorage.getItem(token); if (to.path /login) { next(); } else if (!token) { next(/login); } else { next(); } });这套代码写得很基础但足够应付大多数毕设。如果你要问为什么不用更复杂的动态路由和角色权限答案是简单的管理后台用静态路由加按钮级判断已经够了动态路由虽然看起来更高级但调试成本也高课设阶段先把核心流程跑通更重要。3.4 完整启动步骤从数据库初始化到前端页面出来第一次跑整套人事系统我建议按这个顺序来少踩不少坑。第一步准备数据库。用Navicat新建一个空库名称最好和源码里配置文件一致叫hr。然后右键运行SQL文件导入源码目录下的hr.sql。正常情况导入后能看到sys_user、employee、dept、attendance、salary这些表并且初始数据里已经有一个管理员账号。第二步改数据库密码。打开application.yml把username和password改成你自己本机的不改这一步绝对连不上。这里最容易翻车的点是root用户的密码本身有特殊符号比如包含或#在url里会被当成特殊字符处理建议临时改个简单密码或者用代码里让用户输密码的方式。第三步启动后端。在IDEA里用Maven先reload一下项目等待依赖下载完然后运行HrApplication的main方法。如果依赖下载非常慢大概率是Maven没有配置阿里云镜像网上搜“maven settings.xml 阿里云镜像”按步骤改一下就好。后端启动成功的标志是控制台出现“Started HrApplication”且没有异常端口8080监听成功。第四步启动前端。终端进入前端目录执行npm install安装依赖然后npm run serve。注意npm install执行时间取决于网络环境如果中途报错先看是不是Node版本问题再试着删除node_modules目录重新安装。成功后浏览器访问http://localhost:8081看到登录页就是跑通了。第五步登录测试。用源码内置的admin账号和初始密码登录进去后往员工表里新增一条数据再重新分页查询确认前后端数据流通。做完这一步你这套源码已经算是在本地完整跑通了。4. 核心功能代码实现细节4.1 登录认证为什么推荐JWT加拦截器人事系统源码里的认证方式没有统一标准有的用Session有的用Spring Security有的是JWT加拦截器但如果你自己改这个项目我建议用JWT。原因有三点前后端分离下JWT不占Session内存、好扩展、而且你答辩时能讲清楚原理。JWT流程拆开就是前端提交账号和密码后端查数据库用BCrypt去比对密码比对成功生成一个token返回给前端。token里就包含用户名、用户id、过期时间。前端后续每个请求都自动带上Authorization: Bearer token。后端拦截器拿到token调用JWT工具类解析解析成功就放行解析失败就返回401。关键类是JwtUtil生成的token大致是这样public String generateToken(Long userId, String username) { return Jwts.builder() .setSubject(username) .claim(userId, userId) .setExpiration(new Date(System.currentTimeMillis() expire * 1000)) .signWith(SignatureAlgorithm.HS256, secret) .compact(); }注册拦截器时要注意排除登录接口否则你还没登录就被拦截了。用SpringBoot的WebMvcConfigurer注册拦截器addPathPatterns(/**)加上excludePathPatterns(/login)。这种写法比在每个Controller里自己加判断规范得多。BCrypt比对密码时有个容易困惑的地方密码字段存的是加密后的字符串不是明文。登录校验用passwordEncoder.matches(rawPassword, encodedPassword)不要直接拿数据库密码和前端密码做equals比较。加密后的密码每次都不相同这是BCrypt的特性但这不影响校验因为匹配算法会从密文里取出盐。4.2 员工管理分页查询和新增编辑的完整链路员工管理是人事系统的门面打开页面就是一个表格加载所有员工支持按姓名和部门筛选。源码里员工分页查询最常见的写法是MyBatis-Plus。后端Controller接收current、size、name这些参数Service里用LambdaQueryWrapper拼条件然后再调分页。public IPageEmployee getEmployeePage(long current, long size, String name, Long deptId) { PageEmployee page new Page(current, size); LambdaQueryWrapperEmployee wrapper new LambdaQueryWrapper(); wrapper.like(StringUtils.hasText(name), Employee::getName, name) .eq(deptId ! null, Employee::getDeptId, deptId) .orderByDesc(Employee::getId); return employeeService.page(page, wrapper); }这里有几个很容易被老师问到的点。第一条件拼接里的deptId ! null不是写给人看的是为了避免用户没选部门时拼出一个dept_id null的错误条件。第二orderByDesc按id倒序可以让新增的员工排在最前面这是演示时的细节能提升使用体验。前端对应逻辑就是el-table绑定列表数据el-pagination绑定当前页和每页数量切换页码时重新调接口。新增和编辑其实可以共用一个Dialog表单提交时根据有没有id字段决定是post还是put这就是审批系统里常见的“同一表单两种模式”。如果你在源码里看到add和edit两个页面是拆开的也可以自己合并成一个组件这算一个优化点。4.3 部门联动、日期格式、上传头像等高频细节员工新增表单里通常会有一个“所属部门”的下拉框这里涉及级联选择。最简单的是打开页面时拉一次部门树把数据放进el-select的options里。更高级一点的根据岗位筛选部门但这在毕设里不常见你可以不用过度设计。日期字段是另一个重灾区。前端el-date-picker默认返回的是“YYYY-MM-DD”或者带时间的完整字符串而后端实体类里birthDate是LocalDate或Date。如果前端没做格式化后端就会报类型转换异常或者存进数据库变成一堆奇怪的时间。最简单方案是前端绑定return-format。el-date-picker v-modelform.entryDate typedate value-formatyyyy-MM-dd placeholder选择入职日期 /el-date-picker头像上传也是人事系统里常见的加分项。后端写一个MultipartFile接收接口把文件保存到本地的upload目录返回一个访问URL。注意接收文件时要限制大小和类型否则会被塞进来一个奇怪的文件。如果你想让这个项目显得更有企业级感觉可以把上传对象改成MinIO源码里只需要多引入一个minio依赖改一个service实现。4.4 让答辩老师觉得你的项目有亮点的几个小优化很多同学拿到的源码功能都差不多怎么让同一个题目在答辩时显得更完整我建议在这个基础上加三个相对小成本但很显眼的优化。第一个是EasyExcel导出。员工管理页面加一个“导出Excel”按钮后端用EasyExcel一行代码就能把查询结果导成xlsx。这件事功能不大但在答辩现场演示时非常抓眼球而且实现成本很低。第二个是操作日志。用Spring AOP给修改操作加一个切面记录什么人在什么时间改了哪张表的哪条数据。人事系统天然适合这个场景老师问到“如何审计”时你可以直接讲AOP原理。第三个是统计图表。首页加一个部门人数柱状图或者近几个月入职人数折线图后端统计接口返回list前端用ECharts画一张图。ECharts在国内管理后台项目里几乎必用提前学会对找工作也有帮助。5. 毕设/课设实战中的常见坑与排查技巧5.1 数据库连不上八成是驱动和时区问题我帮人看源码遇到最多的问题就是启动报数据库连接异常。常见报错里有三个高频原因你可以直接对照排查。第一个是驱动类不存在。报错含有“ClassNotFoundException: com.mysql.jdbc.Driver”说明你的MySQL版本是8.x但源码里写的是老驱动。改成com.mysql.cj.jdbc.Driver或者升级依赖里的mysql-connector。新版MySQL的groupId和artifactId也变了MySQL 8.0.31之后是com.mysql:mysql-connector-j。第二个是时区错误。报错含有“The server time zone value”或者“Could not create connection to database server”基本就是连接串少了serverTimezone。加上serverTimezoneAsia/Shanghai就能解决。顺带把useSSLfalse也写上避免证书校验干扰本地开发。第三个是密码或端口问题。如果你改过MySQL端口比如3306不想用了改成了3307连接串里也得改。还有那种本地MySQL服务没启动导致Connection refused的情况Windows下用命令net start mysqlMac下brew services start mysql先确认服务真的起来了再查代码。5.2 前端启动和接口请求的四个高频报错前端相比后端问题更多一些但基本都是环境、跨域、路由三个方向。npm install报错是最常见的。报错里出现ERESOLVE通常是Node版本和依赖版本冲突先用nvm把Node切到项目建议版本然后删除package-lock.json和node_modules重新npm install。npm run serve成功但在浏览器打开页面一片白大概率是router的mode用了history本地刷新或直接访问子路由时404。毕设阶段最简单的方式是改成hash模式如果你要部署到服务器用historyNginx要加try_files配置。接口全部报404先看网络请求的URL路径是不是被代理正确替换了。打开浏览器开发者工具看请求地址如果是/api/employee/list而后端口是8080代理配置就没问题。如果请求直接发到了8081或者8082说明代理没生效检查vue.config.js是不是被IDE缓存了重跑一遍npm run serve。接口能通但拿不到数据或者报跨域错误再看后端有没有支持跨域。用CorsConfig类的addCorsMappings是全局跨域方案注意allowedOriginPatterns不要写死成*否则携带Cookie时可能出问题。不过JWT模式一般不用Cookie跨域策略稍微宽松一点也可以。5.3 MySQL 与 SQL 的乱码和导入问题导入数据库脚本时中文变问号首先要确认SQL文件本身的字符集是UTF-8。Navicat新建数据库时直接把字符集选成utf8mb4排序规则选utf8mb4_general_ci再导入脚本。连接串里也要加characterEncodingutf8这是老生常谈但每次都有人踩。查询出来的中文正常但页面显示乱码多半是后端接口返回时编码问题。SpringBoot默认编码已经是UTF-8所以这种情况多出现在旧项目里。排查时先看响应头有没有Content-Type: application/json;charsetUTF-8再看数据库连接串的characterEncoding是否丢失。还有用户提到的“e0434352”这类Windows安装MySQL时的报错本质都不是SQL问题而是安装环境问题。Windows安装MySQL或MySQL Workbench时弹类似错误先检查VC运行库是否齐全、.NET Framework是否安装、以管理员身份运行安装包。这种问题看起来吓人其实跟你的项目代码没关系换一个安装包或换一台电脑往往就好了。5.4 演示和答辩前的检查清单源码跑通了不等于答辩稳了我见过很多项目演示时翻车都是因为前期没做几件简单的事。下面这个清单建议你在答辩前一天对着过一遍。第一数据库里一定要有足够的演示数据。空表加空页面比报错还尴尬至少准备二十个员工、五个部门、上个月的考勤记录和薪资记录。演示时可以现场搜索一个员工让页面和数据都有互动感。第二把后端日志窗口和前端控制台提前缩小放好。老师说想看接口层你就点到后端日志说想看请求路径你就点开浏览器开发者工具Network面板这个动作显得你非常懂底层。第三准备一个降级方案。如果演示时突然连不上数据库快速切换到本机MySQL服务启动或者准备一份静态截图放在旁边。提前演练一次重启后端、重启前端、重新登录的完整流程把耗时控制在三分钟内。第四学会提炼话术。老师问你“这个项目有什么难点”不要回答“没有难点”。你可以说密码用了BCrypt加密存储权限控制用JWT加拦截器实现分页查询是MyBatis-Plus插件处理表格数据通过Axios拦截器统一处理token。哪怕代码是真的参考来的只要你能讲清楚原理老师就会认为这是你的能力。6. 最后分享一点带项目做课设的私人经验带过这么多不同学生的源码项目之后我最大的体会是“跑通”和“讲通”是两回事。跑通只需要你按着环境配置一步步来遇到报错就搜讲通则需要你把每个核心模块拆开看明白比如JWT的token怎么生成的MyBatis-Plus分页插件底层帮做了什么。如果你时间有限我建议优先把登录认证、员工分页查询、部门数据这三条线彻底吃透它们几乎覆盖了人事系统90%的面试提问点。还有一个小技巧给源码里的关键方法写注释时不要写“用户登录”这种废话要写“先根据username查用户再BCrypt比对密码成功后签发有效期7天的token”。这种注释不仅方便你自己答辩时回忆也能让老师在检查代码时直观感受到你真的看过实现细节。把这套SpringBootVue人事系统源码吃透了以后再去看其他管理类项目你会发现套路都差不多改改表结构和页面文案你就能再出一个看起来完全不同的项目。
返回列表