ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Java毕业设计宿舍管理系统:部署改造与答辩全指南

2026/9/28 18:12:03 拓冰建站 浏览量
Java毕业设计宿舍管理系统:部署改造与答辩全指南 简介面向Java毕业设计的班主任学生宿舍管理系统完整资料包包含SSM框架项目源码、数据库设计说明书、需求分析说明书、详细设计说明书、项目计划书与答辩PPT模板适合计算机相关专业学生完成毕业设计或课程设计参考。资源共44个文件以JSP页面、Java源码、Word文档、PPT模板、数据库文件为主压缩包约16.35MB目录结构清晰便于分类查找与复用。系统实现学生基本信息管理学号、姓名、性别、班级等信息的查询与增删改、班级与个人积分考核、辅导员日常事务登记、家长信息维护、消息发布与留言板、用户权限设置等功能并支持数据导入导出和远程访问配套文档覆盖需求分析、数据库设计、详细设计与项目计划可导入Eclipse或IntelliJ IDEA配合JDK1.8及Maven运行便于理解整体设计思路并在基础上进行二次开发。已有50人学习下载适合用作班主任宿舍管理类毕业设计项目的完整参考。1. 毕业设计选它值不值班主任学生宿舍管理系统到底在解决什么问题每到毕业设计季都有一大批人打开这个压缩包班主任学生宿舍管理系统里面是源代码、论文和 PPT 模板。一批 java 文件、一堆 XML 配置和一个 .sql 脚本新手第一眼往往是「从哪开始」。这套系统本质是一个标准的 Java Web 毕业设计用 JSP/Servlet 或 SSM 做后台让班主任管理本班学生的宿舍分配、查寝归寝、卫生评分和违纪记录学生端再给一个报修和查询入口。它最值得做的不是「用得多好」而是「跑通 改造成自己的」。拿到源代码只是起点真正要交付的是能演示的系统、能讲清的论文、不像照抄的 PPT。下面按我带这类项目的经验从部署、改功能到躲坑、答辩逐段拆开讲适合做 Java 毕设的人也适合拿完整案例练手的初学者。2. 先拆功能再选技术栈三种角色、六个模块和 5 张核心表怎么定拿到压缩包我不会急着解压跑代码而是先花十几分钟把需求文档和数据库脚本过一遍。班主任学生宿舍管理系统听起来功能不少实际业务边界很清楚围绕「宿舍」这个资源、「学生」这批人以及查寝、卫生、违纪、报修这几类过程数据。把它们拆清楚后面改代码、写论文都不容易散。2.1 三种角色与六个核心模块班主任到底能管什么「班主任」三个字决定了它跟普通宿管系统不一样不是全校一盘棋而是按班级划数据权限。登录进去一般有三种角色角色能做什么不能做什么班主任查本班学生档案、分配宿舍、看查寝和卫生评分、登记违纪、导出报表看其他班级数据宿管员整楼查寝登记、卫生检查、处理报修改学生关键档案学生看自己的宿舍号床位、提交报修、查违纪记录进后台管理六个核心模块分别是学生档案、宿舍分配、查寝归寝、卫生评分、违纪记录、报修处理。查寝和卫生评分是班主任日常用得最多的两个也是论文需求分析里最好写的部分它们都有明确的状态流转能画业务流程图能列用例表。这里提醒一句如果源码里权限只做了菜单显示控制后台 Controller 没有按班级过滤就会出现 A 班班主任查到 B 班学生的问题。这种 bug 演示时不容易暴露但答辩时老师翻代码很容易看出来。常见修法是在 Service 层统一拼一个 classId 条件而不是在每个 Mapper XML 里各写各的。2.2 SSM 还是 JSPServlet毕业设计技术栈怎么选不翻车打开源码第一步先看根目录有没有 pom.xml。有 pom.xml是 Maven 工程大概率是 SSMSpring SpringMVC MyBatis或 Spring Boot没有则是一堆 src 目录加 jar 包通常是 JSP Servlet JDBC 的老写法。这两种在很多 java 课程设计案例源码里都常见。对比项JSP Servlet JDBCSSM上手成本低代码直白中配置文件多分层容易堆在 Servlet 里Controller/Service/Mapper 清晰答辩风险会被追问 JDBC 连接、SQL 注入会被问 IOC/AOP/事务都是 java 面试八股文常客扩展加功能要复制代码加表、加接口顺手我的建议论文还没定的优先选 SSM 版本。它不是更高级而是把面向对象编程 java 的分层思想落得完整。论文写「系统设计」时Controller 对应表示层、Service 对应业务层、Mapper 对应数据访问层一章就成型了。答辩被问「为什么用 MyBatis」也能答出解耦 SQL、参数映射、动态 SQL 这些点比「别人都这么写」强得多。如果压缩包里是 Spring Boot 版本更省事IDEA 里直接运行带 SpringBootApplication 的主类不用单独配 Tomcat。但 Spring Boot 的包结构和配置方式跟 SSM 差别很大别拿 SSM 的思路硬套后面第 3 章我会专门说差异。2.3 核心表结构设计用 5 张表把宿舍业务串起来数据库脚本是这个项目最值得读的文件因为不管框架怎么换表结构基本通用。核心一般是这 5 张班级表、学生表、宿舍房间表、查寝记录表、报修表卫生评分和违纪记录可能会并进查寝表或单独成表。-- 学生表宿舍业务的绝对主体 CREATE TABLE t_student ( student_id INT PRIMARY KEY AUTO_INCREMENT COMMENT 学号, student_name VARCHAR(32) NOT NULL COMMENT 姓名, gender TINYINT NOT NULL DEFAULT 0 COMMENT 0男 1女, class_id INT NOT NULL COMMENT 班级ID外键指向班级表, dorm_id INT COMMENT 宿舍ID没分配时为空, bed_no VARCHAR(8) COMMENT 床位号如A区301-02, phone VARCHAR(16) COMMENT 联系电话, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生档案;学生表用 dorm_id 关联宿舍房间表而不是直接存「301」这种字符串。理由是床位是否住满要靠宿舍表的 occupied 和 capacity 两个数字来算存字符串的话统计空床位数得写一堆 LIKE性能差还容易错。-- 宿舍房间表占用数要能被 UPDATE 原子修改 CREATE TABLE t_dorm_room ( room_id INT PRIMARY KEY AUTO_INCREMENT, room_no VARCHAR(16) NOT NULL COMMENT 房间号, building VARCHAR(16) COMMENT 楼栋, gender TINYINT NOT NULL DEFAULT 0 COMMENT 0男寝 1女寝, capacity INT NOT NULL DEFAULT 6 COMMENT 可住人数, occupied INT NOT NULL DEFAULT 0 COMMENT 已住人数, is_public TINYINT DEFAULT 1 COMMENT 1启用 0停用 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT宿舍房间;-- 查寝记录表一天一人一条靠唯一键挡重复 CREATE TABLE t_checkin ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL COMMENT 学生ID, checkin_date DATE NOT NULL COMMENT 查寝日期, status TINYINT NOT NULL DEFAULT 0 COMMENT 0未归 1正常 2晚归, remark VARCHAR(128) COMMENT 备注, recorder VARCHAR(32) COMMENT 登记人姓名, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_stu_date (student_id, checkin_date) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT查寝登记;查寝表上那个唯一键 (student_id, checkin_date) 是我反复强调的设计。没有它连点两次「登记正常」就会插两条记录「实到人数」统计直接翻倍。第 4 章的 upsert 写法依赖这个键。-- 报修表过程数据单独成表状态由宿管员推进 CREATE TABLE t_repair ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL COMMENT 报修学生, content VARCHAR(255) NOT NULL COMMENT 报修内容, status TINYINT DEFAULT 0 COMMENT 0待处理 1处理中 2已完成, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, finish_time DATETIME COMMENT 完成时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT报修工单;报修是典型的过程数据一个学生可以报修多次每次有自己的状态流转必须单独成表。我最早改这类项目时偷懒在学生表里塞了 repair_content 字段一个学生报修两次就把旧记录覆盖了数据全乱后来才老老实实拆出来。3. 把源代码跑起来JDK、MySQL、Tomcat 与 IDEA 部署全流程这一章的目标是让项目在本地 30 分钟内跑起来不要求先理解每一行代码。我见过太多人卡在第一步环境版本对不上启动日志报错看不懂最后怀疑源码有问题。其实绝大多数翻车都是版本和配置问题跟代码本身没关系。3.1 环境版本搭配JDK 8 MySQL 5.7 Tomcat 8.5 为什么最稳先给出一套我验证过很多次的搭配能不动就不动组件推荐版本为什么不推荐更高JDK1.88u 系列绝大多数毕设源码按 Java 8 编译JDK 17 会踩 javax 包缺失、反射受限的坑MySQL5.78.0 要换驱动、要配时区新手容易在这踩坑Tomcat8.5 或 9.0Tomcat 10 起包名改成 jakarta.servlet老项目直接 NoClassDefFoundErrorIDEA2021 及以上自带 Tomcat 集成配置路径好找Maven3.6 以上选带 pom.xml 的源码需要它先检查本机三个命令的输出java -version mvn -v mysql --version如果 java 版本是 17 或更高别急着继续先装一个 JDK 8 并把 JAVA_HOME 指过去。IDEA 里「Project Structure → SDK」可以同时装多个 JDK 在项目里切换不影响其他项目。MySQL 8.0 不是不能用但要同时满足「驱动升到 8.x 连接串带 serverTimezone」两个条件新手没必要在这个环节增加变量。3.2 导入数据库脚本并改连接配置启动前的必做三步第一步建库并导入 .sql 文件。用命令行或 Navicat 都行命令行的执行逻辑最透明CREATE DATABASE dormitory DEFAULT CHARACTER SET utf8mb4; USE dormitory; SOURCE D:/dorm.sql;SOURCE 后面写你解压出来的脚本路径注意 Windows 路径分隔符用正斜杠。导入完成后用 SHOW TABLES; 数一下表数量跟你论文里数据表设计章节对得上说明脚本没问题。提示MySQL 5.7 里 utf8mb4 是首选字符集别用 utf8。utf8 在 MySQL 里实际是 utf8mb3存不下部分生僻字和特殊符号后期改表很麻烦。第二步改数据库连接配置。SSM 项目一般在 src/main/resources 下的 jdbc.propertiesSpring Boot 在 application.properties 或 application.yml。核心就四项jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/dormitory?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的密码url 里的 characterEncodingutf8 管数据库读写中文serverTimezoneAsia/Shanghai 管日期时间类型的时区偏差。这两个参数不加后面第 5 章的乱码和日期错位坑基本必踩。第三步确认连接池配置生效。有些项目把数据源写死在 spring-context.xml 里而不是 properties 文件。搜「dataSource」看它引用的是哪个文件别改了一处发现另一处还写着旧密码。XML 里 url 的 符要写成 这也是老项目最常见的低级报错源之一。bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName valuecom.mysql.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/dormitory?characterEncodingutf8amp;serverTimezoneAsia/Shanghai/ property nameusername valueroot/ property namepassword value123456/ /bean3.3 在 IDEA 里配置 Tomcat 并成功启动war exploded 怎么选这是整套流程最容易卡住的一步按顺序做IDEA 打开项目有 pom.xml 选它打开右下角等 Maven 依赖下载完别在依赖还在转圈时继续操作。点 Run → Edit Configurations → 左上角 → Tomcat Server → Local。Server 标签页里 Application server 选你本机 Tomcat 目录没显示就点 Configure 手动选。Deployment 标签页 → 点 → Artifact → 选择 xxx:war exploded。下面 Application context 填 /dorm或者留空表示根路径。点启动看 Console 出现 Server startup in [xxx] milliseconds 才算成功。浏览器访问默认登录页出得来就通了。重点说下第 4 步的 war exploded。它跟 war 的区别是war 是打包后整体部署改一个 JSP 页面要重新 buildwar exploded 是解包目录形式JSP 和静态资源改了直接刷新浏览器就能看到调试毕设项目省太多时间。这是我从带过的项目里总结出来的习惯凡是需要反复调页面的一律选 exploded。启动后如果日志停在「信息: Deploying web application archive」不动多半是数据库连不上回 3.2 改配置。如果直接报端口占用跳到第 5 章看 5.3。4. 把功能改出自己的味道宿舍分配、查寝登记和报表导出的代码改造答辩最怕被问「哪个功能是你自己写的」。答案最好是有三个一个算法、一个状态处理、一个报表导出。这三样改完代码风格跟原版有明显区别介绍起来也自然。4.1 自动分配宿舍用流式写法替换手动指定原项目常见的做法是班主任在页面上拉框选房间、再填床位号数据录入慢而且容易把两三个学生分到同一张床。改成自动分配代码量不大但能讲出点名堂。核心逻辑用 java 基础里的 Stream 就能写/** * 自动分配按性别过滤出可用房间再按已住人数升序取第一个。 * rooms 来自 t_dorm_roomoccupied 表示已住人数capacity 表示可住人数。 */ public AssignResult autoAssign(Student stu, ListDormRoom rooms) { ListDormRoom available rooms.stream() .filter(r - r.getGender().equals(stu.getGender())) // 性别匹配 .filter(r - r.getOccupied() r.getCapacity()) // 还有空床 .sorted(Comparator.comparingInt(DormRoom::getOccupied)) // 人少的优先 .collect(Collectors.toList()); if (available.isEmpty()) { return AssignResult.fail(该性别宿舍已满请先扩容); } DormRoom target available.get(0); // 关键的一步让数据库原子地占用一个床位防止并发超员 int rows dormRoomMapper.increaseOccupiedIfEnough(target.getId()); if (rows 0) { return AssignResult.fail(床位刚刚被占满请重新分配); } // 重新查一次拿到最新的占用数来生成床位号 DormRoom latest dormRoomMapper.selectById(target.getId()); return AssignResult.ok(latest.getRoomNo(), latest.getBedPrefix() latest.getOccupied()); }filter 两次和 sorted 一次把「选房」这件偏操作的事变成了一段可读的声明式逻辑。最后那个 increaseOccupiedIfEnough 是精髓它对应的是面试里常问的「java 怎么保证数据一致性」两个班主任同时给不同学生分配同一间房JVM 里 if 判断挡不住并发得让数据库来扛。对应的 Mapper XML 用条件更新update idincreaseOccupiedIfEnough UPDATE t_dorm_room SET occupied occupied 1 WHERE room_id #{roomId} AND occupied lt; capacity /updateaffected rows 返回 1 说明床位占成功了返回 0 说明这条 UPDATE 被条件挡住房间已经在并发下满了。这套写法比「先查再改」靠谱也是我后来写生产代码一直在用的习惯。提示autoAssign 里 increaseOccupiedIfEnough 之后别忘了在 Service 层加 Transactional。分配宿舍涉及「房间占用数 学生 dorm_id 床位号」三个写入任何一个失败都要整体回滚否则会出现房间说住了 5 人但只有 4 个学生挂着这个房间的脏数据。4.2 查寝登记的状态流转当天记录怎么做到不重复查寝业务的边界是同一学生同一天只能有一条状态重复提交应该变成更新而不是新增。这正是 t_checkin 表唯一键发挥作用的地方。/** * 登记查寝存在当天记录就更新状态不存在就插入。 * 依赖 t_checkin 表的唯一键 (student_id, checkin_date) 兜底。 */ public void recordCheckin(Integer studentId, Integer status, String remark) { CheckinRecord record checkinMapper.selectByStudentAndDate(studentId, LocalDate.now()); if (record null) { checkinMapper.insert(new CheckinRecord(studentId, LocalDate.now(), status, remark)); } else { CheckinRecord update new CheckinRecord(); update.setId(record.getId()); update.setStatus(status); update.setRemark(remark); checkinMapper.update(update); } }select 一次再决定 insert 还是 update叫 upsert 的朴素实现。它有个小窗口期极端并发下两次都 select 到 null两次都 insert第二次会被唯一键拦下来报异常。对毕业设计来说异常比脏数据好接受只要给这个异常加个友好提示就行你可以故意点两次提交看提示这也算一个能演示的细节。顺带说一句事务别忘了。recordCheckin 里如果有多个 Mapper 操作建议在 Service 层加 Transactional。要是用 JSPServlet 的老代码没有注解可用就手动在 try 里 connection.setAutoCommit(false)catch 里 rollback。查寝登记算写操作一致性比性能重要。4.3 查寝报表导出用 POI 生成 Excel 统计表很多同学会搜「java poi word 能生成图表吗」这类问题实际毕业设计里导出最多的是 Excel。给班主任加一个「按班级按日期」导出一张查寝汇总表的功能用 Apache POI 的 XSSFWorkbook 就好。/** * 导出某班级某天的查寝统计 Excel。 * stats 是 Mapper 里 group by 后查出来的对象列表。 */ public void exportCheckinReport(Integer classId, LocalDate date, HttpServletResponse response) { ListCheckinStat stats checkinMapper.statByClassAndDate(classId, date); try (XSSFWorkbook workbook new XSSFWorkbook()) { XSSFSheet sheet workbook.createSheet(查寝统计- date); // 第一行是表头 Row header sheet.createRow(0); header.createCell(0).setCellValue(班级); header.createCell(1).setCellValue(应到人数); header.createCell(2).setCellValue(实到人数); header.createCell(3).setCellValue(未归人数); header.createCell(4).setCellValue(晚归人数); // 从第二行开始写数据 int rowIndex 1; for (CheckinStat stat : stats) { Row row sheet.createRow(rowIndex); row.createCell(0).setCellValue(stat.getClassName()); row.createCell(1).setCellValue(stat.getTotal()); row.createCell(2).setCellValue(stat.getNormal()); row.createCell(3).setCellValue(stat.getAbsent()); row.createCell(4).setCellValue(stat.getLate()); } // 告诉浏览器这是一个要下载的 .xlsx 附件 response.setContentType( application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setHeader(Content-Disposition, attachment;filenamecheckin_ date .xlsx); workbook.write(response.getOutputStream()); } catch (IOException e) { log.error(导出查寝报表失败, e); } }POI 里最绕的是行和列都是 0 开始的数字坐标createRow(0) createCell(0) 就是 A1 单元格这个对应关系搞清楚其他都是体力活。文件名如果有中文记得对文件名做 URLEncoder.encode否则部分浏览器下载会乱码。这套写法同样适用于导出学生名单、违纪汇总护着一张模板改字段就行。5. 避坑手册部署 Java 宿舍管理系统的 5 个典型报错与排查这一章全部来自真实翻车现场每一条我都按「现象 → 原因 → 解决」写。5.1 MySQL 8.0 认证方式导致数据库连接失败现象Tomcat 启动后日志报 Access denied for user rootlocalhost (using password: YES)或者报 ClassNotFoundException: com.mysql.jdbc.Driver。原因MySQL 8.0 默认用 caching_sha2_password 认证而老项目自带的 mysql-connector-java 5.x 驱动只认 mysql_native_password如果驱动是 8.x 但没配置 serverTimezone又会报 The server time zone value xxx is unrecognized 这种时区错。解决二选一。一是把驱动 jar 换成 8.x并把 jdbc.url 改成 jdbc:mysql://localhost:3306/dormitory?serverTimezoneAsia/ShanghaiuseSSLfalse驱动类改 com.mysql.cj.jdbc.Driver。二是保持 5.7 数据库在控制台把用户认证切回去ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;我一般推荐先查 MySQL 版本再决定别上来就改数据库。5.7 环境就不用折腾。5.2 页面中文乱码改了三处编码才消停现象登录后页面上的中文全是问号或「锟斤拷」往数据库插中文也变成 ???。原因这不是单点问题。JSP 页面响应用了 GBK、Servlet 没调 request.setCharacterEncoding、数据库表建成了 latin1、JDBC 连接串没有 characterEncoding任何一环掉了都乱码。解决按顺序统一成 UTF-8。第一步JSP 头部确认 % page pageEncodingUTF-8 %第二步web.xml 里加 Spring 的 CharacterEncodingFilterforceEncoding 设为 true第三步数据库连接串加 characterEncodingutf8第四步检查已有表是不是 utf8mb4用 SHOW CREATE TABLE t_student \G 看 DEFAULT CHARSET不是的话 ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4。四步做完重启基本消停。乱码是最玄学的问题现象一样但原因往往不一样排查时按这个顺序从上到下查别瞎改。5.3 Tomcat 启动秒退端口占用与日志排查现象IDEA 里点完启动控制台滚几行然后报 Port 8080 was already in use或者没有任何报错但浏览器死活打不开。原因之前调试的 Tomcat 实例没关或者本机有别的进程占了 8080。Windows 上还有一些软件喜欢占 8080比如某些视频服务。解决先看谁占的端口netstat -ano | findstr 8080 taskkill /F /PID 这里填进程号不想杀进程就直接改 Tomcat 的端口在 conf/server.xml 里把 Connector 的 port 改成 8081。改完记得浏览器访问地址也换成 8081这俩不一致是低级的翻车点。5.4 JDK 版本过高或 Tomcat 10 换了包名导致编译失败现象代码编译时报 java: error: invalid source release: 17或者程序包 javax.servlet 不存在运行时报 NoClassDefFoundError: javax/servlet/...。原因老毕设项目按 Java 8 写的你本机默认 JDK 是 17编译器级别对不上Tomcat 10 开始把 servlet API 包名从 javax.servlet 改成 jakarta.servlet用 8/9 写的项目在 10 上启动必然找不到类。解决有条件就装 JDK 8在 IDEA 的 Project Structure 里把 Project SDK 和 Module language level 都指到 8。用 Maven 的在 pom.xml 里加properties maven.compiler.source1.8/maven.compiler.source maven.compiler.target1.8/maven.compiler.target /propertiesTomcat 就换回 8.5 或 9.0。判断标准很简单源码里 import javax.servlet 就用老 Tomcatimport jakarta.servlet 才是配套 10 的新代码。5.5 启动成功但页面 404Application Context 没对上现象Tomcat 明明显示 startedIDEA 也跳出了浏览器但页面是 404。原因Deployment 里没添加 Artifact或 Application context 填了 /dorm 但访问的是 http://localhost:8080/又或者 JSP 里的路径写死了绝对路径、没带 contextPath。解决打开 Edit Configurations 的 Deployment 标签页确认有 xxx:war explodedApplication context 和浏览器地址保持一致。如果项目里页面跳转用 /login.jsp 这种斜杠开头路径改成 ${pageContext.request.contextPath}/login.jsp否则部署到带 context 路径时跳转全部丢失。6. 答辩前怎么验证和演示三个让系统不翻车的检查习惯到答辩前一周功能通常已经能跑。但「能跑」和「能演示」是两回事我吃过亏所以这章讲验证方法。6.1 演示前必过的冒烟检查清单按下面这张表走一遍每项通过再进下一项检查项怎么操作通过标准三种角色登录班主任、宿管员、学生账号各登录一次再退出菜单权限肉眼可见不同查寝登记闭环造 3 个学生分别登记正常、未归、晚归列表状态正确统计数字对得上宿舍分配用一个满员性别的房间做自动分配出现「宿舍已满」友好提示报修闭环学生端提交一条宿管员端改状态状态流转到已完成Excel 导出点导出并打开文件表头和数据无乱码检查时用真实感的演示数据别用 abc 这种测试数据。答辩现场老师会盯屏幕看到「张三 2024 级计算机 1 班」比看到「test1」可信得多。建议插入至少 20 个学生、3 天的查寝记录、几条报修记录。演示时先讲「解决什么问题」再实操一个完整流程最后展示导出的 Excel。6.2 给答辩加分的一处小改造如果时间只够改一处我建议改登录密码的存储方式。原项目多半是明文存数据库你把它改成摘要存储// 注册时不存明文存摘要 String digest DigestUtils.md5DigestAsHex( rawPassword.getBytes(StandardCharsets.UTF_8));登录时对输入的密码做同样的摘要再比对。这不是让系统变多安全MD5 本身也不够强但它展示了一个关键意识密码不能明文落库。答辩时老师问「安全上做了什么」你有具体代码可以指给他看比背概念强。临近答辩那几天我最深的教训是前一天晚上一定把整个流程在演示库里完整跑一遍包括导出文件和退出登录。因为答辩那天的紧张会在你身上放大各种小失误机器不会骗人但你得提前确认机器状态。数据备好了、路径想清楚了、关键代码能指出来心里就有底。希望帮到你。本文还有配套的精品资源点击获取