
简介面向计算机、软件类专业学生的家政项目微信小程序毕业设计源码包可作课程设计或小程序实战参考。项目包含管理员后台与用户小程序两端覆盖用户管理、家政人员与服务管理、咨询回复、家政预约、留言板、系统管理等模块展示完整业务闭环。压缩包共1212个文件、约16.27MB以 js/vue/java/json/wxml/wxss 代码为主配合 png/jpg 图片、sql 数据库脚本及 bat 启动打包脚本还含 xml/css 等配置便于理解结构并本地部署。当前已有67人学习下载。源码包含可运行的 Java 后端、小程序前端和数据库文件可对照梳理用户咨询、预约、回复流程配合 Maven 与 Tomcat 配置可快速导入运行也可二次扩展适合毕设答辩与功能演示。1. 家政小程序毕业设计Java小程序MySQL 源码包怎么变成自己的项目很多人的毕设文件夹里都躺着一个家政项目小程序的源码包Java 后端、小程序前端、MySQL 脚本和论文LW文档一应俱全解压后却不知从哪下手。这类项目技术栈高度固定后端 Spring Boot 出接口小程序端调接口MySQL 存用户和订单数据。搞清这三层怎么协作你才能从能打开项目变成能讲明白项目。这篇笔记写给两类人把家政服务当毕设题目的同学以及想快速搭一个带下单流程 demo 的开发者。家政项目的价值不在功能花哨而在于把用户下单、商家接单、服务完成、评价这条链路完整串起来这正是答辩时讲业务逻辑最好的素材。结论先说只要源码包文件齐全这个方向就值得投入。你要做的不是重写模块而是把环境跑通、把核心代码读透、再针对一两个薄弱点做增量开发。章节按这个顺序展开每一步都有可以直接照抄的命令和参数。2. 技术栈拆解小程序端、Java 后端和 MySQL 各管哪一段拿到源码包第一件事不是急着双击启动而是先看目录结构。家政项目通常是个单体仓库根目录下分四块小程序端目录里面有 app.js、pages、utils 这些后端是一个 Maven 工程带 pom.xml 和 src数据库脚本是独立的 .sql 文件论文LW文档单独放一份里面有需求分析、ER 图、接口设计表这些是答辩时直接能用的素材先扫一遍能省很多理解时间。2.1 小程序端请求封装、登录态和页面跳转的常见写法家政小程序的页面基本固定在五个首页展示服务分类和服务卡片下单页选时间填地址订单列表页带状态标签切换服务详情页以及个人中心页。每个页面一个文件夹里面有 .wxml、.wxss、.js、.json 四个文件。模板项目里页面间跳转多用 wx.navigateTo传参用 query 字符串值简单够用复杂对象建议放进全局变量或 storage别往 URL 里塞。最值得读的是 utils/request.js它把 wx.request 封装成 Promise。下面这段是家政项目模板里最常见的写法几乎每个包都能找到同款// utils/request.js const BASE_URL http://127.0.0.1:8080/api function request(path, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method: method, data: data, header: { Content-Type: application/json, // 登录后把 token 存进 storage所有请求统一带上 Authorization: wx.getStorageSync(token) || }, success: (res) { // 后端统一返回 code0 成功非 0 弹提示 if (res.data.code 0) { resolve(res.data.data) } else { wx.showToast({ title: res.data.msg, icon: none }) reject(res.data) } }, fail: (err) reject(err) }) }) } module.exports { request, BASE_URL }逻辑说明BASE_URL 是接口根路径本地联调用 127.0.0.1 加后端端口。header 里的 Authorization 是登录接口返回后写入缓存的后端拦截器靠它识别用户身份。注意很多模板只在 success 里判断业务码不处理 401导致 token 过期后页面白屏或反复弹窗。你可以拿到源码后先看这一处没有 401 兜底就自己补一段跳转登录页的逻辑。参数说明path 是接口路径method 默认 GETdata 是请求体。wx.request 的 header 必须写在请求参数对象的同名层级里写错层级的话请求能发出去但 token 丢了后端会把匿名请求当成游客处理。另外小程序里 success 回调拿到的是 HTTP 200 的响应体业务上 code 非 0 也必须自己拦这和 Web 端 axios 拦截器习惯不太一样。登录态常驻逻辑一般长这样// app.js App({ onLaunch() { // 取微信登录凭证 code发到后端换 token wx.login({ success: (res) { wx.request({ url: http://127.0.0.1:8080/api/login, method: POST, data: { code: res.code }, success: (res) { if (res.data.code 0) { wx.setStorageSync(token, res.data.data.token) wx.setStorageSync(userInfo, res.data.data.userInfo) } } }) } }) } })这里要特别留意时序问题wx.login 是异步的如果某个页面在 onLaunch 还没走完时就发出业务请求token 还没写入 storage请求就会以匿名身份打到后端。这个 bug 在模板项目里极其常见表现就是小程序冷启动后第一次进订单列表是空的手动刷新一次又正常。解法是做一个等待登录完成的 Promise 队列或者在请求封装里缓存登录 Promise让后续请求先 await 它再发。2.2 Java 后端三层分包、统一返回体和拦截器的套路后端工程清一色分层controller 接收参数service 写业务逻辑mapper 操作数据库entity 对应表结构。此外一定有个 common 或 config 包里面放着统一返回体 Result、全局异常处理器和用户登录拦截器。先看这三个类整个后端就懂了七八成。统一返回体的典型结构是 { code, msg, data }code0 是成功。全局异常处理器负责把业务异常转为 JSON 返回而不是让框架返回一坨默认错误页。拦截器是理解权限控制的关键家政项目里通常拦截除了 /api/login 和 /api/service 列表之外的所有接口从 Authorization 头解析用户 id 放进 ThreadLocalcontroller 里直接取。// common/config/LoginInterceptor.java public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 放行登录接口和服务列表接口 String uri request.getRequestURI(); if (uri.endsWith(/login) || uri.contains(/service/list)) { return true; } // 从请求头取 token解析失败就返回 401 String token request.getHeader(Authorization); Long userId JwtUtil.parseToken(token); if (userId null) { response.setStatus(401); response.setContentType(application/json;charsetUTF-8); response.getWriter().write({\code\:401,\msg\:\登录已过期\,\data\:null}); return false; } // 解析成功放进 ThreadLocal 供后续业务读取 UserContext.setUserId(userId); return true; } }逻辑说明preHandle 里先放行白名单再解析 token。家政项目用 JSON Web Token 的情况最多格式是用户 id 加过期时间签出来的字符串。token 解析失败统一返回 401和前面小程序端说的401 兜底正好对应。解析成功把用户 id 放到 ThreadLocalcontroller 和 service 直接用 UserContext.getUserId() 拿当前用户前端传什么 userId 都不可信以这里为准。有个细节值得你看一眼模板后端大概率没写 token 刷新机制token 过期时间设得很长比如 7 天甚至 30 天图省事但答辩时被人问token 过期了怎么办会卡住。你可以只说设计上是让用户重新登录不涉及复杂刷新把这当一个已知边界讲出来。2.3 MySQL 核心表订单表是理解整套业务的钥匙家政项目的数据库表数量通常在 6 到 10 张核心是用户表、服务分类表、服务项表、订单表、评价表。订单表是理解整套业务的钥匙它把用户、服务、支付、派单状态全串在一个表里。下面是一张精简后的订单表结构跑源码时可以对着自己项目里的表看字段差异CREATE TABLE t_order ( id bigint(20) NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 订单号展示与支付对账用, user_id bigint(20) NOT NULL COMMENT 下单用户, service_item_id bigint(20) NOT NULL COMMENT 服务项 id, worker_id bigint(20) DEFAULT NULL COMMENT 接单服务人员 id, service_time datetime DEFAULT NULL COMMENT 预约服务时间, address varchar(200) DEFAULT NULL COMMENT 服务地址, status tinyint(4) NOT NULL DEFAULT 0 COMMENT 0待支付 1待接单 2待服务 3服务中 4已完成 5已取消, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这张表的设计思路是一个订单从创建到结束所有关键状态都用一个 status 字段驱动省去多表关联。服务人员不单独建订单关联表直接在订单表上挂 worker_id接单动作就是把这个字段从空更新成某个人。后端所有业务逻辑几乎都在围绕 status 的流转做判断理解了这个状态机你看 service 层代码会轻松很多。表设计方面还有两个常见取舍地址直接存字符串而不是关联地址表适合毕设这种演示级项目金额字段用 decimal(10,2)别用 float不然订单金额算错这类问题答辩现场很难解释。如果源码里的表结构少了索引可以补上 KEY idx_user_id 这种常用查询索引对答辩加分有帮助。3. 把源码跑通的三步版本搭配、数据库导入、小程序联调跑通源码之前先确认一件事你的电脑上是否已有的环境版本和项目匹配。毕设源码不像商业项目那么规范很可能只在某个 JDK 和 MySQL 版本下测过版本差太多就会出现各种让你以为是代码问题的玄学报错。这一章按最小依赖顺序走每步做完都有一个明确的验证点。3.1 版本搭配JDK、Maven、MySQL 和开发者工具怎么选组件推荐配置注意事项JDK1.8多数毕设 pom.xml 里编译等级就是 1.8别换 17Maven3.6 及以上主要看 IDE 内置版本能解析 pom 即可MySQL5.7 或 8.08.0 需配套驱动 8.x并加时区参数微信开发者工具最新稳定版本地联调必须关闭合法域名校验操作系统Windows / macOS 均可端口占用处理命令不同下文会单独说版本搭配的选型理由很简单模板项目多半是在这些组件的经典组合下跑通的JDK 1.8 加 MySQL 5.7 是多年来的黄金组合。如果你机器上已经装了 JDK 17 和 MySQL 8也不用重装JDK 17 编译时把 source/target 改成 1.8 就行MySQL 8 则在连接串里加 serverTimezoneAsia/Shanghai这两处是改动成本最低的兼容方式。3.2 创建数据库、导入脚本并启动 Spring Boot 后端第一步是建库导数据。家政项目 SQL 脚本有两种格式一种是纯建表和插入语句需要你自己先建库另一种开头带着 CREATE DATABASE 语句可以直接整体导入。先看一眼 SQL 文件前几行就知道是哪种。# 方式一脚本里没有建库语句先手动建库再导入 mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS housekeeping_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; mysql -uroot -p housekeeping_db db/housekeeping.sql # 方式二脚本自带建库语句直接整体导入 mysql -uroot -p db/housekeeping.sql # 导入后验证表是否齐全 mysql -uroot -p -e USE housekeeping_db; SHOW TABLES;导入成功后打开后端目录下的 application.yml 或 application.properties把数据源连接信息改成你本机的账号密码。最容易漏的是时区和编码参数MySQL 8 不配 serverTimezone 会直接报连接超时异常。server: port: 8080 spring: datasource: url: jdbc:mysql://127.0.0.1:3306/housekeeping_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root # 改成你本机的 MySQL 账号 password: your_password # 改成你本机的密码 driver-class-name: com.mysql.cj.jdbc.Driver后端启动推荐用 IDE 直接运行主类。主类通常在 src/main/java 下类名类似 Application 或 HousekeepingApplication右侧绿色运行按钮点下去控制台出现 Started 开头的日志就说明起来了。用命令行的方式也可以cd 后端目录 mvn clean package -DskipTests java -jar target/后端生成的jar包.jar参数说明mvn clean package 会先清理再打包-DskipTests 跳过测试以节省时间打出来的 jar 包名一般由 pom.xml 里的 artifactId 和 version 拼成target 目录下能看到。如果你不想装 Maven直接用 IDE 内置的 Maven 面板执行 clean 和 install 也可以效果一样。3.3 小程序端改三个地方就能联调后端起来了小程序端还差三步。第一步用微信开发者工具导入小程序目录把 AppID 改成你自己的测试号没有认证的小程序账号也可以用测试号只要在开发者工具里能编译就行。第二步把 request.js 里的 BASE_URL 改成后端的地址本地开发保持 127.0.0.1:8080。第三步最关键点击开发者工具右上角详情在本地设置里勾选不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书。// 改完的效果 const BASE_URL http://127.0.0.1:8080/api联调验证标准很简单编译后首页能看到服务分类列表点击一个服务能进详情能走通下单接口。如果首页是空的按 F12 打开调试器看 Network 面板所有请求都失败说明后端没起来或者 BASE_URL 拼错了只有个别请求失败说明路径或参数有问题对着后端 controller 的 RequestMapping 逐段比对。这个排查习惯贯穿整个项目调试先看网络请求再看后端日志别一头扎进代码里猜。4. 家政核心业务链路下单、派单、评价的代码怎么落地家政项目能答辩的核心卖点是把一条真实业务链路走通了。这一章挑三个最有代表性的节点拆代码下单时怎么防止数据错乱、接单时怎么防止两个人抢同一单、评价时怎么保证一单一评。每个节点都对应一套固定的实现套路理解了之后换成任何业务场景都能迁移。4.1 下单接口事务、订单号和状态初始化的配合下单接口是家政系统里最值得讲的一段。前端提交服务项 id、预约时间、地址后端要做三件事校验服务项存在且上架、生成唯一订单号、把初始状态设为待支付。代码如下Service public class OrderServiceImpl implements OrderService { Override Transactional(rollbackFor Exception.class) public Long createOrder(Long userId, OrderCreateDTO dto) { // 校验服务项存在且上架 ServiceItem item serviceItemMapper.selectById(dto.getServiceItemId()); if (item null || item.getStatus() ! 1) { throw new BizException(服务项不存在或已下架); } // 订单号时间戳加用户 id 后四位保证并发下基本不重复 String orderNo HK System.currentTimeMillis() String.format(%04d, userId % 10000); Order order new Order(); order.setOrderNo(orderNo); order.setUserId(userId); order.setServiceItemId(item.getId()); order.setAmount(item.getPrice()); // 金额以后端查到的为准 order.setServiceTime(dto.getServiceTime()); order.setAddress(dto.getAddress()); order.setStatus(0); // 0待支付 orderMapper.insert(order); return order.getId(); } }逻辑说明Transactional 保证插入过程中出错时整体回滚不会出现订单记录写了一半的情况。金额不信任前端传参按服务项表的单价填充这是答疑时容易出彩的设计点。订单号用时间戳拼用户 id 后四位单机演示场景下足够了如果用了全局订单号生成器也得在答辩前能解释它的原理。参数说明OrderCreateDTO 是前端传来的请求体里面的 serviceTime 是预约时间address 是服务地址。BizException 是自定义业务异常会被全局异常处理器捕获并转成 { code:xxx, msg:xxxx } 返回。status 初始为 0后续所有业务分支都围绕这个状态值展开。4.2 派单逻辑用乐观锁防止两个人接同一单家政项目最简单的派单方案是抢单订单支付完成变成待接单后服务人员端能刷到待接单列表点接单就完成指派。这里必须处理并发问题——两个服务人员同时点接单不能让两个人都接成功。// mapper 里的更新语句核心是 status1 这个条件 Update(UPDATE t_order SET worker_id #{workerId}, status 2 WHERE id #{orderId} AND status 1) int acceptOrder(Param(orderId) Long orderId, Param(workerId) Long workerId); // service 里的调用 public void acceptOrder(Long orderId, Long workerId) { int rows orderMapper.acceptOrder(orderId, workerId); if (rows 0) { throw new BizException(手慢了订单已被接走); } }逻辑说明这里用了一条带条件更新的 SQL把判断状态是否为待接单和更新接单人合并成一个原子操作。MySQL 里这条 update 会锁住匹配的行第二个人的 update 进来时发现 status 已经不是 1影响行数为 0于是抛业务异常。这个手法叫乐观锁是并发场景里最简单可靠的防重方案简历和答辩里写这一句就够用了。参数说明status2 表示待服务workerId 是接单人的用户 id。如果模板项目里没有这一处带条件的 update而是先 select 再 update你最好自己改成上述写法。这是评审老师最爱问的并发问题的标准答案有了它你在答辩时能主动讲出设计取舍。4.3 评价接口一单一评的三种校验缺一不可评价是业务链路的最后一环家政项目里它校验最多订单必须属于当前用户、订单状态必须是已完成、同订单不能重复评价。三个条件缺一个就要拦截。Transactional(rollbackFor Exception.class) public void addEvaluation(Long userId, EvaluationDTO dto) { // 第一层订单存在且属于当前用户 Order order orderMapper.selectById(dto.getOrderId()); if (order null || !order.getUserId().equals(userId)) { throw new BizException(订单不存在); } // 第二层订单已完成为才能评价 if (order.getStatus() ! 4) { throw new BizException(服务完成之后才能评价); } // 第三层一个订单只能评价一次 Integer count evaluationMapper.countByOrderId(dto.getOrderId()); if (count 0) { throw new BizException(该订单已评价过); } Evaluation evaluation new Evaluation(); evaluation.setOrderId(dto.getOrderId()); evaluation.setUserId(userId); evaluation.setRating(dto.getRating()); evaluation.setContent(dto.getContent()); evaluationMapper.insert(evaluation); }逻辑说明评价接口的三层校验是典型的业务规则编码化。第一层用 equals 而不是 原因是 user id 类型是 Long 时超出 127 的数值用 会比较对象引用这是个经典翻车点。第三层用 count 查询加事务兜底虽然高并发下仍可能重复插入但毕设演示里足够。如果你想更严谨可以给 evaluation 表加一个 order_id 唯一索引让数据库层面兜底。参数说明rating 是 1 到 5 的整数content 是评论文本前端提交时可能为空后端可以用 NotBlank 注解控制或允许为空。状态 4 即已完成也就是订单全链路最后一步验证点在于先完成服务再评价顺序反了会被拦下。5. 避坑指南跑毕设源码最常踩的 5 个坑这一章是真正花时间调试出来的血泪经验。下面五个问题覆盖了从环境到部署大部分崩溃场景每条都按现象 → 原因 → 解决写遇到可以直接对号入座。5.1 数据库连接失败时区、密码和驱动三个叠加坑现象后端启动时控制台刷出 Communications link failure 或 Access denied for user rootlocalhost应用起不来。原因一般是三个原因叠加——MySQL 密码和配置文件不一致MySQL 8 默认用了 caching_sha2_password 认证老版本驱动解析不了连接串缺 serverTimezone 参数导致时区解析失败。解决先用命令行 mysql -uroot -p 手动登录验证密码是否正确别信 GUI 工具里保存过的密码。再把驱动版本对齐到 MySQL 8 对应的 com.mysql.cj.jdbc.Driver最后补齐 serverTimezoneAsia/Shanghai。三个检查点按顺序走五分钟内定位。5.2 后端启动报 Unsupported major.minor versionJDK 版本不匹配现象启动主类时立刻抛出 java.lang.UnsupportedClassVersionError后面跟着一串数字版本号。原因项目编译时用的 JDK 版本比当前运行版本新或旧得太离谱。比如 pom.xml 里 source/target 是 1.8但你用 JDK 17 运行时可能有兼容问题反过来项目里用了高版本语法你就必须装对应版本的 JDK。解决先看 pom.xml 里的 java.version 字段再在 IDE 里检查项目 SDK 和模块语言级别两处都调成一致。最简单粗暴的方案是装一个 JDK 1.8把 IDE 的 SDK、Maven 的 JRE、运行配置三处全部指到它。5.3 小程序端请求全部失败域名校验没关现象开发者工具里编译正常页面能渲染但所有 wx.request 的 console 都输出url not in domain list接口返回不了数据。原因微信开发者工具默认校验请求域名必须是 HTTPS 白名单。本地联调用的 127.0.0.1 是 HTTP必然被拦。解决右上角详情→本地设置→勾选不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书。注意这个选项只对当前项目生效换机器重导项目要重新勾。真机预览时也需要在预览窗口右上角打开调试模式否则真机上同样会被拦。5.4 Maven 依赖下载不动卡在 downloading 或一直转圈现象第一次加载后端工程时IDE 底部状态栏一直显示 downloading等十几分钟还在转或者直接报缺少某个依赖包。原因Maven 默认的中央仓库地址访问速度不稳定下载大依赖时经常超时导致依赖解析失败。解决打开 Maven 安装目录下 conf/settings.xml在 mirrors 节点里配置一个可用的镜像地址然后把 IDE 的 Maven 配置指到这份 settings.xml。注意配置完要执行一次reimport或刷新 Maven 项目不是改完文件就生效。5.5 真机预览连不上后端127.0.0.1 和局域网 IP 不是一回事现象模拟器里一切正常一扫码真机预览接口全部超时页面转圈出不来数据。原因手机上的127.0.0.1指的是手机自己不是你的电脑。真机调试必须让手机和电脑连同一个局域网请求地址改成电脑的局域网 IP。解决电脑上执行 ipconfigWindows或 ifconfigMac查局域网 IP比如 192.168.x.x把 request.js 的 BASE_URL 改成 http://192.168.x.x:8080/api。同时确认 Windows 防火墙放行了 8080 端口不然手机还是连不通。这个场景下后端代码不用改只动 BASE_URL。6. 增量开发加一个进度字段答辩演示这样自测跑通源码、回答上原理问题之后真正让你和纯用模板拉开差距的是增量开发。不需要做多复杂的功能一个小的、能讲清楚的数据字段变更就够。这里演示给订单加服务进度字段的完整改动路径顺带把答辩自测的方法一起说清楚。-- 1. 数据库加字段 ALTER TABLE t_order ADD COLUMN progress varchar(100) DEFAULT NULL COMMENT 服务进度描述;// 2. 实体类加字段 private String progress; // 3. 完成服务时更新进度 public void updateProgress(Long orderId, String progress) { Order order new Order(); order.setId(orderId); order.setProgress(progress); orderMapper.updateById(order); }改动就三步数据库加列、实体加属性、service 加方法。小程序端在订单详情页把这个字段展示出来一个服务进度模块就闭环了。这个增量有两个好处一是面试或答辩时能说清从数据库到接口到页面的完整链路二是可以顺势聊为什么用字段而不是状态机——进度描述是给用户看的文案状态机是给系统判断用的两者职责不同。答辩演示前按三步自测第一冷启动小程序完整走一遍登录、下单、接单、服务完成、评价记录每一步的响应时间保证演示时不断链第二故意做几个异常操作——重复提交同一订单、评价未完成的订单、用第二个账号抢同一个单确认后端都弹了预期提示第三准备三个为什么问题比如为什么金额以后端为准为什么接单用乐观锁为什么评价要查三次对着代码能讲出理由这比背 PPT 有用得多。我自己的习惯是拿到任何一份源码先跑通再挑一个最薄弱的环节动手加上自己的代码最后才写论文。当年我就是吃了论文和代码不一致的亏评审老师按论文问实现细节答不上来直接翻车。后来带人做项目第一件事永远是先跑通再谈优化。这个顺序你照着走答辩基本稳了希望帮到你。本文还有配套的精品资源点击获取