ARTICLE DETAIL

资讯详情

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

SpringBoot+Vue+MySQL人事管理系统搭建实战与二次开发指南

SpringBoot+Vue+MySQL人事管理系统搭建实战与二次开发指南 我从一个实际项目交付的角度来聊聊这套人事系统。市面上叫人事管理系统的源码很多但大多数要么后端老旧、要么前端没分离真要拿来学习或者二次开发折腾环境的时间比看代码的时间还长。这次拿到的是SpringBoot后端Vue前端MySQL的完整配套标题里直接写了可直接运行我先替大家验证了一遍再把整个环境搭建、启动调试、踩坑修复的过程完整记录下来。不管你是刚学JavaWeb的学生比如课程设计、毕业设计还是公司里想快速搭一套人事信息管理后台的开发者这篇文章都能帮你少走弯路把项目真正跑起来。1. 这套人事系统的架构拆解与技术选型逻辑1.1 为什么是SpringBoot而不是SSM以前做这种管理信息系统经典组合是SSMSpringSpringMVCMyBatis配置一堆XML光是理解和维护那些配置就能劝退不少人。SpringBoot最大的价值是约定大于配置内置Tomcat依赖打包也方便spring-boot-starter-web一加一个SpringBootApplication就能跑起来。人事系统这种典型CRUD为主、权限逻辑不算特别复杂的项目用SpringBoot写后端在开发效率和可读性上都比SSM舒服很多。打个比方SSM就像自己买菜、切菜、生火、炒菜每个环节你都要亲自控制SpringBoot像是一个配好了燃气灶和预处理菜品的厨房你只需要负责炒菜的核心动作。对于人事系统这种业务清晰、接口规范、页面多的项目SpringBoot可以让你把精力花在员工管理、部门管理、考勤薪资这些实际业务上而不是纠结配置文件。1.2 VueVuexElementUI的前端组合怎么分工前端用的是Vue全家桶典型的分工是这样的Vue Router管理页面路由比如/employee、/department、/salary这些地址和组件的映射关系。Vuex存放全局状态比如登录用户的token、用户名、权限列表刷新页面后从localStorage恢复。Axios负责API请求一般会封装一个request工具类统一处理baseURL、请求头token注入、响应拦截器里的code判断。ElementUI提供了表格、表单、弹窗、树形控件等现成组件人事管理里最常见的员工列表新增/编辑弹窗删除确认交互用ElementUI能快速组装。前后端分离模式下前端只管渲染和交互后端只提供JSON接口两边通过HTTP通信。这套架构最大的好处是后端接口写好了前端可以并行开发甚至你只想要管理后台的API也可以通过Postman直接调用测试UI不依赖后端本地运行状态。2. 本地跑起来之前的准备工作JDK、MySQL与Node环境2.1 JDK和Maven的版本搭配很多人卡在启动第一步不是代码问题而是环境不匹配。SpringBoot的版本直接决定了JDK的最低要求如果项目用的是SpringBoot 2.x推荐JDK 8或JDK 11Maven用3.6.3左右就好。如果项目用的是SpringBoot 3.x那必须JDK 17Maven也要相对新一些。拿到源码后第一步先看pom.xml里的spring-boot-starter-parent版本号再决定装哪个JDK。我建议直接用JDK 1.8 Maven 3.6.3 SpringBoot 2.x的组合兼容性最省心网上遇到问题也最好搜。Maven安装完记得配阿里云镜像不然首次构建项目要下载一堆依赖从中央仓库拉取的速度会让人崩溃。在settings.xml的mirrors里添加mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror配置好后执行mvn -v验证Maven版本java -version验证JDK两个命令的输出确认无误再往下走。2.2 数据库初始化SQL脚本导入和账号配置人事系统的数据都在MySQL里源码里一般会带一个db目录里面有xxx.sql脚本。先创建数据库再导入SQL顺序别搞反了。mysql -uroot -p CREATE DATABASE IF NOT EXISTS hrms DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci; USE hrms; SOURCE /path/to/sql/hrms.sql;导入完成后重点检查三张核心表员工表employee、部门表department、用户表sys_user。前两张是业务数据最后一张管登录认证。用户表里存的一般是MD5加密后的密码不要直接拿明文去数据库里改后面我会说如何在代码里找到密码规则。数据库账号密码的配置在后端的application.yml或application.properties里默认写法通常是spring: datasource: url: jdbc:mysql://localhost:3306/hrms?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 username: root password: 123456serverTimezone必须加不然MySQL 8.x会报时区错误。MySQL 5.7和8.0的驱动类名有差异8.x和5.x我都遇到过如果连接报Loading class com.mysql.jdbc.Driver相关错误把驱动改成com.mysql.cj.jdbc.Driver。2.3 Node环境和依赖安装的细节前端是Vue项目源码里一般有前端目录可能是web、frontend、vue等名字。需要安装Node.js注意版本要求Vue 2.x项目Node 12~16都可以推荐14或16。Vue 3.x项目Node 16更稳妥。安装完Node后npm会自带。虽然npm是官方包管理器但国内下载速度是个大问题建议直接配淘宝镜像npm config set registry https://registry.npmmirror.com然后在项目前端目录执行npm install如果node_modules已经存在或者从别处拷贝来的项目建议先删掉再重装命令是rm -rf node_modules package-lock.json npm install我遇到过不少用户用Windows系统直接在资源管理器里删除node_modules特别慢用命令行删除反而快这也是个小技巧。3. 后端启动到调试从application.yml到接口自测3.1 application.yml配置的含义与修改位置SpringBoot的配置文件通常放在src/main/resources下名为application.yml或application.properties。这套人事系统里最需要关注这几块配置项作用常见修改点server.port后端服务端口默认8080端口冲突时改这里spring.datasource.url数据库地址和库名IP、端口、库名spring.datasource.username/password数据库账号密码改成你自己的mybatis.mapper-locationsMyBatis的XML文件位置一般不用动jwt.secretJWT签名密钥用于生成和校验登录token改配置文件最需要注意的是缩进格式。YAML对缩进极其敏感很多新手把spring:和datasource:的对齐关系弄错启动就报org.yaml.snakeyaml.error.YAMLException。这里没有捷径老老实实把每一级缩进对齐属性名后的冒号必须加空格。3.2 启动SpringBoot常见的报错和解决顺序后端启动建议用IDEA直接运行Application主类或者命令行mvn spring-boot:run启动报错是常态不用慌按这个顺序排查端口被占用Port 8080 was already in use。解决找到占用进程杀掉或者改server.port。Windows下用netstat -ano | findstr 8080看哪个PID在占用。数据库连不上Cannot create PoolableConnectionFactory。重点检查MySQL是否启动、账号密码是否正确、数据库名是否存在。驱动类找不到ClassNotFoundException: com.mysql.jdbc.Driver。MySQL 8.x需要com.mysql.cj.jdbc.Driver检查pom里的mysql-connector版本然后在配置里写对应的驱动类。MyBatis绑定异常Invalid bound statement (not found)。检查Mapper接口和XML文件是不是同名且在对应目录mapper-locations是否扫到了XML。启动成功后控制台会打印Spring Boot的启动日志最后一行一般是Started Application in xxx seconds加一个Tomcat的端口。这时候可以用浏览器或Postman访问一个公开接口验证。比如后端有/api/auth/login直接POST用户名密码能返回JSON和token说明后端这套已经通了。4. 前端Vue工程的配置与联调从npm run serve到登入页面4.1 src目录结构一眼看懂Vue工程跑起来之前先花五分钟看一下目录结构不然页面报错都不知道去哪找。典型的src目录长这样src/api接口定义文件每个模块对应一个JS文件比如employee.js里封装了getEmployeeList、addEmployee等方法。src/router路由表配置了访问地址和组件的关系。src/storeVuex的store模块。src/views页面组件登录页、员工管理页、部门管理页都在这里。src/utils工具函数比如request.jsaxios封装。如果登录后菜单显示不全或者某些页面打不开多半是router里配置了meta权限字段需要确认当前登录账号的角色是否有对应权限。4.2 跨域配置和API地址修改要点前端默认开发地址是http://localhost:8080Vue CLI默认端口后端是http://localhost:8081或8080。如果两边端口不一致浏览器会因跨域拦截请求导致前端调接口失败。处理跨域有几种方式方式一前端开发环境代理。在vue.config.js里配置module.exports { devServer: { port: 8080, proxy: { /api: { target: http://localhost:8081, changeOrigin: true } } } }这样前端请求/api/xxx时开发服务器会自动转发到后端8081端口浏览器角度看是同一个源不会触发跨域。方式二后端开启CORS。在SpringBoot里加一个配置类允许前端地址跨域访问适合前后端分开部署的情况。很多人第一次在Vue里看到Access to XMLHttpRequest has been blocked by CORS policy的报错就是这个没配置。启动前端npm run serve看到提示App running at Local: http://localhost:8080后浏览器打开用系统自带的初始账号登录。如果登录不了大概率是后端的用户数据里没有这个账号或者密码加密规则不匹配。查一下sys_user表的初始数据通常在SQL脚本的INSERT语句里有注释说明默认密码。5. 真实运行中的踩坑记录与排查链路5.1 MySQL 8.x和5.x的驱动差异我第一次跑这个项目时本地装的是MySQL 8.0而项目里的pom.xml引用的MySQL驱动版本是5.1.47。启动直接报了ClassNotFoundException然后定位到是驱动名的问题。5.x的驱动类是com.mysql.jdbc.Driver8.x改成了com.mysql.cj.jdbc.Driver连接串里的serverTimezone参数在5.x里加不加影响不大8.x必须加。排查链路是这样的首先看完整报错信息关键字是ClassNotFound还是Communications link failure——前者是驱动类路径错了后者是网络或端口问题。这一步区分清楚能省很多时间。我最后把驱动升级到了8.0.27同时把driver-class-name和url里的参数一起改成8.x的写法数据库连接立刻正常。如果你用的是MySQL 5.7可以保留原来的驱动配置千万别盲目升级。5.2 Vue依赖版本引发的编译问题前端npm install完成后npm run serve报了一系列编译错误最典型的一个是Module build failed (from ./node_modules/babel-loader/lib/index.js)。看错误堆栈会发现有些依赖要求的Node版本或Webpack版本和当前环境不匹配。我当时装的Node版本是20而项目是基于Vue CLI 4.x创建的Webpack 4Webpack 4在Node 17以上版本经常报OpenSSLError: error:0308010C:digital envelope routines::unsupported。这是因为Webpack 4使用的哈希算法在OpenSSL 3.0里不兼容。解决这个问题有两种路径降Node版本用nvm安装Node 14切到14再跑完全兼容Vue CLI 4。升级构建配置在package.json的scripts里加NODE_OPTIONS--openssl-legacy-provider。这个方法在Windows系统上要额外处理环境变量不如直接换Node版本省心。这类问题提醒我一个原则二手项目环境就是第一生产力。拿到源码先看清楚前端是Vue 2还是Vue 3、用没用Vite、构建工具是Webpack还是Vite再决定Node版本。5.3 端口占用与本地服务无法访问前端和后端都跑起来后访问页面时按钮点了没反应F12打开控制台看到请求状态一直是pending最后变成failed。用netstat -ano | findstr 端口号一看发现不只是后端端口被占用前端端口也被几个node.exe进程占着。这是因为之前调试时多次CtrlC没有彻底杀掉进程服务重启后又占用了端口。排查端口问题的步骤查看端口占用netstat -ano | findstr 8081根据PID查进程名tasklist | findstr PID杀掉残留进程taskkill /F /PID 具体PID杀掉Node进程树taskkill /F /T /IM node.exe慎用会杀掉所有Node进程还有一种情况是防火墙拦截了端口访问。当后端启动正常但局域网内另一台电脑访问不到接口时检查一下防火墙有没有放行对应端口。本地开发时可以临时关掉防火墙测试排除了这个因素再决定要不要配置安全组规则。6. 基于这套源码二次开发的起点建议6.1 权限模型从哪里改人事系统里权限是核心功能这套代码用的模式通常是RBAC基于角色的访问控制涉及几张表sys_user、sys_role、sys_menu、user_role、role_menu。登录时向后端请求用户信息后端查询该用户角色角色关联菜单权限返回前端一个菜单列表和按钮权限标识。如果你想调整某个账号能看哪些页面直接改数据库里的关联关系就行。比如给普通员工加一个查看考勤的权限要先确认菜单表里有考勤菜单的menu_id然后在role_menu里给对应角色插入记录。改完后重新登录后端会重新加载最新的权限数据。要新增一个角色记得在角色表插入角色信息再关联菜单权限。前端路由里的meta.roles要和角色编码匹配否则前端会没权限访问对应页面。这里有个容易踩的坑数据库里有权限但前端路由没配或者配了路由但菜单表没记录这两个地方是分开控制的需要联动修改。6.2 扩展新模块的时候数据库设计要注意什么这套人事系统一般包含员工管理、部门管理、职位管理、考勤管理、薪资管理等模块。想扩展新模块比如培训管理建议先想清楚数据表结构再写后端接口最后做前端页面。数据库设计遵循几个原则主键统一用自增id或雪花id别搞混合主键代码生成器会懵。时间字段用datetime类型不要用varchar存时间否则排序和范围查询会很痛苦。公共字段预先准备好create_time、update_time、deleted逻辑删除标记最好每张表都有MyBatis-Plus如果集成过可以直接自动填充。关联关系上员工表和部门表用dept_id关联员工表和职位表用position_id关联。新增培训记录表时可以考虑用employee_id关联员工course_name、training_date、score是基本字段。业务上一个员工可以参加多次培训应该把培训记录设计为多行而不是在员工表里加一个trainings的文本字段。后端新增接口时遵循现有controller-service-mapper三层结构Controller负责接收参数、Service处理业务、Mapper和数据库打交道。如果系统集成了代码生成器生成出来的CRUD代码大概率可以直接用但涉及多表关联查询的地方要手写SQL注意用LEFT JOIN而不是INNER JOIN防止关联不到的数据被直接过滤掉。前端新增页面时在views目录下新建Vue文件路由注册进router然后在菜单表插入该菜单记录最后给角色分配菜单权限。这样一套流程下来新模块就能和现有系统长在一起了。7. 我实际测试下来的一些体会这套人事系统能在网上大量流传本身说明它的代码结构是经得起检验的。SpringBootVueMySQL三件套不管你现在是刚学完JavaWeb准备做课设的大学生还是公司里临时需要快速交付一个内部管理后台拿它当脚手架都是很合适的。实际运行中我最深的体会是任何可直接运行的源码真正要跑通环境匹配永远是第一步。JDK、MySQL、Node的版本选对了启动就是五分钟的事版本没对上报错能折腾一宿。另外这套系统的代码风格比较规整Controller层很薄、Service层集中了业务逻辑、MyBatis的SQL都是手写的这对学习来说其实是好事——你能清楚看到一条请求从页面到数据库的全过程而不是被各种自动生成的模板代码淹没了。如果你打算二次开发我建议直接从权限模块入手把RBAC的几张表关系理顺再去看员工和部门的CRUD最后尝试加一个自定义模块走一遍建表-后端接口-前端页面-权限配置的全流程。走完这一步你对这种前后端分离管理系统的理解就不只是会运行而是能改造了。
返回列表