ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于Java的人事管理系统:从环境配置到二次开发全攻略

基于Java的人事管理系统:从环境配置到二次开发全攻略 简介这是一份基于Java Web技术的人事人力资源管理系统完整项目包面向正在做毕业设计、课程设计或期末大作业的计算机专业学生也可作为JSPMySQL入门项目的参考范例。压缩包共116个文件包含69个JSP页面、6个JS脚本、4个CSS样式及若干GIF/JPG图片另有JAR依赖库、SQL数据库脚本、开题报告WORD文档和演示视频整体大小约3.02MB项目结构较完整。系统采用B/S结构在MyEclipse环境下使用JSP、Tomcat和JDBC开发实现了系统管理员、部门信息、员工信息、合同信息、绩效管理含员工工资与奖惩记录和考勤管理等核心模块。已有65人学习适合需要快速理解人资管理系统设计思路、数据库表结构以及后台管理功能实现的读者。下载后可直接参考源码结构、数据库脚本与演示视频能显著节省搭建与调试时间。1. 基于Java的人事人力资源管理系统一个zip解决从开题到答辩的刚需基于Java的人事人力资源管理系统是Java课程设计与毕业设计里的常青树很多同学拿到的交付物是一个zip里面塞了源码、开题报告、数据库文件和演示视频。这东西的价值不在压缩包本身而在于它帮你把需求分析、表结构设计、代码实现和答辩PPT串成了一条线。你只要按正确顺序把它跑通并读懂核心逻辑就能省下至少两周的开发时间。它适合两类人一类是马上要交毕设的学生另一类是刚入行的Java工程师想快速了解一个真实人事系统的数据流和踩坑点。我会按照拿到压缩包后最合理的处理路径从环境配置讲到二次开发全程可复现。2. 拆开压缩包看门道人事系统的功能模块与数据库设计拿到zip后很多人第一反应是双击解压然后打开源码找启动按钮这是个危险动作。如果你不了解这套系统包含哪些功能模块、数据库里有哪些表后面改任何需求都会踩进黑匣子。我会按项目经理验收的视角先带你做一遍静态检查把模块、表、框架和文档对齐再谈怎么跑起来。2.1 人事管理系统到底管什么从登录到报表的六类功能一个能用于答辩或实际运行的人事人力资源管理系统功能不会少于六个模块。用表格列出来会更直观| 模块 | 核心业务 | 关键页面 | | 用户与权限 | 登录、角色、菜单访问控制 | 登录页、后台首页 | | 部门管理 | 部门树维护、员工调岗 | 部门列表、部门编辑 | | 员工管理 | 入职登记、档案修改、离职 | 员工列表、新增/编辑员工 | | 考勤管理 | 打卡记录、请假申请、审批 | 考勤列表、请假审批页 | | 工资管理 | 工资项配置、月度薪资计算 | 工资表、工资详情 | | 报表统计 | 部门人数、考勤异常 | 统计图表 |这张表就是开题报告里“需求分析”的骨架。你拿到压缩包后第一步应该打开开题报告对照这张表看源码里有没有对应的Controller和Mapper。比如员工管理至少要有一个EmployeeController和一个EmployeeMapper.xml如果只有单个Servlet包说明项目比较老代码是JSPServlet风格的后面启动方式略有不同但数据库设计逻辑一致。这里强调模块是因为答辩时老师几乎都会问“你的系统有哪些功能模块”以及“这些模块之间怎么联系”。你如果不能从源码里找出某个功能对应的表结构和页面就说明你没有真正读懂这套系统。2.2 数据库文件不是装饰品核心表结构与表关系数据库文件通常是hrms.sql是整个压缩包里最不该忽略的东西。它不是用来凑内容的而是系统的地基。几乎所有毕业设计指导书里数据库设计都占不少分所以你必须能解释每一张表的用途。我见过最少的人事系统有六七张表多的有二十多张。但核心表逃不开这几张| 表名 | 用途 | 关键字段 | | sys_user | 登录账号 | username, password, role | | t_dept | 部门 | dept_id, dept_name, parent_id | | t_employee | 员工档案 | emp_no, name, dept_id, status | | t_attendance | 打卡记录 | emp_id, work_date, clock_in, clock_out | | t_leave | 请假单 | emp_id, start_date, end_date, status | | t_salary | 工资 | emp_id, base_salary, bonus, deduct |这些表通过外键串起来t_employee的dept_id指向t_dept.idt_attendance的emp_id指向t_employee.id。打开SQL文件搜索“FOREIGN KEY”如果一条外键都没有系统照样能跑但数据一致性会很难保证删除一个部门后员工会变成孤儿数据。下面是一个典型员工表的建表语句很多项目里它长这样CREATE TABLE t_employee ( id int(11) NOT NULL AUTO_INCREMENT, emp_no varchar(20) NOT NULL COMMENT 工号, name varchar(50) NOT NULL COMMENT 姓名, dept_id int(11) DEFAULT NULL COMMENT 部门ID关联t_dept.id, hire_date date DEFAULT NULL COMMENT 入职日期, status tinyint(4) DEFAULT 1 COMMENT 1在职 0离职, PRIMARY KEY (id), KEY idx_dept (dept_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;工号用varchar而不是int是因为工号可能需要带前缀字母比如HR2024001。status用tinyint而不是char是为了统计时可以count不用字符串比较。ENGINEInnoDB保证事务支持CHARSETutf8mb4保证能存生僻字。这些字段设计细节开题报告里不一定写全但答辩时主动说出来会很加分。在导入数据库之前我会先用文本编辑器打开hrms.sql全局搜“CREATE TABLE”数一下表数量再和开题报告里的ER图对照。如果数量对不上说明脚本被改过后面要特别小心具体处理放在避坑章节。2.3 为什么用SSM而不是纯JDBC选型理由基于Java的人事人力资源管理系统最常见的框架组合是SSMSpringSpringMVCMyBatis也有少量用Spring Boot的。为什么不是纯JDBC你只需要想一个场景部门管理页用了树形结构需要递归查询所有子部门纯JDBC写递归就是在Java里反复调ResultSet每层循环都要自己拼SQL用MyBatis的递归查询直接一条SQL搞定代码量能少三分之一。另一个现实原因是事务控制。员工入职登记时至少要做两件事插入员工档案、同时插入账号到sys_user表。如果纯JDBC你很容易忘了commit或漏掉try-catch回滚。Spring的Transactional声明在Service方法上整个方法任意一处出错就全部回滚这是成熟项目该有的姿态。SSM还有一些被人忽略但实际好用的特性SpringMVC把请求参数自动绑定到POJO你写一个Employee参数页面表单里所有字段就自动注入进去了不用手动request.getParameter。MyBatis在XML里写动态SQL比如筛选不同状态的员工一个 标签就解决。这些特性让二次开发更友好新手也能在半小时内找到改哪里。当然如果你拿到的是JSPServletJDBC的老项目也不是不能用。只是连接数据库代码写在某个BaseServlet里改配置时不要全局搜索DriverManager没那么好找。后面讲的数据库导入流程完全适用只是部署结构略有差别。2.4 开题报告和演示视频文档与实物的对照验收压缩包里同时有开题报告和演示视频这个配置有原因开题报告是写答辩文档的基础演示视频是老师的验收依据而源码和数据库文件是你要改的实物。三者之间存在版本一致性风险。我的做法是先看演示视频记录视频里展示的每个操作步骤比如“新增员工时填了哪些字段”“状态下拉框里有哪些选项”。然后打开源码搜索对应的JSP页面或Controller确认代码里是否真的有这些字段。如果视频里有一个“部门树”而代码里查不到buildDeptTree方法说明视频和源码不同步你需要以源码为准重新录一段演示视频否则答辩时就翻车了。开题报告里通常还有一段“系统流程图”那是你说明业务逻辑的依据。我会把流程图和数据库表对应起来每一条流程至少对应一张表的状态变化。比如请假流程t_leave表从status0到status1中间经过审批Action。如果你能把这条链路说清楚老师基本不会再往下追问。3. 把系统跑起来环境配置、数据库导入与启动步骤前期看完了现在进入实操。这一节的目标只有一个让登录页出现在浏览器里。我会按照环境、导入、改配置、部署四步走每一步都给出验证命令避免你走到一半不知道是对是错。3.1 装环境JDK、Tomcat、MySQL的版本搭配建议先检查本机已有的Java、Tomcat、MySQL再看源码依赖最后决定要不要补装。最常见的一套组合是JDK 1.8 Tomcat 8.5/9.0 MySQL 5.7新一点的用MySQL 8.0但驱动和时区参数要跟着调。| 组件 | 推荐版本 | 注意点 | | JDK | 1.8 | 检查JAVA_HOME是否正确 | | Tomcat | 8.5 或 9.0 | 尽量不用Tomcat 10Servlet包名变了 | | MySQL | 5.7 或 8.0 | 8.0要加serverTimezone和新的驱动类 |如果源码是Maven工程打开pom.xml看dependencies里的mysql-connector-java版本。版本号是5.x建议把数据库装成5.7否则连8.0会报驱动错误。如果不想重装数据库就把pom.xml里的驱动改成8.0.26同时修改jdbc.properties具体写法下一节讲。验证JDK环境用这个命令java -version看到1.8.0_xxx就行。如果是openjdk version 11或更高建议用IDE的Project Structure把项目SDK设置成1.8或者装一个1.8的JDK并配置好JAVA_HOME。很多老的人事系统用了javax.servlet包从JDK9开始模块化之后反射和类加载行为有差异没必要拿自己的交付时间赌这个玄学。3.2 用命令行导入数据库文件mysql -u root -p hrms.sql打开终端进入解压后的目录找到以.sql结尾的文件。这一步不要跳过因为有的压缩包会把脚本放在lib目录或doc目录里。先建库再导入mysql -u root -p -e CREATE DATABASE IF NOT EXISTS hrms DEFAULT CHARACTER SET utf8mb4; mysql -u root -p hrms hrms.sql第一行命令的作用创建hrms数据库指定utf8mb4字符集。IF NOT EXISTS是幂等操作重复执行不会报错。第二行命令的作用把hrms.sql里的所有表结构和数据批量执行到hrms库里。符号是Shell输入重定向意思是将文件内容作为标准输入喂给mysql客户端。如果不想每次输密码可以改成mysql -u root -p你的密码 -e ...但密码会留在历史记录里不推荐。更稳妥的做法是回车后交互式输入密码。Windows的cmd和PowerShell也支持重定向没有语法差异。导入成功后快速验证mysql -u root -p hrms -e SHOW TABLES;如果报错先看是不是“ERROR 1049”表示数据库不存在检查第一条命令是否执行成功如果出现“ERROR 1415”说明SQL文件里可能包含反斜杠转义这个不多见遇到再处理。3.3 修改数据库连接配置jdbc.properties里改密码导入数据库后系统还是连不上因为Java代码里默认是别人的数据库密码。找到src/main/resources/jdbc.properties有的叫db.properties打开你会看到类似这样四行jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/hrms?useUnicodetruecharacterEncodingutf-8 jdbc.usernameroot jdbc.password123456我一般只改最后两行换成你本机的MySQL账号和密码。这里有两个高频问题第一如果MySQL是8.0驱动类要改成com.mysql.cj.jdbc.Driverurl里还要加serverTimezoneAsia/Shanghai。因为8.0驱动把旧类名标记为废弃且要求明确时区。完整写法是jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/hrms?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai第二如果密码含特殊字符比如、?、#URL里要转义properties文件也可能误解析。最简单的办法是暂时把密码改成纯数字跑通后再改回来。修改完jdbc.properties别忘了重新编译项目。如果用Maven执行mvn clean packageIDE会重新编译。如果你直接改了target/classes下的文件记得同步改src里的否则下次编译又会被覆盖。3.4 部署到Tomcat并访问启动与管理端入口在IDEA里可以直接配置Tomcat Server但命令行部署更适合定位问题也方便答辩现场演示。先把源码打成WAR包或者把整个Web项目目录放到Tomcat的webapps目录下然后启动Tomcatexport CATALINA_HOME/usr/local/tomcat export JAVA_HOME/usr/local/jdk1.8 $CATALINA_HOME/bin/startup.shWindows下运行set CATALINA_HOMEC:\tomcat %CATALINA_HOME%\bin\startup.bat启动后日志写到logs/catalina.outUnix或自动弹出控制台窗口Windows。看到“Server startup in [xxx] milliseconds”这行说明启动成功。访问路径一般是http://localhost:8080/hrms/login.jsp这里的hrms是项目部署名取决于WAR包文件名。如果包名是HRMS.war路径就是/HRMS。因为大小写导致404的情况很常见所以建议统一把WAR包命名为小写比如hrms.war。如果8080端口被占用Tomcat会启动失败日志里写“Address already in use”。这时修改conf/server.xml里的Connector端口vi $CATALINA_HOME/conf/server.xml找到Connector port8080改成8081重启后再访问http://localhost:8081/hrms/login.jsp。看到登录页后用数据库sys_user表里的账号密码登录。不知道账号可以查mysql -u root -p hrms -e SELECT username,password FROM sys_user LIMIT 5;很多系统默认admin、admin123数据库里密码是MD5加密的看到的是一串32位十六进制字符串。登录成功后整个系统就算跑通了。4. 读懂核心代码登录校验、员工分页与考勤审批的Java实现跑通只是起点答辩和二次开发都需要你读代码。这一节挑三个最具代表性的链路把Controller、Service、Mapper三层的关系讲清楚。读懂了这三块其他人事系统的其他模块也就能顺藤摸瓜。4.1 从LoginController到UserMapper登录流程的完整链路登录是所有人事系统必须经过的第一关也是理解SpringMVC请求映射的最佳入口。以SSM风格为例Controller层通常是这样Controller public class LoginController { Autowired private UserService userService; RequestMapping(/login) public String login(String username, String password, HttpSession session) { SysUser user userService.login(username, password); if (user ! null) { session.setAttribute(loginUser, user); return redirect:/index; } return redirect:/login.jsp?error1; } }逻辑说明这里没有在Controller里做密码校验而是把校验逻辑放到了userService.login里Controller只关心登录成功与否。redirect:/index而不是直接返回index.jsp好处是刷新页面时不会重复提交登录表单这是一个值得保留的好习惯。如果你拿到的源码直接返回视图也别急着改先确认业务逻辑是否允许重复提交。Service层的登录实现通常长这样public SysUser login(String username, String password) { SysUser user userMapper.findByUsername(username); if (user ! null user.getPassword().equals(MD5Utils.md5(password))) { return user; } return null; }参数说明MD5Utils是项目自带的工具类有的叫MD5Util或DigestUtils。二次开发时不要把密码验证逻辑改成明文比较因为数据库里存的不是明文。如果项目用了加盐比如password字段是盐值MD5比较时也要拼接盐值。看注册时怎么存的找到注册的Service代码就能反推。4.2 员工分页查询手写limit与PageHelper分页的差别员工管理页面的核心是全字段分页查询。用PageHelper的项目核心代码就三行PageHelper.startPage(pageNum, pageSize); ListEmployee employees employeeMapper.selectEmployeesByKeyword(keyword); PageInfoEmployee pageInfo new PageInfo(employees);逻辑说明startPage后面的第一句SQL会被PageHelper拦截自动拼接limit。pageInfo里封装了总记录数、总页数、当前页等参数前端可以直接用。这里有一个很关键的约束startPage和selectEmployees之间不能插入其他MyBatis查询否则分页会作用在错误的SQL上数据量少的时候看不出问题数据量一大就出现奇怪的分页结果。没有PageHelper的老项目分页是手动拼的int offset (pageNum - 1) * pageSize; ListEmployee employees employeeMapper.selectEmployees(offset, pageSize);对应的Mapper.xmlselect idselectEmployees resultTypecom.hrms.entity.Employee select * from t_employee where if testkeyword ! null and keyword ! and name like concat(%, #{keyword}, %) /if /where order by id limit #{offset}, #{pageSize} /select这里最容易翻车的是limit的语义第一个数字是偏移量第二个是条数。如果直接把pageNum传进去第一页正常第二页就会跳过1条。所以必须用(pageNum - 1) * pageSize。另外like查询用concat拼%不要直接写%#{keyword}%MyBatis会报语法错误或查不到数据。4.3 考勤审批状态机请假单如何从待审变为通过考勤模块最值得学的是业务状态校验。一个请假单往往有0待审、1通过、2驳回三种状态甚至会扩展到3销假。审批操作必须以数据库中的当前状态为前提Transactional(rollbackFor Exception.class) public void approveLeave(Integer leaveId, Integer operatorId) { Leave leave leaveMapper.findById(leaveId); if (leave null) { throw new RuntimeException(请假单不存在); } if (!0.equals(leave.getStatus())) { throw new RuntimeException(该单已审批不能重复操作); } leave.setStatus(1); leave.setApproveBy(operatorId); leave.setApproveTime(new Date()); leaveMapper.updateStatus(leave); }逻辑说明第一条if查的是记录是否存在第二条if查的是状态机约束保证只有待审的单子能通过。为什么用0.equals(...)而不是leave.getStatus() 0因为status在数据库里是char或varcharJava里用String接收字符串比较必须用equals。如果用永远false就会反复走异常分支。Transactional(rollbackFor Exception.class) 表示对所有Exception回滚。如果只写TransactionalSpring默认只在运行时异常回滚检查异常不会触发回滚这在审批类业务里是隐患。考勤打卡的边界同理员工离职后不能再往考勤表插入记录。这个判断应该放在Service层而不是依赖前端隐藏打卡按钮。接口可以被绕过状态校验必须做在服务端这也是答辩时老师喜欢问的点。5. 避坑手册从导入数据库到二次开发的5个典型翻车点这一节全是我处理这类人事系统时的真实踩坑记录按“现象→原因→解决”写每一条都值得收藏。如果你在导入或启动阶段遇到问题优先来这里对号入座。5.1 连不上数据库驱动和时区是必踩的坑现象Tomcat启动过程中项目部署成功但第一次访问登录页时白屏或500后台日志出现CommunicationsException: Communications link failure或者SQLException: Access denied for user rootlocalhost。原因最多见的是MySQL 8.0数据库配了MySQL 5.x驱动。这两个版本的driver类名不一样5.x是com.mysql.jdbc.Driver8.0是com.mysql.cj.jdbc.Driver用旧驱动连新库驱动管理器直接不认。第二种常见原因是url里没有serverTimezoneMySQL 8.0服务端会拒绝连接报Server returns invalid timezone。第三种就是账号密码本身不对。解决打开pom.xml或lib目录确认驱动jar包版本。Maven项目直接把依赖改成dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.26/version /dependency同时把jdbc.properties里的driver和url按第三章3.3节改掉然后重新编译再启动Tomcat。如果还是Access denied就去MySQL命令行执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码;这是MySQL 8.0默认认证插件caching_sha2_password导致的兼容问题老驱动不认这个插件。5.2 中文乱码三个地方的编码要一致现象员工列表里中文名字变成???或者出现æµ这种拉丁字符但数据库命令行里查询却是正常的。原因这是典型的“三处不同步”。第一处是数据库连接url里的characterEncodingutf-8第二处是Tomcat接收HTTP请求时的URIEncoding第三处是数据库表和字段自己的charset。只要有一处不是utf8字符串在传输过程中就会被错误转码。很多老项目在server.xml里没配URIEncoding而页面本身用UTF-8于是浏览器提交的中文到了服务端就变成乱码。解决统一三处。连接url加?useUnicodetrueamp;characterEncodingutf-8Tomcat的server.xml里给Connector加属性Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 URIEncodingUTF-8 /数据库表字符集用alter table改一遍ALTER TABLE t_employee CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;改完重导数据。如果之前已经导入了乱码数据需要先清空再重新导入否则坏字节数据改了字符集也救不回来。5.3 启动后访问404项目部署路径与上下文不符现象Tomcat日志显示启动成功但访问http://localhost:8080/hrms/login.jsp得到404访问http://localhost:8080/却能打开Tomcat默认首页。原因默认首页能打开说明服务本身没事404是因为没有找到你访问的上下文路径下的资源。通常有两个来源一是WAR包文件名和你访问的路径不一致比如包名是hrms.war你访问/HRSTomcat在Windows下不区分大小写在Linux下严格区分所以Linux服务器上必404。二是把项目文件夹拷贝到webapps下时复制了一层比如webapps下多了一个hrms/hrms实际有效路径是/hrms/hrms。解决命令行下先看webapps目录ls -la $CATALINA_HOME/webapps/确认项目文件夹或WAR包的名字然后访问完全同名的路径。如果是IDEA部署打开Run Configuration检查Deployment的Application context把listen下的URL路径改成和context一致我一般直接设成/hrms。注意如果包名是Root.war访问路径不是/Root而是空根/别搞混。5.4 演示视频和数据库脚本版本不同步字段对不上现象跟着演示视频操作走到“新增员工”时控制台报SQLException: Unknown column email in field list但视频里明明有邮箱字段。原因这是压缩包最常见的血泪经验。作者可能在视频录制后改了代码或数据库但没有更新视频。你按视频操作代码里的insert语句引用了一个数据库脚本中没有的字段数据库报未知列。解决先用DESC确认真实表结构mysql -u root -p hrms -e DESC t_employee;再打开源码里对应的Mapper.xml搜索该表的insert语句。把insert语句里出现的字段名和DESC结果逐一对照。如果代码里多出某个字段有两种处理办法要么在数据库补字段要么删除代码里的引用。我建议以数据库为准因为开题报告的数据字典一般和数据库匹配。改完代码重新编译部署。另外把差异记到开题报告的“系统设计变更”章节答辩时能用来证明你做了调试和优化。5.5 二次开发改错字段类型字符串当数字用现象你给员工表加一个“手机号”字段数据库里定义了varchar(20)Java属性却写成了Integer前端输入13800138000提交后直接报NumberFormatException。原因MyBatis的自动映射会把数据库的varchar转为Java的String但如果你写的是IntegerTypeHandler会尝试调用Integer.parseInt长数字超过int范围直接溢出或者因为手机号带非数字字符而报类型转换异常。更隐蔽的情况是数据库里用char(1)存开关状态Java里用Boolean接收MySQL驱动对char-Boolean的转换可能返回空字符串导致NPE。解决写实体类前先对着数据库列类型做映射决策。varchar一律用Stringint/integer用Integertinyint(1)可以用Boolean但要注意空值日期用Date或LocalDate不要用String接收日期再手动parse。改表字段时优先用ALTER TABLE修改已有列不要删表重建否则外键关系全部丢失。改完在Mapper.xml里加typeHandler或直接改resultMap的jdbcType保持和Java类型一致。6. 验证系统不只是看演示视频用日志和接口测试快速确认核心功能6.1 开启MyBatis日志让真实SQL替你看路拿到系统后我习惯先把日志级别调到DEBUG让MyBatis把每次执行的SQL打出来。在log4j.properties或logback.xml里加上log4j.logger.org.mybatisDEBUG log4j.logger.com.hrms.mapperDEBUG重启Tomcat后登录一次控制台就会出现这样的输出 Preparing: select * from sys_user where username ? Parameters: admin(String) Columns: id, username, password, role Row: 1, admin, e10adc3949ba59abbe56e057f20f883e, 1 Total: 1看到这个说明数据库连接、Mapper映射、参数绑定全部正常。如果Parameters显示null说明前端参数没绑定到方法变量里如果Row长度为0说明账号不存在。这个方法比一遍遍点页面判断问题快得多所有老项目我都会先这么打开一次再说。6.2 用curl做一次登录接口冒烟测试如果登录接口是表单POST且没有验证码可以用curl快速验证账号密码是否正确、会话是否建立。在命令行执行curl -i -X POST http://localhost:8080/hrms/login \ -d usernameadminpasswordadmin123 \ -b cookies.txt \ -c cookies.txt参数说明-i表示显示响应头-b从cookies.txt读取Cookie-c把服务器Set-Cookie写入cookies.txt两者组合就是模拟浏览器的会话保持。如果响应头里出现302和Location:/index说明登录成功如果返回200且页面里有error字样说明密码不对。当然不是所有系统都接受这种简单POST有的登录接口还做了Token或验证码。那你就老老实实打开页面看Network面板找到真正的登录请求参数。但无论如何学会用命令行工具去验证接口是一个Java工程师从“能跑通”走向“能调试”的分水岭。我的教训是拿到任何源码压缩包先别急着打开演示视频。先看开题报告里写的运行环境按那个环境装再导入数据库启动后开日志看真实SQL最后用curl敲一遍核心接口一切正常后再看视频对照。这一套流程能帮你避开绝大多数因为版本不一致导致的深夜崩溃也希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进