
简介面向毕业设计的家政服务平台项目采用微信小程序前端、Java后端与MySQL数据库的经典组合覆盖管理员对用户、家政人员、服务项目、咨询回复、预约订单、留言板及系统配置的完整管理链路同时支持用户在线咨询与预约家政人员适合作为计算机相关专业毕设或课程设计的参考原型。压缩包共1214个文件约32.55MB核心类型包括Java源码、Vue管理端组件、小程序页面文件wxml/wxss/js/json、png/jpg界面截图、SQL脚本及2个演示视频另附一键安装/运行脚本与项目配置文件方便本地部署和二次开发。已有203人学习浏览说明其具备一定的参考价值。源码和演示视频配合使用能直观理解小程序与后端接口的交互方式、预约流程的状态流转以及后台管理的模块划分既可用于完整项目学习也能在此基础上扩展家政服务相关功能节省从零搭建的时间。1. 做毕设最怕的是什么一套「微信小程序Java 后端」家政项目能解决什么做毕设最怕的不是没思路而是一套代码传了七八手到你自己电脑上跑不起来。这套「基于微信小程序Java 后端的家政项目」好就好在它是个完整闭环小程序端负责下单和接单Java 后端暴露接口MySQL 数据库把用户、家政服务、订单状态全串起来同时还配了源码、演示视频、说明文档和数据库文件。对计算机或软件工程专业的大四学生来说它解决的是「演示要能跑、答辩要能讲、论文要有依据」三件事。本文就从这三件事出发先拆项目结构再给本地跑通的完整步骤最后把最容易让人翻车的几个坑一次说清楚。2. 把家政项目拆开看小程序端、Java 后端与数据库是怎么分活的拿到一个前后端分离的毕设项目第一件事不是急着点运行而是搞清楚三端各自管什么。这个家政项目的业务主线其实很朴素用户在小程序里浏览家政服务、发起预约、查看订单进度后台的人员接单、改状态最后用户确认完工并评价。理解这条链路读代码和写论文都会顺很多。2.1 小程序端页面、路由与请求封装微信小程序端是用户直接接触的一层常见结构是pages目录下按业务拆页面首页展示服务分类、预约页承载表单、订单页列状态、个人中心放登录入口。原生小程序用的是 WXML WXSS JS页面路由由app.json的pages数组控制数组第一项就是启动页。看一个项目的时候先打开app.json基本就能摸清功能范围。小程序和后端通信全靠wx.request但我不建议在每个页面里都裸写。比较稳妥的做法是封装一个 request 模块把 baseURL、token 注入、错误码拦截都收拢到一个文件里// utils/request.js const BASE_URL http://192.168.1.100:8080/api; function request(path, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL path, method, data, header: { Content-Type: application/json, // 登录后把 token 存进 storage每次请求自动带上 Authorization: wx.getStorageSync(token) || }, success: (res) { // 后端统一返回 { code, msg, data }code 为 0 表示成功 if (res.data.code 0) { resolve(res.data.data); } else { wx.showToast({ title: res.data.msg || 请求失败, icon: none }); reject(res.data); } }, fail: (err) { wx.showToast({ title: 网络异常请检查后端服务, icon: none }); reject(err); } }); }); } module.exports { request, BASE_URL };封装的逻辑不难但有两个参数需要特别留意。第一是BASE_URL本地联调时不要写localhost要写电脑的局域网 IP否则真机预览时请求会打到手机自己身上。第二是Authorization头token 为空时也要带上这个字段后端拦截器才好在未登录时给出明确的 401 提示而不是报一堆让人看不懂的异常。页面开发里有两个高频小细节自定义顶部导航栏时要动态测量状态栏高度wx.getWindowInfo()拿到statusBarHeight后再叠加导航栏自身高度否则在带刘海屏的手机上布局会顶到摄像头区域预约表单里的服务品类选择用radio-group配合radio就能满足项目里的预约页也基本都是这个套路不需要引入额外的组件库。2.2 Java 后端分层结构与核心接口后端我用 Spring Boot 来对应这是绝大多数 Java 毕设项目的选择因为起步快、生态成熟、资料多。代码层面常见的分包方式是 controller、service、mapper、entity 四层如果项目里出现dto或vo包那多半是为了把请求参数和返回体分离方便处理。// 一个典型的 Controller 写法只做参数接收和结果返回 RestController RequestMapping(/api/order) public class OrderController { Resource private OrderService orderService; PostMapping(/create) public Result create(RequestBody OrderCreateRequest request) { return Result.success(orderService.createOrder(request)); } GetMapping(/list) public Result list(RequestParam Integer userId, RequestParam(defaultValue 1) Integer page, RequestParam(defaultValue 10) Integer size) { return Result.success(orderService.listOrders(userId, page, size)); } }接口设计上这个项目里比较核心的就四个创建预约、接单/派单、更新订单状态、确认完成。Result是一个统一返回体把code、msg、data包起来小程序端的 request 封装才能按统一结构解析。这里有一个选型理由值得写进论文用统一返回体而不是直接返回实体类好处是前端处理错误逻辑只需要判断一个字段后端的异常也能映射成友好提示而不是裸抛堆栈。Service 层是业务逻辑的主要载体也是答辩时老师最可能追问的地方。比如创建订单时要校验用户是否登录、服务项是否存在、预约时间是否合法这些都应该在createOrder方法里串起来而不是散落在 Controller 里。至于 mapper 层常见做法是继承 MyBatis-Plus 的BaseMapperT简单查询不用写 SQL复杂统计再上注解或 XML这套组合对毕设来说够用且不容易出错。2.3 数据库在项目里承担的角色三个端里数据库最容易被人忽视但它恰恰是家政项目的重心。业务上用户、家政服务、服务人员、订单、评价这五类数据对应的表设计直接决定业务能不能闭环。判断一个毕设数据库设计好不好就看订单状态是存在订单表里还是散落在各种日志表里。合理的设计是订单表只保留当前状态用order_status字段驱动服务人员和用户分别存在单独的表中通过订单表的外键关联起来。数据库的价值不只是存数据还替后端扛了一部分业务约束。比如订单表里的status字段通常是0 待接单 / 1 已接单 / 2 服务中 / 3 已完成 / 4 已取消这种整数枚举后端改状态时只需要做值校验和流转校验不用反复查别的表。这个状态机模型写进论文里是很实在的功能点也方便画业务流程图。3. 本地跑起来的第一步后端启动参数与小程序导入毕设项目拿到手第一关永远是「跑起来」。后端起不来小程序界面再漂亮也是空壳。这一章按常见做法把后端启动和小程序导入拆开讲每一步的坑都标出来。3.1 后端启动JDK 版本、MySQL 连接与 application.yml 的 5 个参数后端能不能一次启动成功90% 取决于application.yml配得对不对。常见模样长这样server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/housekeeping?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: Asia/Shanghai mybatis-plus: configuration: map-underscore-to-camel-case: true global-config: db-config: id-type: auto这里至少 5 个参数是必调的少一个都可能让项目在启动或运行中出问题。第一是server.port默认 8080如果你本机有其他服务占用改成 8081 或 8082 都行但记得小程序端的BASE_URL里的端口必须同步改。第二是username和password这是你自己 MySQL 的账号密码毕业设计包里默认写的通常是root/123456不改的话直接连不上。第三是serverTimezoneAsia/Shanghai不配的话插入订单时间会差 8 小时答辩时往数据库一查数据对不上非常尴尬。第四是allowPublicKeyRetrievaltrueMySQL 8.0 版本默认不允许客户端自动获取公钥不加这个参数连接阶段就会报Public Key Retrieval is not allowed。第五是driver-class-name如果你用的是 MySQL 5.x驱动类要改成com.mysql.jdbc.Driver版本不匹配是最隐蔽的躺枪原因。启动命令不复杂项目根目录下执行mvn spring-boot:run如果你本机没装 Maven或者项目已经打包过也可以用java -jar target/housekeeping-0.0.1-SNAPSHOT.jar我的习惯是先跑mvn clean package -DskipTests把依赖和打包问题提前暴露出来再启动 jar 包。启动日志里出现Tomcat started on port(s): 8080基本就成了。如果看到数据库连接异常先把 yml 里的账号密码、URL 参数逐项核对一遍再检查 MySQL 服务有没有启动这两个原因占了后端起不来的八成情况。3.2 导入小程序工程切换 AppID 与关闭域名校验后端起来了接着用微信开发者工具导入小程序端目录。导入时选择「导入项目」目录指向源码包里的小程序文件夹AppID 需要处理一下。个人开发模式下没有企业 AppID可以先选「测试号」跑通流程。这里有一个关键开关必须开在开发者工具的「详情 → 本地设置」里勾选「不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书」。不勾的话wx.request请求 8080 端口的 http 接口会被直接拦下来报url not in domain list而这个问题跟代码没有任何关系只是开发环境的域名校验策略。BASE_URL的地址也要跟着改。电脑本机调试时模拟器里可以写http://127.0.0.1:8080但如果要用手机真机预览必须改成电脑的局域网 IP。查看方式是命令行执行ipconfigWindows或ifconfigMac/Linux找到无线网卡的 IPv4 地址例如192.168.1.100然后// config.js module.exports { // 本地联调用电脑局域网 IP真机预览必须与后端同一局域网 baseURL: http://192.168.1.100:8080/api };这里还有一层容易漏后端 Spring Boot 默认只绑定 localhost并不是Spring Boot 默认绑定 0.0.0.0也就是所有网卡都可访问不需要特别配置。但如果你本机开了防火墙手机访问时 8080 端口可能被拦常见做法是先关掉本机防火墙或者放行 8080 端口再贴下真机调试。开发者工具里点「真机调试」会生成一个预览二维码手机扫码后如果白屏或请求失败优先排查 IP 通不通、端口放没放行、WiFi 是不是同一个。4. 数据库初始化和微信手机号登录毕设最容易被问倒的两块数据库初始化是打开项目后的第一道操作关微信手机号登录则是答辩时老师最喜欢追问的业务点。这两块串起来刚好是一条完整链路用户授权手机号 → 后端换手机号查用户 → 没有则注册 → 登录成功返回 token → 后续请求带 token。把这条链路吃透整份毕设的技术含金量会明显上一个台阶。4.1 初始化数据库导入 SQL 并核对核心表项目包里的数据库文件通常是一个.sql脚本名字类似database.sql或housekeeping.sql。在 Navicat 里新建数据库后直接运行脚本是最省事的方式但命令行导入其实更直观mysql -u root -p --default-character-setutf8mb4 housekeeping housekeeping.sql--default-character-setutf8mb4这个参数值得单独说。之前出现过导入完成后表里全是乱码的情况因为.sql文件是 UTF-8 编码而 MySQL 客户端默认用utf8mb4或latin1解析两边不一致数据就花了。加了这个参数导入过程中的字符串解析会按 UTF-8 走中文字段值能正常落库。导入完成后用下面这条命令确认表和关键字段都在USE housekeeping; SHOW TABLES; SELECT COUNT(*) FROM user_info;核心表一般不出这几张用户表、家政服务表、服务人员表、预约订单表、评价表。带数据库的毕设项目表结构这里通常会多花些心思。看数据库设计时重点看订单表和用户表之间的关联字段以及是否有status类字段。状态字段设计得好不好一眼能看出来——用TINYINT存状态码并且有注释比用字符串或者 0/1 裸奔要专业很多。4.2 小程序登录获取手机号前端 open-type 与后端换手机号家政项目里用户下单必须绑定手机号所以登录获取手机号这个功能几乎每家毕设都会做。微信官方推荐的做法其实已经很成熟前端用button组件指定open-typegetPhoneNumber用户点击后微信返回一个动态令牌code前端把code传给后端由后端用code换手机号并完成登录。注意现在获取到的手机号是通过code换取的拿到的是加密后的手机号后端需要调用对应接口处理。!-- 登录页用户点击后触发 open-type 回调 -- button open-typegetPhoneNumber bindgetphonenumberonGetPhoneNumber 微信一键登录 /button// 登录页 js onGetPhoneNumber(e) { if (e.detail.code) { // 把动态令牌 code 发给后端由后端换手机号 request(/login/phone, POST, { code: e.detail.code }) .then((res) { wx.setStorageSync(token, res.token); wx.setStorageSync(userInfo, res.userInfo); wx.navigateBack(); }); } else { wx.showToast({ title: 已取消授权, icon: none }); } }后端拿到code之后的处理逻辑是完整链路的关键伪代码大概是先拿code调用微信接口换取手机号如果换不到就返回「授权过期请重试」换到了就去user_info表查手机号是否存在存在则直接更新登录时间不存在则插入一条用户记录最后签发一个 JWT token 返回给前端。这里有一个很容易答不上来的点在答辩时经常被问后端返回手机号或 token 前能不能在日志里打印code不行code是一次性的有效期只有几分钟一旦被日志打印或重复使用第二次必然失败。我一般会在代码里加一行注释「此处 code 只能用一次不要打印日志」防止同事或自己手滑。4.3 增删改查在项目里怎么落以预约下单为例如果说手机号登录是业务亮点那增删改查就是毕设必须露脸的基本功。家政预约的完整流程里增、删、改、查全都占到了而且每一条都有清晰对应的业务含义用户提交预约是往订单表insert一条记录用户取消订单是update订单状态服务人员接单是修改订单表的接单人和状态我的订单列表是select按条件查询。建议在论文的「系统实现」章节这样讲比单纯罗列 CRUD 接口要高级得多。我以订单状态更新为例给你看看常见的后端写法。用 MyBatis-Plus 的updateById就能完成但状态流转建议做一层守卫防止非法跳转public boolean updateOrderStatus(Long orderId, Integer userId, Integer targetStatus) { OrderInfo order orderMapper.selectById(orderId); if (order null || !userId.equals(order.getWorkerId())) { // 订单不存在或当前操作人不是接单人直接拒绝 return false; } // 只允许从待接单 - 已接单 - 服务中 - 已完成 的顺序流转 if (targetStatus - order.getStatus() ! 1) { return false; } order.setStatus(targetStatus); return orderMapper.updateById(order) 0; }这段代码有两个细节值得在答辩时强调。第一状态流转校验用的是相邻状态差值为 1这比随便赋值的update安全订单不会从已完成被改回服务中。第二更新前先查一遍订单归属保证「只有接单人才能改状态」这个业务规则在代码层面有约束而不只靠前端隐藏按钮。这两点都会让老师觉得你考虑到了实际业务边界而不是背代码。5. 家政毕设避坑连不上后端、数据错乱、登录失灵的 5 个典型问题这一章内容全部来自实战里反复出现的现场。每条按「现象 → 原因 → 解决」展开方便你直接对照排查。5.1 真机预览时请求失败模拟器一切正常现象开发者工具模拟器里下单、查列表都正常扫二维码真机预览后页面能打开但所有请求全部失败弹「网络异常」。原因小程序端BASE_URL写的是localhost或127.0.0.1模拟器里localhost指向开发者工具所在电脑真机上localhost指向手机本身手机上没有后端服务。解决把BASE_URL改成电脑的局域网 IP比如http://192.168.1.100:8080/api并保证手机和电脑连接的是同一个 WiFi。改完记得在微信开发者工具里点「清缓存 → 清除全部缓存」否则旧地址可能残留。5.2 后端启动报 Public Key Retrieval is not allowed现象后端启动或第一次请求数据库时报错堆栈里有Public Key Retrieval is not allowed关键字。原因MySQL 8.0 出于安全考虑默认不允许客户端通过非 SSL 连接自动获取 RSA 公钥。解决在 JDBC URL 上追加参数allowPublicKeyRetrievaltrue完整的 URL 形如jdbc:mysql://localhost:3306/housekeeping?useSSLfalseallowPublicKeyRetrievaltrueserverTimezoneAsia/Shanghai。如果还不放心可以在 MySQL 命令行确认用户认证方式是caching_sha2_password还是mysql_native_password前者就需要这个参数。提示改完application.yml必须重启后端进程Spring Boot 不会自动热加载配置文件。改完还报错就 CtrlC 杀掉进程再启动别用 IDE 的「Rerun」有时候它走的是旧编译产物。5.3 数据库导入后中文乱码订单表里全是「???」现象SQL 脚本导入成功但查询表数据时中文显示成一排问号或乱码。原因导入时客户端字符集与脚本编码不一致脚本是 UTF-8但 MySQL 客户端按 GBK 或 latin1 解析了。解决导入命令显式指定字符集--default-character-setutf8mb4同时检查housekeeping数据库本身的字符集是否为utf8mb4。用 Navicat 的话在「连接属性」的编码栏里选UTF-8再重新运行 SQL 文件。这个坑最折磨人的地方在于建表能成功、报错也没有直到展示阶段才暴露。5.4 登录接口被拦截器拦截一直返回 401现象小程序端能打开登录页但点登录按钮永远提示「未登录或登录已过期」后端日志显示请求根本没进到 Controller。原因项目里用了 Spring Boot 拦截器或过滤器做 token 校验但拦截器配置里没有放行登录接口。解决在拦截器配置中显式排除登录相关的路径例如registry.addInterceptor(authInterceptor) .addPathPatterns(/api/**) .excludePathPatterns(/api/login/**, /api/captcha);这是毕设项目里最常见的配置遗漏。写代码时加拦截器是为了保护接口但忘记配放行规则后登录接口自己都会进黑名单。排查方法很简单后端日志里如果能看到每次请求都打印了preHandle相关的拦截日志基本就定位到了。5.5 getPhoneNumber 返回的 code 换手机号失败现象用户点击「微信一键登录」开发者工具报invalid code或code been used。原因getPhoneNumber返回的code是一次性的同一个code只能换取一次手机号而且有效期极短。前端如果没把code及时传给后端或者后端处理过程中打印了日志部分日志框架会把参数打出来第二次调用就会失败。解决后端拿到code后立即调用微信接口换取手机号不做任何中间处理同时在前端代码里不要缓存code更不要在wx.setStorageSync里存这个值。我一般在后端还会加一个 Redis 记录已用code重复请求直接返回友好提示而不是让微信接口返回错误码。6. 答辩加分动作地图找阿姨与演示前的自测清单毕设做到「能跑」只是及格答辩要出彩得有一个能讲出来的亮点功能。家政项目的天然加分项是「附近家政人员」地图页它的业务逻辑完全贴合家政场景用户需要知道服务人员离自己多远、能不能及时上门。6.1 给小程序加一个「附近家政人员」地图页常见做法是用微信小程序的map组件配合腾讯位置服务申请一个key把服务人员的经纬度做成markers渲染在地图上。页面结构不复杂map组件占满整屏下方列表展示距离最近的几位服务人员。关键参数是 marker 的经度、纬度和callout气泡内容点击气泡或者列表项可以跳转到服务人员的详情页直接发起预约。这个功能等于把原本的「列表选人」变成了「地图找人」业务体验上更贴近生活服务类小程序答辩演示时的画面感也更强。要注意两个细节定位权限需要在app.json里声明permission字段并填写用途说明key必须配置到小程序后台的合法域名里否则地图组件无法正常加载。6.2 演示前把这 4 条链路自己走一遍很多人在答辩现场翻车是因为只在答辩前夜试过一次而且只试了「打开首页」这一个动作。演示视频可以帮你预热但视频里走的路径和现场点击的路径不可能完全一致自己心里有数最重要。我每次演示前至少会完整走四件事。第一从头注册一个新用户验证手机号授权流程没有被旧的登录态干扰。第二用新用户下单一个家政服务订单状态从「待接单」变成「已接单」这一步验证了后端状态更新逻辑。第三用另一个账号接单并点「完成服务」验证订单状态能走到「已完成」。第四退出登录后再进个人中心确认页面跳转到登录页而不是展示残留缓存。这四条链路走完核心业务就真的稳了。至于后端日志平时调接口时报错先看控制台有没有异常堆栈再看 SQL 执行到哪一步停了比瞎猜靠谱得多。这也是我做了几个毕设项目后的习惯不依赖演示视频兜底而是把最长的业务链路在正式演示前完整过一遍卡住的地方老老实实改代码改到顺为止。希望这套「跑通、讲清、能加分」的思路能帮到你让这份家政项目从 rar 包真正变成你自己的东西。本文还有配套的精品资源点击获取