简介:这是一份面向计算机相关专业毕业设计、课程作业场景的Spring Boot与Vue人事管理系统源码包,涵盖前后端分离开发、权限管理、员工信息管理、考勤与部门管理等典型业务模块,适合正在完成毕设的大学生或需要快速上手企业级框架的入门开发者。压缩包共356个文件,约29.05MB,主要以92个Java后端源码、34个Vue前端组件、161个SVG图标和XML、SQL等配置为主,同时包含Maven脚本、启动批处理、yml配置及少量演示视频,基本覆盖从环境配置到运行部署的完整链路。已有66人学习下载,源码经过运行验证;下载后建议先查看README或论文相关文件,可借助项目结构快速定位登录鉴权、CRUD接口与页面路由等核心代码,也可将其作为二次开发与论文撰写的参考基底。
1. 这个毕业设计 zip 里装的是什么:Springboot+Vue 人事管理系统的真实价值
拿到一个名为「springboot066基于Springboot+Vue人事管理系统毕业源码案例设计.zip」的压缩包,第一反应通常是解压、看目录结构、试图启动。但真正值得关心的是另一件事:这套源码能不能帮你在一周内跑通,并且能在答辩时讲清楚每一个表、每一个接口、每一个页面的来龙去脉。人事管理系统是毕设中最常见也最稳妥的选题——业务逻辑清晰、模块边界分明、技术栈覆盖面广,从增删改查到权限控制,从文件上传到考勤统计,几乎能把 Springboot 和 Vue 的核心能力都练一遍。本文围绕这套源码的实际结构,讲清楚架构怎么拆、模块怎么设计、本地怎么部署、坑在哪里,以及如何把它从「能跑」升级成「能讲」。
2. 前后端分离架构:Springboot 和 Vue 在人事系统里各自扛什么活
2.1 人事系统的请求链路:从 Vue 页面到 MySQL 表
前后端分离不是把代码分成两个文件夹就叫分离,关键在于职责边界和通信方式。在这套人事管理系统里,Vue 负责页面的渲染、表单校验、路由跳转和状态管理;Springboot 负责接收 HTTP 请求、处理业务逻辑、操作数据库并返回 JSON 数据。两者之间通过 RESTful API 通信,数据格式统一为 JSON。
以「员工列表查询」为例,完整链路是:Vue 的employee.js里调用 axios 发 GET 请求到/api/employee/list,Springboot 的EmployeeController接收请求后调用EmployeeService,Service 再通过 MyBatis 的 Mapper 查数据库,最后把结果封装成统一返回结构Result回传给前端。前端拿到数据后,在employee.vue的表格组件里渲染。
// 前端:request.js 中封装的 axios 实例 import axios from 'axios' const request = axios.create({ baseURL: '/api', // 所有请求走 /api 前缀 timeout: 10000 }) // 请求拦截器:统一携带 token request.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) { config.headers['Authorization'] = token } return config }) export default request这里有个容易被忽视的细节:baseURL: '/api'不是后端接口的真实路径,而是通过 Vue 的 devServer 代理转发的。开发环境下,Vue 跑在 8080 端口,Springboot 跑在 9090 端口,浏览器直接跨域。解决办法是在vue.config.js里配置 proxy,把/api开头的请求转发到后端地址。
// vue.config.js 开发环境跨域代理 module.exports = { devServer: { port: 8080, proxy: { '/api': { target: 'http://localhost:9090', // 后端服务地址 changeOrigin: true, // 修改请求头中的 Origin pathRewrite: { '^/api': '' } // 去掉 /api 前缀再转发 } } } }这样做的理由很实际:生产环境部署时,Nginx 同样可以配置类似的转发规则,前后端代码不需要改动。如果你在启动项目时发现页面能打开但数据加载不出来,八成是代理配置或跨域没处理好,后面避坑章节会细说。
2.2 Springboot 端:自动装配与分层设计的落地方式
Springboot 的核心价值在于自动装配——通过@SpringBootApplication注解,框架会自动扫描当前包及其子包下的所有组件。在这套人事管理系统里,包结构通常分为controller、service、mapper、entity、config五层,每一层职责单一,这是毕设答辩时最容易讲清楚的架构。
约定优于配置在配置文件里体现得最明显。application.yml里只需要写数据库连接、端口号和 MyBatis 的 mapper 扫描路径,剩下的交给框架默认值。但有一个参数值得多看一眼——MyBatis 的map-underscore-to-camel-case,它决定数据库字段employee_name能否自动映射到 Java 属性employeeName。这一行配置省去大量手写 ResultMap 的时间,是人事系统这类业务 CRUD 项目的刚需。
# application.yml 关键配置 server: port: 9090 servlet: context-path: / spring: datasource: url: jdbc:mysql://localhost:3306/hrms?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.hrms.entity configuration: map-underscore-to-camel-case: true # 分页插件配置 pagehelper: helper-dialect: mysql reasonable: true support-methods-arguments: true分页插件是人事系统列表页的标配。helper-dialect指定数据库方言,reasonable设为 true 后,页码超出范围时会自动修正到第一页或最后一页,避免前端传一个pageNum=999把数据库查垮。使用方式是在 Service 层调用PageHelper.startPage(pageNum, pageSize),紧接着的第一次 Mapper 查询会被自动拦截并生成 limit 语句。
// EmployeeService 中的分页查询 public PageInfo<Employee> getEmployeeList(int pageNum, int pageSize, String keyword) { PageHelper.startPage(pageNum, pageSize); // 拦截下一条 SQL List<Employee> employees = employeeMapper.selectByKeyword(keyword); return new PageInfo<>(employees); // 包含 total、pages 等分页信息 }注意PageHelper.startPage只对紧接着的第一次查询生效,如果你在调用它之前执行了其他 SQL,分页就会失效。这是 MyBatis 分页插件最常见的误用场景,也是面试时可能被追问的点。
2.3 Vue 端:组件化页面与路由权限控制
Vue 侧的核心不是语法,而是组件划分思路。人事管理系统的页面可以拆成「布局组件 + 业务组件」两层:Layout.vue负责侧边栏和顶部导航,employee.vue、attendance.vue、salary.vue继承布局后填充内容区。每个业务页面再继续拆——员工表单、部门树、考勤日历都是独立组件,这样做的好处是改一个模块不影响其他模块。
路由配置在毕设里往往是最被低估的部分。这套系统的路由需要实现一个关键功能:不同角色登录后看到不同的菜单。做法是后端登录接口返回该用户的角色和权限列表,前端根据权限动态生成路由。
// router/index.js 动态路由的核心逻辑 import { getMenuList } from '@/api/menu' let dynamicRoutes = [] export function buildRoutes() { return getMenuList().then(res => { const menus = res.data // 把后端返回的菜单数据转换成 vue-router 需要的路由结构 dynamicRoutes = menus.map(item => ({ path: item.path, name: item.name, component: () => import(`@/views/${item.component}`), meta: { title: item.title, icon: item.icon } })) router.addRoutes(dynamicRoutes) // 动态添加路由 }) }动态路由有个隐蔽的坑:import()的路径不能完全用变量拼接,否则 webpack 无法在构建时解析模块。常见做法是把组件路径写成一个映射表,或者用require.context提前加载所有页面组件。如果答辩时被问到「刷新页面后路由丢失怎么办」,答案是每次刷新后重新调用buildRoutes(),并把用户信息缓存在 localStorage 里。
3. 人事管理系统的四个核心模块:表结构设计与接口约定
3.1 登录认证与菜单权限:从数据库表到前端路由
人事系统的权限模型一般是经典的 RBAC(基于角色的访问控制),三张核心表:sys_user、sys_role、sys_menu,外加两张关联表sys_user_role和sys_role_menu。用户表存登录账号和密码,密码必须加密存储——毕设里用 MD5 加密虽然能被挑毛病,但比明文强得多,至少能体现安全意识。
登录流程的逻辑是:前端提交用户名密码 → 后端校验通过后生成 Token → 前端把 Token 存到 localStorage → 后续每个请求都带上 Token → 后端用过滤器校验 Token 有效性。这套方案在毕设答辩时能讲出完整的认证闭环。
// JwtUtil 中生成 Token 的核心方法 public String generateToken(User user) { // 设置主题为用户名,过期时间 24 小时 return Jwts.builder() .setSubject(user.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + 86400000)) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); }这里有一个常被忽略的问题:Token 失效后前端如何处理。如果前端不做拦截,用户 Token 过期后请求会返回 401,但页面没有任何提示,用户会以为系统卡死了。正规做法是在 axios 响应拦截器里统一处理 401 状态码,跳转到登录页并清除本地缓存。
// 响应拦截器:统一处理 Token 过期 request.interceptors.response.use( response => { return response.data }, error => { if (error.response && error.response.status === 401) { localStorage.removeItem('token') window.location.href = '/login' // 强制跳回登录页 } return Promise.reject(error) } )部门表sys_dept用父子层级结构存储,通过parent_id字段关联。做部门树的时候,后端一次性返回所有部门,前端用递归算法组建成树形结构。如果部门层级超过三层,递归性能会下降,但人事系统通常也就两三层,完全够用。
3.2 员工信息管理:文件上传与 Excel 导入导出
员工表employee是人事系统的核心表,字段一般包括工号、姓名、性别、手机号、邮箱、入职日期、部门 ID、岗位、学历、状态等。这里有一个设计经验:员工表和用户表是两回事,员工是组织架构里的实体,用户是能登录系统的人,两者通过employee_id关联,但并非一一对应。
员工批量导入是毕设中能大幅加分的功能。Vue 端用 Element UI 的 Upload 组件选择 Excel 文件,后端用 EasyExcel 解析,逐行校验数据后批量插入数据库。
// 批量导入员工的接口 @PostMapping("/import") public Result importExcel(@RequestParam("file") MultipartFile file) { try { // EasyExcel 读取 Excel,同步解析到 List List<Employee> employees = EasyExcel.read(file.getInputStream()) .head(Employee.class) // 映射实体类,跳过表头 .sheet() .doReadSync(); // 逐条校验,非法数据记录到 errorList List<String> errorList = validateEmployees(employees); if (!errorList.isEmpty()) { return Result.error("导入失败:" + String.join(";", errorList)); } employeeService.batchInsert(employees); return Result.success("成功导入 " + employees.size() + " 条数据"); } catch (Exception e) { return Result.error("文件解析失败,请检查 Excel 格式"); } }实际开发里最常见的坑是 Excel 中的日期格式解析后变成数字(Excel 的日期本质是序列号),以及手机号超过 11 位被解析成科学计数法。解决办法是在 EasyExcel 的实体类字段上加上@DateTimeFormat注解,手机号字段用 String 接收。
部门、岗位、学历这些字段最好用下拉框限制输入,不要让人自由填写。好处是后续做统计报表时维度是可控的,不然「研发部」「研发部门」「研发中心」三套说法会把统计结果搞得一团糟。
3.3 考勤与薪资统计:时间字段处理的三个细节
考勤模块的常见做法是每天生成一条考勤记录,包含上班打卡时间、下班打卡时间、考勤状态(正常、迟到、早退、缺勤)。后端用一个定时任务每天早上创建当天的考勤记录,员工打卡后更新对应的上班或下班时间。
// 定时任务:每天 00:00 为所有在职员工生成考勤记录 @Scheduled(cron = "0 0 0 * * ?") public void generateDailyAttendance() { List<Employee> activeEmployees = employeeService.getActiveEmployees(); for (Employee employee : activeEmployees) { Attendance attendance = new Attendance(); attendance.setEmployeeId(employee.getId()); attendance.setDate(new Date()); attendance.setStatus("NORMAL"); attendanceMapper.insert(attendance); } }时间字段是考勤模块大量踩坑的重灾区。第一坑是时区问题:serverTimezone=Asia/Shanghai不配置的话,MySQL 和 Java 之间会出现 8 小时偏差,打卡记录显示的时间比实际早 8 小时。第二坑是日期比较:查某天的考勤记录不要用create_time,而要在date字段上直接查询,因为create_time是记录创建时间,不是考勤归属日期。第三坑是跨天问题:如果公司有夜班,凌晨 2 点下班打卡应该算前一天还是当天?这个规则最好在产品设计阶段就定清楚,否则后期改逻辑很痛苦。
薪资模块一般从员工基础工资、岗位工资、补贴、社保、个税等维度计算最终金额。毕设里不需要做真正的工资计算引擎,用「基本工资 + 岗位工资 + 绩效 - 五险一金」的公式即可。关键的落地点是薪资数据要按月归档,不要覆盖历史月份数据——用salary_month字段区分,这样后续做薪资趋势分析才有数据基础。
3.4 公告与文件管理:通用附件的上传方案
人事系统通常会带一个公告模块,管理员发通知时可以附带附件。附件上传的通用方案是:前端把文件传给后端,后端把文件保存到本地磁盘或对象存储,然后把访问路径存到数据库。毕设里最简单的做法是保存到项目的upload目录下,配置成静态资源映射。
# application.yml 中配置静态资源映射 spring: web: resources: static-locations: classpath:/static/,file:${upload.dir}注意file:前缀指向的是绝对路径,比如D:/hrms/upload/。这个配置有个典型的坑:如果upload.dir目录不存在,Springboot 启动时会报错,所以项目初始化时要手动创建该目录。另一个坑是路径分隔符,Linux 和 Windows 下路径写法不同,最好用System.getProperty("file.separator")拼接。
4. 把 zip 里的源码跑起来:环境准备与部署全流程
4.1 开发环境版本选择:JDK、Node、MySQL 怎么配
解压后首先看得是 pom.xml 里的依赖版本,因为它决定了你的 JDK 版本。Springboot 2.x 需要 JDK 8 或 11,Springboot 3.x 需要 JDK 17。如果本机装的是 JDK 17 但项目是 Springboot 2.x,运行时会报UnsupportedClassVersionError,最省事的办法是安装 JDK 8 并配置JAVA_HOME环境变量。
Vue 端的版本冲突更隐蔽。老项目如果用的是 Vue 2 + webpack 4,Node 版本太高会导致openssl兼容性错误,运行npm run dev时提示Error: error:0308010C:digital envelope routines::unsupported。这时候有两种解决路径:一是降 Node 版本到 16 以下,二是在启动命令里加一句NODE_OPTIONS=--openssl-legacy-provider。我个人建议用 nvm 管理 Node 版本,比来回卸载安装靠谱得多。
MySQL 建议用 5.7 或 8.0。导入 SQL 脚本时要特别注意字符集和排序规则,统一用utf8mb4和utf8mb4_general_ci,不然中文会出现乱码。数据库连接时如果报Public Key Retrieval is not allowed,在 jdbc url 后面加上allowPublicKeyRetrieval=true即可。
4.2 数据库初始化:SQL 脚本的执行顺序与验证
zip 包解压后,通常sql目录或db目录下有一个初始化脚本。用 Navicat 或其他客户端连接 MySQL 后,执行脚本前先检查两点:一是脚本里是否有CREATE DATABASE语句,如果有,注意选对数据库再执行;二是脚本的编码格式,Windows 下用记事本另存过的脚本可能是 GBK 编码,执行前先转成 UTF-8。
# 命令行导入 SQL 脚本(推荐 UTF-8 编码) mysql -u root -p hrms < /path/to/hrms.sql导入完成后验证数据是否正常:
-- 检查核心表的记录数 SELECT COUNT(*) FROM sys_user; SELECT COUNT(*) FROM employee; SELECT COUNT(*) FROM sys_menu;如果sys_user表有数据,登录测试时优先使用脚本里自带的预置账号,比如admin/admin123。很多同学一上来就注册新账号,结果发现没有注册功能或权限不正确,其实管理员账号已经写在 SQL 里了。
4.3 后端启动:Maven 配置与第一个接口验证
后端启动前,确认application.yml里的数据库账号密码改成了你本机的配置。然后打开 IDEA,等待 Maven 下载依赖。如果网络不稳,Maven 依赖下载会卡半天或报错,解决方案是修改 Maven 镜像源。
<!-- settings.xml 中配置阿里云 Maven 镜像 --> <mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>依赖下载完成后启动HrmsApplication.java,看到Tomcat started on port(s): 9090说明启动成功。先别急着打开前端页面,用浏览器直接访问一下后端接口,确认接口链路是通的。
# 测试后端接口是否可用 curl http://localhost:9090/api/user/info如果返回 JSON 数据而不是 404 或 500,后端就算跑通了。这里有个技巧:把项目里 Controller 的访问路径整理成一份接口清单,后续联调时不用反复翻代码。
4.4 前端启动:npm 依赖安装与代理配置
前端目录下运行npm install,如果报 peer 依赖冲突或 python2 缺失,通常是两个原因:一是 Node 版本太高,二是依赖锁定文件缺失导致版本解析混乱。可以先删掉package-lock.json和node_modules后重新安装。
npm 官方源在国内下载大依赖(如 electron)时容易卡住,换成淘宝源能省很多时间。
# 设置 npm 镜像源 npm config set registry https://registry.npmmirror.com # 安装依赖 npm installnpm run dev启动后,浏览器访问http://localhost:8080。如果页面空白,按 F12 看 Console 报错信息。最常见的是Failed to load resource: 404,说明代理没生效或后端没启动。也有一种可能是入口 HTML 文件路径不对,检查public/index.html是否存在。
启动完成后的联调验证路径是:登录 → 进入员工管理 → 新增一条员工数据 → 删除它 → 确认数据同步变化。这条链路走通,说明前后端通信、数据库操作都正常。
5. 避坑指南:人事系统跑通之前一定会遇到的 5 个问题
5.1 跨域请求被拦截,接口返回 403
现象:前端页面能打开,但所有请求都失败,浏览器 Console 显示CORS error或403 Forbidden。
原因:Springboot 后端默认不允许跨域请求。虽然开发环境下 Vue 配置了 proxy,但如果你直接访问的是后端接口地址(比如把 baseURL 直接指向http://localhost:9090),或者 proxy 配置写错了路径,浏览器就会发起真正的跨域请求。
解决:先确认请求走的是/api前缀且 Vue 项目使用了 proxy。如果必须开启跨域,在后端写一个 CORS 配置类:
// 全局跨域配置类 @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 所有接口 .allowedOriginPatterns("*") // 允许所有来源,生产环境应收紧 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowCredentials(true) .maxAge(3600); } }需要强调的是,allowCredentials(true)和allowedOriginPatterns("*")在 Springboot 2.4+ 版本里是兼容的,但旧版本用allowedOrigins("*")会报错。如果遇到诡异跨域问题,先检查框架版本。
5.2 前端 npm install 反复失败
现象:npm install要么卡住不动,要么报各种 ERESOLVE 或 ENOENT 错误。
原因:多数情况是两个——Node 版本过高不兼容 Vue 2 的依赖树,以及 lockfile 文件缺失导致 npm 无法按固定版本安装。遇到过最头疼的一次是某个依赖的二进制包下载失败,npm 不会自动重试,需要手动清除缓存。
解决:先查看项目的package.json里是否写明了 Vue 版本。Vue 2 项目优先用 Node 14 或 16,Vue 3 用 Node 16 或 18。然后按顺序执行:
# 清理 npm 缓存并重新安装 npm cache clean --force rm -rf node_modules package-lock.json npm install如果安装过程中某个包频繁失败,单独安装它并添加--force参数跳过冲突检查。实际经验是,这个方案解决依赖问题的成功率超过八成。
5.3 后端能启动但登录一直失败,提示密码错误
现象:预置的 admin 账号登录不进去,提示用户名或密码错误,但 SQL 里明明有数据。
原因:密码加密方式不一致。SQL 脚本里存的是 MD5 或 BCrypt 加密后的密文,但代码里如果改了加密算法,或者密码字段有特殊字符被截断,就会校验不通过。另一个容易被忽略的点是数据库里的密码字段长度不够,BCrypt 加密结果是 60 个字符,如果字段是 varchar(32),存进去会被截断。
解决:先确认代码里用的加密器是MD5还是BCryptPasswordEncoder,然后看 SQL 里预置密码的密文格式。最简单的验证方法是写一个临时接口,在内存里跑一次加密,把结果和数据库里的值对比:
// 临时测试 BCrypt 密码 public static void main(String[] args) { BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); System.out.println(encoder.encode("admin123")); }把输出结果复制到数据库里比对,长度一致且前缀为$2a$就说明加密器匹配。密码字段长度如果不够,直接 ALTER TABLE 改成 varchar(100)。
5.4 文件上传成功但访问附件 URL 显示 404
现象:附件上传时报成功,但点击下载或预览时提示文件不存在或 404。
原因:上传的文件被保存到了项目运行时目录下,而重新启动项目后,IDEA 或 Maven 会重建 target 目录,之前上传的文件被清空了。另一个更隐蔽的问题是比如 Windows 下保存到D:/hrms/upload,前端映射的 URL 路径写的是/upload/**,但实际 Springboot 静态资源映射没配好。
解决:首先把上传目录配置到项目外的固定路径,不要放在 target 目录里。其次确认配置文件中的静态资源映射和前端访问路径一致,比如上传后返回的路径是/files/xxx.jpg,那么映射也要写/files/**。
# 修改后的配置示例 upload: dir: D:/hrms/upload/ # 项目外固定路径 spring: web: resources: static-locations: file:${upload.dir}产生这个问题的根本原因是没有区分「上传物理路径」和「访问虚拟路径」。物理路径是文件在磁盘上的位置,虚拟路径是浏览器访问时的 URL,两者通过映射关系关联。理解这一点之后,再遇到附件 404 基本上能自己定位问题。
5.5 考勤模块时间显示偏差 8 小时
现象:数据库里存的时间是正确的,但前端页面显示的时间比实际晚了 8 个小时,或者反过来。
原因:三个环节中有一个或多个的时区没对齐——MySQL 连接串没有传serverTimezone、Java 运行环境的默认时区不对、前端 JS 的new Date()在使用时发生了本地时区转换。最常见的是第一种,MySQL 默认时区是 UTC,而中国是 UTC+8。
解决:统一在 JDBC 连接串里指定时区,MySQL 驱动和 Java 侧一致:
url: jdbc:mysql://localhost:3306/hrms?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8前后端联调时,约好传输格式为时间戳(long)或带时区的 ISO 字符串,避免前端new Date("2025-01-01 00:00:00")这种写法产生时区偏移。最省心的方案是后端的返回结果统一用字符串格式化好,前端不做任何日期转换,直接展示。
6. 从毕设到作品集:给人事管理系统加分的 3 个进阶方向
项目跑通只是起点,答辩时真正拉开差距的是你对项目的理解和改进空间。我的习惯是,先让项目按原样跑通,再挑两个点做升级,这样既有「能运行的完整系统」作为保底,又有「我改了什么、为什么这么改」作为亮点。
第一个值得加的改进是操作日志功能。人事管理系统的关键操作(删除员工、修改薪资、导入数据)需要留痕。定义一个sys_log表,用 Spring AOP 切面拦截带@Log注解的接口,自动记录操作人、操作时间、请求参数和结果。这部分能体现出你对 Spring AOP 和自定义注解的掌握度,答辩时容易展开讲。
第二个改进是把文件存储切到 MinIO。本地磁盘存储有一个致命缺点:项目重启或迁移时文件容易丢失。MinIO 是开源的对象存储,能保留原来的上传接口,只改 Service 层的实现。这样讲出来面试官会认为你不仅会写 CRUD,还考虑过规模化场景下的问题。前面热词里提到的「minio 加入到 springboot」就是常被搜索的问题,官方文档有完整示例,跟着配置一遍就能跑通。
第三个改进是引入 Redis 做缓存。员工的部门列表、岗位列表这类基本不变的数据,查数据库浪费性能
。用 Redis 缓存后,第一次查询写缓存,后续请求直接走缓存。代码改动量不大,但需要说明缓存更新的时机——员工信息变更时先更新数据库再删缓存。加上 Spring Cache 的@Cacheable注解后,整个实现可能不到一百行代码,却能让你的系统在「性能和扩展性」维度上明显加分。
验证进阶效果时,建议用 JMeteter 或简单的脚本做一次接口压测,对比缓存前后的 QPS 变化,这样的数据比任何口头说明都有说服力。
做毕设这几年我最大的体会是:项目不会因为功能多而优秀,而是因为你能说清楚每一个设计决策为什么这么做而优秀。与其堆砌功能,不如把一条核心链路走深。希望这些经验能帮你少踩几个坑,把时间和精力花在真正有回报的地方,祝你顺利。
本文还有配套的精品资源,点击获取