简介:一套基于JavaWeb的家政服务管理系统毕业设计资料,适合计算机相关专业学生用于课程设计、毕业设计参考与二次开发。系统以Java为主要开发语言,搭配MySQL数据库,采用B/S结构,涵盖用户登录、个人资料、家政服务管理(管理员/家政人员/雇主)、用户管理、家政资讯及留言管理等完整功能模块,并配有需求分析、概要设计、数据库设计、系统测试等毕业设计论文内容。包体共3626个文件,压缩包大小44.26MB。文件类型以JavaScript脚本、CSS/LESS样式、HTML/JSP页面以及Java源码、class文件、jar包等为主,同时含SQL数据库脚本、论文Word文档和项目运行录制视频,可一站式获得从环境搭建到运行演示的全部素材。目前已有2316人学习下载。资料内除完整论文和可运行源码外,还提供操作视频与测试用例,便于快速理解系统实现思路、掌握JSP+Servlet+MySQL的典型开发流程,并可直接作为毕业设计答辩或项目实战的支撑材料。
1. 网上下载的javaweb家政服务管理系统,为什么一半人跑不起来
一个javaweb家政服务管理系统的毕业设计压缩包,解压后并不是开箱即用的。里面通常混着JSP页面、Servlet类、数据库脚本和一堆jar包,导入IDEA后常出现缺包、缺库、编码错、端口占用,最后停在Tomcat的报错页上。能跑起来的那一半,多半也不是因为运气好,而是补过环境、改过配置、顺过数据。
这篇笔记是给刚拿到这类源码、准备做课设或毕设的人写的。我会先拆解这类压缩包里的常见结构和业务表,再按“环境准备→数据库初始化→IDEA部署→启动验证”的顺序把项目跑起来,最后说几个我接手时最容易翻车的坑,以及答辩前值得加的三个小功能。适合能看懂基础Java、但还没独立部署过JSP/Servlet项目的人。下面不绕弯,直接从解压后的第一眼说起。
2. 先拆包:这类毕设源码里到底是什么东西
2.1 一个典型的JSP+Servlet+JDBC三层项目,不是Spring Boot
搜“javaweb项目完整案例mysql”这类关键词,你下载到的压缩包大半是JSP+Servlet+JDBC结构,而不是Spring Boot。没有内置Tomcat,没有自动配置,数据库连接也是手动用DriverManager或者连接池写的。所以你不能像打开Spring Boot项目那样配一个application.yml就完事。JSP页面通过form表单把请求提交给Servlet,Servlet里用JDBC操作MySQL,再把结果用request.setAttribute传回JSP,由JSP渲染成HTML。这个链路看着绕,但也是这套系统的全部运行逻辑。
解压后建议先看一眼目录结构,不用管代码,先把目录认全。常见Web工程大致长这样:
webapp/ ├── WEB-INF/ │ ├── web.xml │ ├── lib/ │ │ ├── mysql-connector-java-5.1.49.jar │ │ ├── jstl-1.2.jar │ │ └── servlet-api.jar │ └── classes/ ├── css/ ├── js/ ├── images/ ├── login.jsp ├── register.jsp ├── index.jsp └── admin/ ├── login.jsp ├── orderList.jsp └── workerManage.jspjsp文件直接放webapp根目录,访问的时候不用写WEB-INF路径,因为WEB-INF下的文件不能被浏览器直接访问,只能通过Servlet内部转发;lib下的jar会被Tomcat加载;classes目录是编译后的class文件和配置文件。很多跑不起来的项目,问题就出在“没有把src目录标记为源码目录,导致classes里根本没生成class”。这个后面展开。
如果你学过实训课里那套JSP题目,或者看过黑马JavaWeb笔记里的三层结构,对这个布局会很眼熟。页面负责展示,Servlet负责接请求,DAO负责查表。网上流传的javaweb项目完整案例,十个里有七个是这种写法,原因很简单:好讲、好改、也好应付答辩。Spring Boot虽然热,但老师一问Filter和Session怎么用,只背过注解的反而容易露怯。
2.2 家政业务对应的表与状态,是照着线下门店流程做的
家政系统的表结构,一般不会超过六张。用户表、管理员表、服务人员表、服务项目表、订单表、评价表,差不多就是全部。下面是常见表清单,具体字段以你压缩包里的sql文件为准,但核心逻辑基本一致。
| 表名 | 核心字段 | 对应页面 | 作用 |
|---|---|---|---|
| t_user | id, username, password, phone, address | 注册/登录/个人中心 | 找保洁、保姆、月嫂的用户 |
| t_admin | id, username, password | 后台登录页 | 管理订单和人员的运营方 |
| t_service | id, name, price, unit, intro | 服务列表/服务详情 | 可下单的家政项目 |
| t_worker | id, name, phone, work_type, status | 后台人员管理 | 安排给订单的服务人员 |
| t_order | id, order_no, user_id, service_id, worker_id, appoint_time, status | 用户订单/后台订单列表 | 整条业务流程的主线 |
| t_comment | id, order_id, user_id, content, score | 订单评价 | 用户对服务打分的记录 |
这里重点看t_order。order_no是订单编号,一般用时间戳加随机数生成;appoint_time存的是预约上门时间,格式通常是“yyyy-MM-dd HH:mm”,在JSP页面上用datetime-local输入框提交;status是订单状态,也是整个系统里最值得讲的字段。常见状态有五种:待派单、已派单、服务中、已完成、已取消。用户下单后订单还停在“待派单”,管理员在后台把t_worker表里的人员和这张订单关联上,状态变成“已派单”,再往后是服务中和已完成。
倒过来看代码也一样,几乎所有Servlet都在围绕这个状态做判断。比如“用户只能取消待派单的订单”“工人只能对已派单的订单开始服务”,这些if条件就是答辩时能讲的业务规则。你要是能在数据库里把一条订单的status从1改到2、3、4,再刷新页面看到按钮变化,基本就把这套系统的主干摸清了。
2.3 登录、预约、派单、评价:一次完整的业务闭环
一套家政系统在业务上只需要回答四个问题:谁登录、用户预约了什么服务、管理员派了谁去、服务得怎么样。用户在注册页面填用户名、密码、手机号,写入t_user表;登录校验通过后,session里就存着用户的id和用户名;用户选好服务项目,填写上门时间和地址,生成一条t_order;管理员在后台看到待派单,手动指定一名t_worker;服务完成后用户对这条订单打分,t_comment里多一条记录。
这样一轮下来,所有页面、表、Servlet都串起来了。如果你拿到项目后不知道怎么下手,建议先打开MySQL执行sql脚本,把六张表的数据都看一眼,再对照web.xml里的Servlet映射找业务入口。先看数据再读代码,比从头翻Java文件效率高得多。压缩包里的运行视频录制只能让你确认“别人机器上确实跑起来过”,它不能替代你本地的数据库初始化,也不能替你解决环境差异。下面进入正题,把运行环境一次配齐。
3. 用IDEA把项目跑起来:五个必须抠的配置点
3.1 环境版本先固定:JDK 8、Tomcat 8.5、MySQL 5.7
这类老项目的配置极度依赖JDK版本。用JDK 17跑JDK 8写的Servlet项目,不是不行,但会遇到模块化限制、非法反射警告,甚至直接编译失败。最常见的可靠组合是:JDK 8、Tomcat 8.5、MySQL 5.7、IDEA 2021或2022。MySQL 8.0也能用,但驱动和连接串要跟着换,后面单讲。
| 组件 | 推荐版本 | 理由 |
|---|---|---|
| JDK | 1.8(8u202) | 编译级别默认1.8,JSP/Servlet兼容最好 |
| Tomcat | 8.5.x | 支持Servlet 3.1,对老项目最稳 |
| MySQL | 5.7.x | 与mysql-connector-java 5.x匹配 |
| IDEA | 2021/2022 | 内置Tomcat集成面板,配置直观 |
先把环境变量确认一遍。Windows下打开cmd,一行一行执行下面的命令,能看到版本号而不是“不是内部或外部命令”,说明对应环境已经装好:
java -version javac -version mysql --version echo %CATALINA_HOME%这里CATALINA_HOME不设置也不影响IDEA启动Tomcat,IDEA会自己找安装路径。真正要注意的是java和javac版本一致。如果java是17而javac是8,说明PATH里混了多个JDK,建议把高版本JDK的bin目录从PATH里挪走,或者干脆只在IDEA里指定Project SDK为1.8。命令行不干净会引出很多奇怪问题,比如Tomcat能启动但JSP编译段报“不支持发行版本5”。
3.2 导入IDEA后先检查目录标记,再挂Tomcat
IDEA里选File → New → Project from Existing Sources,选中你解压后的项目根目录,一路Next。如果是普通Web项目(没有pom.xml),IDEA很可能不会自动识别源码目录。你需要手动在项目结构里做三件事。
第一,把放Java文件的那个目录(通常是src,也可能是src/main/java)右键标记为Sources Root;第二,把web.xml所在目录标记为Web Resource Directory;第三,在Project Structure → Libraries里把WEB-INF/lib下的所有jar加进依赖。很多项目导入后满屏红色报错,就是第3步没做。我习惯直接用IDEA的搜索功能搜一下import com.mysql.,如果提示找不到包,说明jar没加进去。
挂Tomcat的路径是:Run → Edit Configurations → 左上角加号 → Tomcat Server → Local。在Deployment标签页点加号,选择Artifact,把项目的war exploded包加进去。这个页面里最关键的一个参数是Application context,它决定了你访问这个项目的起始路径。举例:
/home_service注意这里必须带前导斜杠,而且要和数据库或页面里的跳转路径大小写完全一致。很多项目页面里写的是${pageContext.request.contextPath}/login.jsp,contextPath的值就是你在这里填的字符串。填成/也可以,但访问时就得用http://localhost:8080/index.jsp,而且如果同时部署多个项目会串。Application context填好后,URL默认就是http://localhost:8080/home_service/。
3.3 初始化MySQL数据库:sql脚本和三行jdbc配置
大多数压缩包里都有一个.sql文件,名字类似home_service.sql或者db.sql。用Navicat、SQLyog或者命令行导入都行。命令行导入最稳,不会因为你客户端默认字符集不对而乱码。Windows下执行:
mysql -u root -p -e "create database if not exists home_service default character set utf8 collate utf8_general_ci;" mysql -u root -p home_service < D:\home_service.sql第一条命令创建数据库,指定字符集为utf8,排序规则为utf8_general_ci,这一步是后面中文不乱码的前提。第二条命令把sql文件导入到刚创建的库里。如果你的sql脚本开头已经有create database语句,第一条命令可以省略,直接导入,但前提是脚本里的库名和你Java代码里写的库名一致。
导入完成后,打开项目的数据库配置文件。老项目通常叫jdbc.properties,在classes或src目录下。内容一般是这样的:
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/home_service?useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=123456这段配置里最容易错的是url。useUnicode=true和characterEncoding=utf8必须带上,否则插入中文会变成问号;3306是MySQL默认端口,如果你本机改过端口,这里得跟着改;username和password要对应你本机MySQL的实际账号。用root有问题的话,可以单独建一个专用账号,授权语句是:
create user 'home'@'localhost' identified by 'home123'; grant all privileges on home_service.* to 'home'@'localhost'; flush privileges;我不建议为了跑项目去改MySQL的root密码,更推荐新建账号授权。原理上,Java代码只认jdbc.properties里的配置,不关心你连的是不是root,所以新建一个最小权限账号反而更安全,也不影响其他项目。
3.4 第一次启动:从日志里判断到了哪一步
配置完成后,点IDEA里的Tomcat运行按钮。第一次启动可能会比较慢,因为Tomcat要扫描并编译项目。启动日志如果只看到“Server startup in xxx ms”还不够,还要看有没有出现Deploying web application directory和Completed deployment这两行。出现这两行才算部署成功。
如果启动失败,先看Console最上方的异常堆栈,不要往下翻截图。Tomcat的报错虽然长,但真正有用的通常是最前面3行。我常用的排查命令是:
netstat -ano | findstr :8080这条命令在Windows下检查8080端口是否被占用。如果被其他进程占用,要么杀掉那个进程,要么在IDEA的Tomcat配置里把HTTP port改成8081、8082。改端口后,访问地址也要同步改。另外,启动前可以在浏览器先访问一下http://localhost:8080/,如果能看到Tomcat默认首页,说明Tomcat本身没问题,问题只出在你的项目上,这一步能帮你把“Tomcat坏了”和“项目坏了”分开。
启动成功后,访问http://localhost:8080/home_service/login.jsp,能看到登录页并成功登录,这个项目就算基本跑通了。但跑通只是及格线,下面把代码链路读一遍,才谈得上改。
4. 家政系统代码怎么走的:从一次登录请求到一条订单入库
4.1 入口在web.xml还是注解?先锁定Servlet映射
老项目的Servlet入口一般写在web.xml里,少量新一点的会用@WebServlet注解。不管是哪种,你的目标都是找到“哪个URL对应哪个Java类”。打开web.xml,你会看到类似这样的片段:
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.home.web.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>这段配置的意思是:浏览器访问/home_service/login这个地址时,交给com.home.web.LoginServlet处理。注意url-pattern里的/login不带.jsp后缀,它只是一个虚拟路径,实际对应的文件在Java代码里通过转发指定。如果你在JSP源码里看到action="login"或者action="${pageContext.request.contextPath}/login",就是往这里提交的。
如果是注解方式,web.xml里可能没有上面那段,需要在IDEA里按两下Shift,搜索@WebServlet,然后看每个类的注解值。我一般会先把所有Servlet类的类名列出来,再对照web.xml里的url-pattern,画出一条“页面→Servlet”的对应表。这样哪怕你有上百个类,也能在几分钟内定位到核心业务入口。
4.2 登录逻辑的常见写法:查表、写session、跳首页
登录是整个系统的第一个入口,代码结构也最典型。下面是我在多个类似项目里都见过的写法,逻辑大同小异:
@WebServlet("/login") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); String username = request.getParameter("username"); String password = request.getParameter("password"); UserDao dao = new UserDao(); User user = dao.findByUsernameAndPassword(username, password); if (user != null) { request.getSession().setAttribute("loginUser", user); response.sendRedirect(request.getContextPath() + "/index.jsp"); } else { request.setAttribute("msg", "用户名或密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } }这里有几个值得抄进笔记的细节。第一,request.setCharacterEncoding("utf-8")必须放在读取参数之前,否则post提交的中文参数会乱码。第二,登录成功后用sendRedirect重定向到首页,而不是转发;因为转发会把上次的post请求带到新页面,用户刷新时会重复提交。第三,失败时用request.getRequestDispatcher("/login.jsp").forward(...)转发回去,这样才能把msg属性带过去并在JSP里用${msg}显示。第四,loginUser存在session里,后续页面判断用户是否登录,就是查这个session属性。
UserDao里的查询方法,绝大多数项目的实现都是PreparedStatement,而不是Statement。如果代码里出现字符串拼接SQL的情况,比如"select * from t_user where username='" + username + "'",那面试或答辩时这里就是明显的减分项。PreparedStatement的典型写法是:
String sql = "select * from t_user where username=? and password=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs = ps.executeQuery();问号占位符避免了用户输入被当作SQL指令执行,这是最基础也最该拿得出手的安全写法。另外很多老项目存的是MD5加密后的密码,登录时会对用户输入再做一次MD5比对。如果你看到DigestUtils.md5Hex(password)之类的代码,说明项目里已经用了单向散列,这是可以写进答辩PPT的加分点。
4.3 下单流程里的三件事:事务、外键和状态更新
下单是家政系统里逻辑最完整的业务动作。一次下单不只是往t_order插一条记录,还涉及服务人员的可用状态、订单状态的初始化、以及库存或排期的占用。很多项目图省事,只在OrderServlet里调了一次insert,其余全靠管理员后台手动改。
一个更完整的下单逻辑,代码结构是这样的:
public boolean createOrder(Order order, int workerId) { Connection conn = null; try { conn = DBUtil.getConnection(); conn.setAutoCommit(false); // 关闭自动提交 String sql1 = "insert into t_order(order_no, user_id, service_id, worker_id, appoint_time, address, status, create_time) " + "values(?, ?, ?, ?, ?, ?, ?, now())"; PreparedStatement ps1 = conn.prepareStatement(sql1); ps1.setString(1, order.getOrderNo()); ps1.setInt(2, order.getUserId()); ps1.setInt(3, order.getServiceId()); ps1.setInt(4, workerId); ps1.setString(5, order.getAppointTime()); ps1.setString(6, order.getAddress()); ps1.setInt(7, 1); // 1=待派单 ps1.executeUpdate(); String sql2 = "update t_worker set status = 1 where id = ? and status = 0"; PreparedStatement ps2 = conn.prepareStatement(sql2); ps2.setInt(1, workerId); int rows = ps2.executeUpdate(); if (rows == 0) { conn.rollback(); // 人员已被预占,回滚订单插入 return false; } conn.commit(); return true; } catch (Exception e) { conn.rollback(); return false; } }这段代码的核心是setAutoCommit(false)和commit/rollback。下单和占用工人是两个写操作,如果第一步成功、第二步失败,而事务没有回滚,数据库里就会出现一条没有工人的孤儿订单。反过来,如果你只改了数据库没改代码,这种母子表一致性是保证不了的。答辩时能说清楚“为什么必须用事务”,比说十个设计模式都有效。
补一个细节:update语句里加and status=0,这是乐观锁的一种极简实现。意思是只更新“当前没有被占用”的工人,如果上一次查询之后工人被别人先占用了,这次update会更新0行,代码就有机会感知到冲突并回滚。这是一种成本极低、效果很好的并发控制写法。
4.4 给过程加日志:打印SQL与参数,是最快的黑匣子打开方式
老项目很多没有日志框架,全是System.out.println。刚开始接手时别急着骂,这些打印语句排查问题反而好用。但如果你正在改下单逻辑,建议把所有关键SQL和参数打印到控制台,一眼就能看出“SQL写错了”还是“参数传错了”:
public static void debugSql(String sql, Object... args) { System.out.println("[SQL] " + sql); for (int i = 0; i < args.length; i++) { System.out.println("参数" + (i + 1) + ": " + args[i]); } }调用方式是在DAO方法里,执行前调用debugSql(sql, username, password)。看起来土,但排查效率很高。强烈反对在没加日志的情况下对着浏览器页面猜数据流,因为你看到的页面渲染结果可能缓存了好几层,不如直接看控制台里数据库返回了什么。等所有功能确认没问题,再把这些调试输出统一注释掉。
5. 从毕设源码到能答辩:五个高频坑与排查步骤
5.1 启动报ClassNotFoundException/NoClassDefFoundError,先看lib目录和class输出位置
现象:一启动Tomcat,控制台抛java.lang.ClassNotFoundException: com.mysql.jdbc.Driver,或者跑到某一步突然NoClassDefFoundError。
原因:两种情况。要么WEB-INF/lib里确实没有对应的jar;要么jar在,但项目结构里没把lib目录加入依赖,IDEA编译的时候没把它打包进Artifact。第二种特别隐蔽,因为代码里import不报错,一运行就找不到类。
解决:先打开Project Structure → Artifacts,展开Output Layout,看WEB-INF/lib下面有没有mysql-connector的jar。没有的话,右键jar,选择Put into /WEB-INF/lib。如果是自己blog一样把jar放在外部目录,建议直接复制到webapp/WEB-INF/lib下,这种方式对老项目最省心。注意servlet-api.jar这类Tomcat自带的包,不要放进lib,否则会和Tomcat的容器类冲突,报java.lang.ClassCastException: javax.servlet.ServletRequest cannot be cast to javax.servlet.ServletRequest,这是新手最容易困惑的“同名类”问题。
5.2 数据库连接不上:Access denied与Communications link failure要分开查
现象:页面一点登录,直接报Access denied for user 'root'@'localhost' (using password: YES),或者Communications link failure。
原因:Access denied是账号密码权限问题;Communications link failure是MySQL压根没启动、端口不对、或者防火墙拦截。两种报错对应两类完全不同的原因,一起排查就容易被带偏。
解决:先分两步验证。第一步,命令行执行mysql -u root -p,如果能进,说明MySQL服务正常,问题在密码或授权;如果进不去,先重启MySQL服务。第二步,确定MySQL端口是不是3306,netstat -ano | findstr :3306看监听状态。Access denied的话,要么把jdbc.properties里的密码改成你实际的密码,要么执行前面提到的create user和grant语句新建账号。还有一个小概率情况,是本地装了多个MySQL实例,3306端口被旧的实例占着,而sql文件导入了新的实例,这时检查端口就行。密码里有特殊字符如@、#时,properties文件里需要转义,或改用代码里的url拼接方式,否则会被截断。
5.3 中文乱码:页面、连接串、数据库三处编码必须一致
现象:从数据库查出来的中文全是问号,或者JSP页面上的中文全是乱码,有的页面正常有的页面不正常。
原因:老项目最常见的翻车点。字符集不是某一处设置能解决的,需要JSP页面、数据库连接、数据库表三端一致,每一处漏了都会乱码。
解决:按下面三处顺序检查。JSP页面顶部必须写<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>,少一个pageEncoding都不行。数据库连接串必须带characterEncoding=utf8。数据库表本身的字符集要确认是utf8,而不是latin1,查看语句是show create table t_user;。如果表是latin1,需要执行alter table t_user convert to character set utf8;。改完之后重启Tomcat再试,因为Tomcat里可能缓存了旧页面。
5.4 表单提交到Servlet变404/405:路径、method、转发三处查
现象:点提交按钮后地址栏变成404,或者提示HTTP method POST is not supported by this URL。
原因:404通常是URL拼错、contextPath不对、或Servlet映射不存在;405是doPost方法没写,或者表单用get方式提交了一个只处理doPost的Servlet。
解决:先看浏览器地址栏。如果地址是http://localhost:8080/servlet/LoginServlet那多半是项目里写死了绝对路径,没有带contextPath。注意看表单里action="${pageContext.request.contextPath}/login"这个写法才是对的。如果地址没问题但404,去web.xml确认url-pattern是否匹配,注意大小写和末尾斜杠。如果是405,去Servlet类里找doPost方法,把要处理的内容写进doPost,或者干脆让doGet调用doPost:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); }还有一类特殊404是JSP文件放在WEB-INF目录下,浏览器直接访问不到,必须通过Servlet转发。如果页面路径显示/WEB-INF/xxx.jsp没报错说明是转发,直接手动访问这个地址才报404,那不是Bug,是正常的容器保护行为。
5.5 上传图片重启就消失:别把文件写到解压后的临时目录里
现象:管理员后台能上传图片,当时也显示了,重启Tomcat后再看图片全变裂图。
原因:代码里把上传文件写到了request.getServletContext().getRealPath("/")目录下。这个目录在IDEA里运行时其实是target或out目录下的临时位置,每次重新部署都会被清掉,等于上一张图只活了一次运行周期。这个问题几乎所有图片上传功能都有,属于“跑通了但没完全跑通”。
解决:把上传目录改成操作系统里的固定绝对路径。常见做法是在项目里新建一个配置项,比如upload.path=D:/uploads,代码里用这个路径拼接保存。前端展示时,写一个独立的DownloadServlet或者直接在JSP里通过虚拟映射访问这个目录。Tomcat里可以加一个<Context docBase="D:/uploads" path="/upload" debug="0"/>来做目录映射,但更适合答辩的做法,是单独写一个Servlet去读取文件流。另外注意给文件改名,用UUID加后缀,避免中文文件名和重名问题。这个坑我自己的血泪经验是:第一次遇到时对着缓存清了半天,后来才反应过来是文件压根没落在项目里。
6. 答辩前的加分改造:把状态机、搜索、时间校验装进去
6.1 给预约订单加“时间冲突校验”,比加页面更有效
你不用新增任何表,只需要在生成订单前加一次查询:
select count(*) from t_order where worker_id = ? and status in (1, 2, 3) and appoint_time = ?如果count大于0,直接提示“该时间已被预约”。这段逻辑可以用一句话讲清楚:同一工人同一时段只允许存在一条未完成订单。这就是一个能直接回答“你这系统怎么处理冲突”的规则,比做个假按钮扎实得多。
6.2 把服务列表改成多条件搜索,一条LIKE句撑起功能点
在服务列表页加一个关键词输入框和大项分类下拉框,后台SQL改成:
select * from t_service where name like concat('%', ?, '%') order by price asc配合PreparedStatement用问号传参,安全且简单。演示时先输入“保洁”再输入“月嫂”,结果跟着变,这个功能点的说服力比“增删改查”强很多。
6.3 演示前过一遍五条关键路径
| 操作路径 | 账号 | 预期结果 | 失败检查点 |
|---|---|---|---|
| 用户注册并登录 | 测试号 | 跳首页,显示用户名 | session、注册Servlet |
| 用户预约服务 | 测试号 | 生成待派单订单 | 事务、t_order插入 |
| 管理员后台派单 | admin | 订单状态变为已派单 | 更新语句、worker状态 |
| 用户评价已完成订单 | 测试号 | 评价列表出现记录 | t_comment插入 |
| 后台查看全部订单 | admin | 按状态展示列表 | 联表查询SQL |
我自己接手的每个项目,演示前都会先跑一遍这张表,缺哪补哪。特别是派单那一步,很多项目在“管理员指定工人”和“订单状态更新”之间没做事务,容易出现数据对不上。先把现成的系统跑稳,再谈加功能。希望这份笔记能帮你少踩几个坑,把javaweb家政服务管理系统这类的毕设项目从“能开给老师看”做到“能讲给老师听”。
本文还有配套的精品资源,点击获取