ARTICLE DETAIL

资讯详情

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

javaweb家政服务管理系统:从源码部署到答辩实战指南

javaweb家政服务管理系统:从源码部署到答辩实战指南 简介面向Java Web课程设计与毕业设计场景这份家政服务管理系统资源包覆盖了从项目背景、可行性分析、需求分析、数据库设计到编码实现、系统测试的完整开发链路适合需要参考完整项目流程的学生与开发者。资源共3626个文件核心包括Java源码及class字节码、JSP动态页面、HTML/CSS/JavaScript前端文件、XML配置与JAR依赖等资源包大小约44.26MB同时配有项目运行录像可直观了解系统部署效果。已有2316人学习下载。内容按绪论、需求分析、概要设计、详细设计、系统测试等章节组织并细分管理员、家政人员、雇主、资讯与留言等核心模块测试部分覆盖登录、发布服务、留言管理和资讯管理测试用例及执行结果配合论文文档、数据库表设计和E-R图可对照学习家政服务信息的增删改查、登录鉴权、留言管理及测试用例编写帮助完整把握毕业设计脉络也可直接复用文档结构加快论文撰写。1. javaweb家政服务管理系统到底在帮你解决什么问题“javaweb家政服务管理系统”是每年毕业设计榜单上的熟面孔。这个后缀为 rar 的压缩包里装的不只是代码论文、程序源码、项目运行视频录制三件套意味着你拿到的是一套可以交付的完整方案而不是一份只能看的“源码快照”。家政服务的业务模型很朴素——用户找保洁、保姆、维修管理员维护服务人员与项目服务人员接单开工。用 Servlet/JSP 把这条链路做出来技术栈老但稳定答辩时每一层都能被问到、也能被讲清。这篇笔记的工程量是帮你把这套源码做四件事看懂结构、本地跑通、改出亮点、答辩不慌。2. 先看懂这套系统的底子技术栈、模块边界与数据库设计2.1 为什么说 Servlet/JSP 在毕设场景里反而是最稳的选择现在网上一搜 javaweb项目完整案例mysql十个有八个是 Spring Boot Vue 前后端分离。但“javaweb”这个标签在毕设语境里通常指的还是 Servlet/JSP/EL/JSTL 这套经典直连架构。它不是最时髦的却是最容易让学生讲透的请求从 JSP 表单进来Servlet 接参数Service 写业务DAO 拼 SQL再把结果 setAttribute 到 requestforward 回 JSP。这个调用链基本等于教材目录老师问哪一层你都能在源码里指出来。使用 Servlet 的另一个好处是黑匣子少。Spring Boot 靠自动配置把很多事隐藏掉了一旦答辩被问“数据源是哪里来的”不少学生答不上来而 Servlet 项目的数据库配置就写在 src 下一个 properties 文件里谁连数据库、用的什么账号一眼就能看完。这个项目的 JDBC 连接、Filter 过滤、Session 判断登录态都是直接可见的运行环境也固定JDK 8 Tomcat 9 MySQL 5.7/8.0 IDEA。如果你拿到的源码里有 WEB-INF/lib 目录依赖是直接放 jar 在本地反而不容易出现 Maven 下载依赖失败这类网络问题。2.2 家政服务系统的三大核心模块与角色权限这类系统的业务闭环通常围绕三个角色展开。前台用户端负责注册登录、浏览服务项目保洁、保姆、家电清洗、提交预约订单、取消订单以及在服务完成后写评价。这是现场演示里最出效果的部分也是论文里功能需求章节的主要素材。服务人员端相对简单查看被分配的订单、更新订单状态待服务、服务中、已完成、维护自己的可服务项目。家政人员是独立角色不能下单只能接单。管理员端承担用户管理、服务人员审核、服务项目上下架、订单调度和统计报表。权限控制一般不会引入 Shiro 或 Spring Security而是用 Filter 加 Session 里的 role 字段做拦截。常见设计是在用户表加一个 role 字段1 管理员、2 用户、3 服务人员每个受保护页面先过 Filter判断 session 里有没有登录对象、角色对不对。为什么不让服务人员自己抢单因为毕设要体现管理员的调度价值。管理员派单这个动作一出来后台就多了一张可操作的订单管理页面论文里也多一个可以写“系统实现”的章节。这个设计动机你面试时也可以当业务分析的素材讲。我一般会先建议你画一张这样的模块图放在手边用户模块管“谁在用”服务项目模块管“卖什么”订单模块管“流程怎么走”评价模块管“服务质量怎么反馈”。四级结构对应到源码就是四个包找代码时按包名索引比从头读所有 Java 文件省力得多。2.3 数据库表结构拆解一张订单表和它的关联们一个完整的家政服务闭环最少需要五张表用户表、服务人员表、服务项目表、订单表、评价表。我习惯把订单表作为业务核心其他表都通过外键挂过来。下面给出一版我常用的建表方式你拿到的源码表结构未必一字不差但字段职责基本一致照这个思路去读 SQL 脚本就能快速对齐CREATE DATABASE housekeeping DEFAULT CHARACTER SET utf8mb4; CREATE TABLE t_user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, phone VARCHAR(20), role TINYINT NOT NULL DEFAULT 2 COMMENT 1管理员 2用户 3服务人员, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE t_worker ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, real_name VARCHAR(50), item_id INT, status TINYINT DEFAULT 0 COMMENT 0待审核 1可接单 2休息, score DECIMAL(3,1) DEFAULT 5.0, FOREIGN KEY (user_id) REFERENCES t_user(id) ); CREATE TABLE t_order ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, worker_id INT, item_id INT NOT NULL, address VARCHAR(200), expect_time DATETIME, status TINYINT DEFAULT 0 COMMENT 0待派单 1已派单 2服务中 3已完成 4已取消, remark VARCHAR(500) );把状态字段用 TINYINT 而不是字符串有两个实际原因一是过滤、排序性能好二是代码里可以用常量去比较不会把“已完成”写成“完成”减少一处低级 Bug 的可能性。表设计上有一点值得留意t_worker 通过 user_id 外键关联 t_user而不是单独再存一套用户名和密码这样登录校验只需要查一张表。表承担的角色与订单的关系t_user登录账号与角色标识订单发起方t_worker服务人员扩展信息与状态订单接单方t_service_item服务项目名称与价格订单内容t_order业务流转核心关联前三者t_evaluation服务质量评价订单完成后产生拿到源码后第一件事就是到 SQL 脚本里找订单表的真正表名——也许是 t_order也许是 orders也许带前缀。定位之后用 Navicat 或 DataGrip 把外键关系导成 ER 图这张图可以直接贴进论文的数据库设计章节等于论文的一整节内容已经被你拿下了。3. 把项目跑起来IDEA导入、MySQL建库与Tomcat部署全流程3.1 拿到源码后的第一步核对目录与运行视频不要双击 rar 在压缩包里直接操作。先把整个压缩包解压到一个全英文且没有空格的路径下比如 D:\housekeeping。毕设项目包通常包含四类东西sql 脚本可能放在 sql 目录或根目录、src Java 源码、web/WebContent 页面目录、论文 Word 文档以及一个运行视频录制文件。先花十分钟把运行视频看一遍重点不是看界面而是看它演示时用的端口和上下文路径。例如视频访问的是 http://localhost:8080/housekeeping/login.jsp那你在 IDEA 里部署时 Application context 也尽量填 /housekeeping这样论文截图、录屏效果和后端跳转路径三者保持一致减少后续返工。运行环境方面按下面这张表核对最省事组件推荐版本注意点JDK1.8兼容性最稳不要直接用 17IDEA2020.x 及以上社区版/专业版都能跑 Servlet 项目Tomcat8.5 或 9.0不要用 10javax 命名空间会不兼容MySQL5.7 或 8.0驱动类与连接参数不同见 3.2 节为什么强调 JDK 8因为 Servlet 项目大多是配套 JDK 8 编译的你用高版本 JDK 运行低版本源码轻则警告重则直接 ClassNotFoundException。这不是玄学而是 Tomcat 版本和编译级别共同决定的。最稳妥的做法确认代码里的 target bytecode version 是 1.8再启动。3.2 MySQL建库导入与jdbc.properties参数修改数据库是这套系统最容易出问题的地方。先在 MySQL 里把数据库建好、把脚本导进去# 在命令行执行导入整份SQL脚本 mysql -uroot -p D:/housekeeping/housekeeping.sql # 如果脚本里没有建库语句先手动建库再导入 mysql -uroot -p -e CREATE DATABASE housekeeping DEFAULT CHARACTER SET utf8mb4;导入完成后登录 MySQL 用show tables;看一眼表清单确认表都建出来了再往下走。如果导入时报错先把 SQL 脚本里的建库语句删掉只保留建表语句避免重复执行时冲突。接下来修改数据库连接配置。这个文件一般在 src 根目录下叫 jdbc.properties或者在 WEB-INF/classes 目录下。内容改成这样jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/housekeeping?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456四个参数各有用处characterEncodingUTF-8 必须和建库字符集一致否则 JSP 页面读出来全是问号useSSLfalse 是因为本地开发不需要证书开着反而可能在控制台刷 SSL 警告serverTimezoneAsia/Shanghai 是 MySQL 8.x 的必填项不加会报时间时区错误password 改成你自己 MySQL 的 root 密码。这里一个常见分歧是驱动类名。如果你用的是 MySQL 5.7 和旧驱动保持 com.mysql.jdbc.Driver 没问题如果换成 MySQL 8.x驱动类必须改成 com.mysql.cj.jdbc.Driver并且把 WEB-INF/lib 下的 mysql-connector-java.jar 也换成 8.0.x 版本。只改一行类名但 jar 版本不换照样报 ClassNotFoundException。3.3 IDEA运行javaweb项目配置从Artifacts到TomcatIDEA 里跑 Servlet 项目很多人卡在一个点上代码没错但 Tomcat 起不来或者起了之后 404。核心步骤就是三步项目结构里加 Artifacts运行配置里选 Tomcat Server LocalDeployment 里把这个 Artifact 加进去。按照这个顺序操作File - Project Structure - Artifacts点加号选 Web Application ExplodedModules 选当前项目。Run - Edit Configurations点加号找到 Tomcat Server - Local注意选 Local 不选 Remote。Server 标签页里指定 Tomcat 安装目录JRE 下拉框选 1.8。Deployment 标签页点加号把刚才建好的 Artifact 添加进去。Application context 填 / 或 /housekeeping和视频、论文保持一致。启动前先检查端口有没有被占用# Windows 下查看 8080 端口是否被占用 netstat -ano | findstr 8080 # 找到占用进程后可用下面的命令结束进程把PID换成实际值 taskkill /PID 12345 /FTomcat 默认跑 8080如果之前装过别的服务占了这个端口IDEA 控制台会报 “Port 8080 was already in use”。用上面命令找到进程号结束掉是最快的。改端口也可以在 Tomcat 的 conf/server.xml 里改 Connector 的 port 属性但我不建议你为了跑通去改因为论文截图和视频保持一致更好维护。部署成功后你会看到控制台刷出 Tomcat 的启动日志。这里有个细节IDEA 的 Tomcat Server Local 和手动启动 Tomcat 有所不同前者在 Server 标签页还有一个 “Deploy at startup” 和 “Redeploy interval” 选项保持默认即可不用动。3.4 验证系统是否跑通三处必看启动日志出现 “Server startup in [xxxx] milliseconds” 只代表 Tomcat 起来了不代表项目部署成功。我验证一个 javaweb 项目能不能用按这个顺序看三处首页静态资源能不能打开、登录链路通不通、列表页数据能不能显示出来。首先访问 http://localhost:8080/看到登录页或系统首页而不是 404。然后从视频里找到演示账号输入用户名密码点登录能正确跳转到对应角色的主页说明登录链路通。最后进管理员端的列表页如果用户列表或订单列表能查出数据说明数据库驱动、连接参数、SQL 脚本三条线都打通了。列表页是空的优先检查数据库里有没有数据再检查 SQL 查的是不是你导入的那个库。如果部署失败看日志是最高效的排查方式# Linux/Mac 下实时跟踪 Tomcat 日志 tail -f /path/to/tomcat/logs/localhost.2025-01-10.log # Windows 下直接打开 logs 目录看最新文件 explorer C:\path\to\tomcat\logs日志里最常见的三种关键词ClassNotFoundException 表示缺 jar 包Exception sending context initialized event 表示 Filter 或 Servlet 初始化失败Table doesnt exist 表示 SQL 没导入或者连接到了错误的数据库。看到这三类报错按 3.2 和 3.3 的步骤逐项核基本都能解决。4. 从“跑起来”到“改得动”给毕设做二次开发的 3 个实战方向4.1 把论文和源码对照起来先确定你的“工作量”证据不少同学的毕设卡在“源码能跑但论文没东西写”。对照方法其实很直接论文缺什么就到源码里找什么。需求分析章节对应系统的菜单和功能模块把页面逐个截图描述数据库设计章节对应 SQL 脚本里的表结构核心功能实现章节对应 Servlet 和 DAO 的关键方法。你要做的不是重新发明一套流程而是把“系统做了什么”翻译成“我设计了什么”。如果你拿到源码时连 doGet/doPost 都还没写过一遍建议先翻黑马javaweb笔记的数据访问那一节把 JDBC 和 Servlet 的基本写法对着源码过一遍。源码注释不是你抄论文的负担而是你在答辩前快速回忆调用链的地图。有同学在网上搜“有没有去除程序源码注释的软件”我劝你别这么干注释是你能最快回忆起整个项目的地图去掉注释等于把自己的复习笔记撕了。我一般会建议做一张“功能点 - 源码文件 - 论文章节”的对照表不交给老师自己用。例如用户登录功能对应 LoginServlet.java 加 t_user 表对应论文第 4 章“系统实现”的登录小节。这张表让你在答辩前两小时把所有可能的问题索引到正确答案上比临时翻源码高效得多。4.2 方向一给服务人员增加“接单状态切换”这个功能点很贴近家政业务改动也集中t_worker 表里加一个状态字段页面上放一个切换按钮Servlet 接收请求后更新数据库。下面是核心代码WebServlet(/worker/updateStatus) public class WorkerStatusServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session req.getSession(); Object userId session.getAttribute(loginUserId); if (userId null) { resp.sendRedirect(req.getContextPath() /login.jsp); return; } int status Integer.parseInt(req.getParameter(status)); // 只允许服务人员修改自己的状态条件里带 userId防止越权操作 try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement( UPDATE t_worker SET status? WHERE user_id?)) { ps.setInt(1, status); ps.setInt(2, (Integer) userId); ps.executeUpdate(); resp.sendRedirect(req.getContextPath() /worker/center.jsp); } catch (SQLException e) { e.printStackTrace(); resp.sendError(500, update status failed); } } }这段代码的关键不是更新语句本身而是WHERE user_id?这个条件。很多网上的半成品拿到 workerId 参数直接就更新存在越权问题——任何登录用户都能改别人的状态。你加上 session 里拿 userId 再更新的逻辑数据库层面就杜绝了串改。答辩时老师问“如何保证服务人员只能操作自己的数据”你就指这一行现场加分。参数说明status 取 0/1/2与 2.3 节建表注释保持一致前端可以放两个按钮传不同值。DBUtil.getConnection() 是读 jdbc.properties 的工具类如果源码里没有直接用 DriverManager.getConnection(url, username, password) 代替也行。这里用 try-with-resources 自动关闭连接JDK 7 以上都支持代码里不用写 finally 手动 close。4.3 方向二加一个“服务评价”闭环模块如果原系统只有订单没有评价这反而是你的机会。补一张评价表用户完成订单后打分写评语管理员能看到平均分闭环就完整了。先建表CREATE TABLE t_evaluation ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, user_id INT NOT NULL, worker_id INT, score TINYINT NOT NULL COMMENT 1-5分, content VARCHAR(500), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (order_id) REFERENCES t_order(id) );order_id 加唯一约束可以让一个订单只能评价一次避免重复刷分worker_id 冗余进来是为了列表页少一次关联查询统计服务人员平均分时直接按这个字段聚合。score 用 TINYINT 就够分数范围 1 到 5别用 DECIMAL 给自己找麻烦。create_time 用 DEFAULT CURRENT_TIMESTAMP 自动填充Java 代码里少传一个参数也少一类时间格式化 Bug。评价提交前的“是否能评价”校验可以用一条 SQL 完成// 判断订单是否已完成且没有被评价过 String checkSql SELECT COUNT(*) FROM t_order o LEFT JOIN t_evaluation e ON o.id e.order_id WHERE o.id? AND o.status3 AND e.id IS NULL;这条 SQL 用左连接直接查“已完成但没有评价”的订单count 为 1 才允许弹评价框为 0 就提示不能评价。比先查订单再查评价两次查询简单也比 Java 代码里做判断更直观。这里 status3 依赖你源码里的实际订单状态常量如果原系统“已完成”是 4记得同步改。这条 SQL 也可以直接写进论文的“核心功能实现”章节老师看到 left join 加子查询条件会觉得你是真跑了业务数据而不是堆页面。4.4 方向三把订单列表改成参数化查询并支持关键字搜索毕设项目里比较掉价的隐患是 SQL 注入搜订单号直接把字符串拼进 SQL。把搜索列表升级成“关键字 状态 分页”三合一是低成本高展示度的改动public ListOrderVO searchOrders(String keyword, Integer status, int page, int size) throws SQLException { StringBuilder sql new StringBuilder( SELECT o.*, u.username AS user_name, i.name AS item_name FROM t_order o LEFT JOIN t_user u ON o.user_id u.id LEFT JOIN t_service_item i ON o.item_id i.id WHERE 11 ); ListObject params new ArrayList(); if (keyword ! null !keyword.trim().isEmpty()) { sql.append(AND (o.address LIKE ? OR u.username LIKE ?) ); String like % keyword.trim() %; params.add(like); params.add(like); } if (status ! null) { sql.append(AND o.status ? ); params.add(status); } sql.append(ORDER BY o.id DESC LIMIT ? OFFSET ?); params.add(size); params.add((page - 1) * size); try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql.toString())) { for (int i 0; i params.size(); i) { ps.setObject(i 1, params.get(i)); } try (ResultSet rs ps.executeQuery()) { // 遍历 ResultSet组装 ListOrderVO 返回给 Service 层 } } }这个写法里 sql 结构是动态拼的但具体值全部走 PreparedStatement 的 ? 占位符。用户输入的 keyword 只会被当成搜索值而不是 SQL 命令这就是参数化查询防注入的原理。WHERE 11 是为了让后面拼接 AND 条件时不用判断是不是第一个条件常见且实用论文里可以展开讲。分页参数要注意LIMIT 是每页条数OFFSET 是偏移量第二页就是(2-1)*size。如果旧版 MySQL 驱动对LIMIT ? OFFSET ?支持不好可以手动拼成LIMIT 10 OFFSET 10因为是整数拼接也不存在注入风险。改完之后在浏览器里搜一个中文字段名看地址栏参数和 SQL 日志是否一致验证查询是否正常。5. 避坑清单从导入报错到答辩翻车的六条血泪记录5.1 导入IDEA后一半代码标红问题不在代码在环境现象用 IDEA 打开项目后所有 javax.servlet.* 都标红JSP 文件也识别不了。原因IDEA 还没有把 Tomcat 的 lib 目录关联到项目。Servlet 相关 jar 在 Tomcat 安装目录里项目的编译路径里没有它们。解决Project Structure - Libraries - 加号 - Java选择 Tomcat 安装目录下的 lib把 servlet-api.jar、jsp-api.jar 加进去。如果加完还是红检查 Project SDK 选的是不是 1.8。新版本 IDEA 会自带 JBR 运行时但项目语言级别必须显式指定 1.8。这两步做完九成标红都会消失。注意不要为了消红乱加依赖加一个不需要的 jar 比标红更麻烦因为后面排查环境全靠它。5.2 数据库连接三连报错驱动、时区、SSL现象Tomcat 启动成功点击登录后控制台报 SQLExceptionCommunications link failure或者 Unknown system timezone。原因MySQL 8.x 要求驱动类用 com.mysql.cj.jdbc.Driver但源码里还写着老驱动连接串缺少 serverTimezoneMySQL 8 会拒绝连接。解决把 jdbc.properties 改成 3.2 节那套配置同时确认 WEB-INF/lib 下的 jar 是 mysql-connector-java-8.0.x。如果不想换驱动也可以把 MySQL 降到 5.7但我不建议系统里可能与 MySQL 8 的认证方式有关换驱动是最小改动、最不影响其它依赖的方案。改完后重启 Tomcat不是只改配置不重启就能生效的。5.3 JSP页面中文全是问号数据库里数据却正常现象页面上用户名、项目名称全是问号但用 Navicat 查数据库中文显示正常。原因三处编码不一致数据库字符集、JDBC 连接串里的 characterEncoding、JSP 页面的 pageEncoding只要有其一不是 UTF-8页面就可能乱码。解决数据库建库用 utf8mb4连接串保持 characterEncodingUTF-8所有 JSP 文件头部的 pageEncoding 和 contentType 也统一成 UTF-8。改完之后清一次浏览器缓存再试因为浏览器可能缓存了旧的响应头。这里有个隐蔽坑如果源码文件本身是在 GBK 编码下编辑过的你在 IDEA 里把编码强行转成 UTF-8 不会自动修复中文反而可能把文件搞成双重乱码。正确做法是从压缩包里重新解压一份原始文件再统一转码。5.4 访问localhost:8080直接404但Tomcat明明启动了现象IDEA 控制台显示 Server startup 成功浏览器打开 http://localhost:8080/ 却看到 404 页面。原因项目的 Artifact 没有加进 DeploymentTomcat 启动的是空应用当前上下文下没有可访问的资源。解决Run - Edit Configurations - Tomcat Server Local - Deployment点加号把项目的 Artifact 添加进来再确认 Application context 填的是 / 或 /housekeeping。改完之后 Stop 再 Start不要用 Replay 或 Reload。很多人点了 run 旁边的刷新按钮Tomcat 确实重新加载了但 Deployment 列表没变改一次重启一次才是规范操作。5.5 运行视频里的访问路径和你不一致论文截图也对不上现象视频里访问 /housekeeping/login.jsp你部署后路径是 /页面能打开但论文里的截图、答辩现场输入地址时都对不上。原因上下文路径不是写在代码里的而是部署时 IDEA 里 Application context 这个参数决定的。视频里用 /housekeeping说明原作者部署时填的 /housekeeping。解决把 Application context 改成和视频一致或者以视频里的地址栏为准重新截图。另一点源码里如果用了resp.sendRedirect(req.getContextPath() /login.jsp)路径能随部署自动适配不用改 Java 代码但如果源码里写死了/housekeeping/login.jsp这就是一个隐患顺手改成 getContextPath() 拼接算是你修了一个小缺陷也能写进论文。5.6 答辩翻车现场只演示了最熟悉的那条路现象老师问“用户没登录直接访问管理员页面会发生什么”或“订单表为什么不用订单号做主键”当场卡壳。原因只准备了一条成功路径的演示没有按“异常路径”和“设计问题”去反推源码。解决答辩前把整条请求链路在 A4 纸上画一遍浏览器发起请求Filter 怎么拦Servlet 怎么取参Service 怎么处理DAO 怎么查哪个页面接收结果。再把每个 Filter 的拦截规则复述一遍。老师问的所有“如果”基本都能在 Filter 和数据库外键上找到答案。这条准备做扎实了比多写两个功能更稳。6. 从应用到答辩用一条完整业务链做验收再加一个低成本亮点答辩翻不翻车不看你写了多少页面看你能否把一条完整业务链从头演示到尾并且让老师随时打断追问。我个人的验收习惯是准备一套专用演示数据一个测试用户、一个服务人员、三个服务项目、一条待派单的订单。现场演示顺序固定用户登录、预约保洁、管理员登录派单、服务人员接单、完成订单、用户评价、管理员后台看到平均分。这条链路走完系统所有主要页面都被覆盖老师的提问也只能沿着这条链路走等于你把答辩节奏握在自己手里。在此基础上如果想加一个低成本但技术密度高的亮点我推荐把密码改成“MD5 加盐”存储。现在很多毕设源码还是明文存密码你只需要改注册和登录两个 Servletpublic static String md5Salt(String password, String salt) { try { MessageDigest md MessageDigest.getInstance(MD5); String input password salt; byte[] digest md.digest(input.getBytes(StandardCharsets.UTF_8)); StringBuilder sb new StringBuilder(); for (byte b : digest) { sb.append(String.format(%02x, b)); } return sb.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } }注册时把用户名当盐登录时取出同一个盐做一次哈希再比对明文密码永远不会落到数据库里。这个改动很小但能在答辩时讲出三个知识点密码不落明文、加盐防止撞库、散列算法单向不可逆。比起加一个花哨页面这种改造更有说服力。我以前吃过的亏是只演示自己最熟练的路径结果老师反向点了一条用户没登录直接访问管理员页面会发生什么当场愣住。之后我的习惯变成每改一个功能先按正常流程走一遍再按越权方式试一遍。这不只是为答辩也是以后接手任何 web 项目的基本功。希望你这次把项目跑通的同时也能把这条链路吃透。答辩顺利希望帮到你。本文还有配套的精品资源点击获取
返回列表