微信小程序对接Java后端的家政系统实战 简介本资源是一套完整的家政服务类毕业设计项目面向计算机相关专业本科生及Java全栈初学者聚焦微信小程序与Spring Boot后端协同开发的实战场景解决家政预约、人员管理与用户咨询等典型业务需求。压缩包共1214个文件涵盖119个Java后端逻辑类、134个Vue前端组件、175个JS交互脚本、231个PNG图标资源及86个WXML页面结构文件辅以SQL建表语句、MP4演示视频与详细说明文档整体体积32.55MB结构分层清晰便于理解前后端通信与权限控制机制。已有203人学习下载资源提供可直接运行的源码、完整数据库脚本、管理员与用户双角色操作录屏以及bat一键部署脚本install/run/build显著降低环境搭建门槛适合课程设计复现、毕设参考与小程序Java技术栈整合学习。1. 微信小程序Java家政系统毕业设计不是套壳模板是能跑通「预约-派单-评价」闭环的完整工程你手头那份标着“微信小程序Java后端”的家政项目压缩包大概率不是网上搜来的空壳Demo——它真能完成一次从用户点击“保洁服务”、填写地址时间、下单支付到后台管理员分派师傅、师傅接单确认、服务完成后双方互评的全流程。我去年帮三个学院指导毕设翻过不下40个所谓“家政系统”90%卡在「登录能进、首页能刷、但点预约就404」而这个资源里wxapp目录下有带wx.request真实调用后端接口的页面逻辑springboot模块里OrderController.java里明明白白写着PostMapping(/api/order/create)数据库脚本schema.sql里连t_order_status_log这种状态流转日志表都建好了。它适合两类人一是大三下刚学完Spring Boot和小程序基础、急需一个不踩环境坑、不缺关键链路、能现场答辩演示的毕设载体二是想快速验证「小程序如何对接Java RESTful API」的初学者——别被标题里的“毕业设计”误导它的接口设计、权限分层、事务控制比很多小公司内部系统还扎实。2. 源码结构拆解与核心链路还原看清它为什么不是拼凑货2.1 目录树即架构图四个模块各司其职打开.rar解压后的根目录你会看到四个平行文件夹wxapp小程序前端、springboot-backendJava后端、database数据库脚本、docs文档与视频。这不是随意堆放而是典型的前后端分离毕业设计标准结构wxapp基于原生微信小程序框架非uni-apppages/order/create下的create.js里wx.request({url: https://localhost:8080/api/order/create, ...})直接指向后端API且所有网络请求都封装在utils/request.js中统一处理tokenspringboot-backendSpring Boot 2.7.x MyBatis Pluspom.xml里明确依赖spring-boot-starter-web、mybatis-plus-boot-starter、spring-boot-starter-data-redis用于存储验证码database包含schema.sql建表语句和init_data.sql初始化管理员、测试用户、服务类型数据其中t_user表有role ENUM(customer,worker,admin)字段权限控制已落地docs演示视频.mp4实录了从微信开发者工具启动→登录→选择保洁→填写地址→下单→后台管理端查看订单→派单→师傅端接单→完成评价的全过程时长6分23秒无剪辑跳转。提示别急着跑起来先看springboot-backend/src/main/resources/application.yml里的spring.datasource.url——默认是jdbc:mysql://localhost:3306/home_service?useSSLfalseserverTimezoneAsia/Shanghai这意味着你本地必须装MySQL 5.7且已创建home_service库。很多同学直接双击Application.java报错根源就在这行配置没改。2.2 关键链路代码精读从下单到派单的三次状态跃迁毕业设计最怕“功能看起来有实际走不通”。我们盯住核心业务链路——用户下单后订单如何从“待接单”变成“已派单”这背后藏着三个关键节点2.2.1 小程序端表单提交触发真实API调用// wxapp/pages/order/create/create.js submitOrder() { const data { serviceType: this.data.serviceType, address: this.data.address, timeSlot: this.data.timeSlot, remark: this.data.remark }; wx.request({ url: getApp().globalData.baseUrl /api/order/create, method: POST, data: data, header: { Authorization: wx.getStorageSync(token) }, // 携带JWT token success: (res) { if (res.data.code 200) { wx.showToast({ title: 下单成功, icon: success }); setTimeout(() wx.navigateBack(), 1500); } }, fail: (err) console.error(下单失败, err) }); }这段代码的关键在于getApp().globalData.baseUrl从全局变量读取后端地址避免硬编码header里传Authorization说明后端启用了JWT鉴权springboot-backend里SecurityConfig.java配置了http.authorizeRequests()success回调里判断res.data.code 200而非只看HTTP状态码说明后端返回的是统一响应体ResultT。2.2.2 Java后端事务包裹的订单创建与状态初始化// springboot-backend/src/main/java/com/example/controller/OrderController.java PostMapping(/api/order/create) public ResultOrderVO createOrder(RequestBody OrderDTO dto, RequestHeader(Authorization) String token) { // 1. 校验token并解析用户ID省略JWT解析逻辑 Long userId jwtUtil.getUserIdFromToken(token.replace(Bearer , )); // 2. 创建订单实体含初始状态 Order order new Order(); order.setCustomerId(userId); order.setServiceType(dto.getServiceType()); order.setAddress(dto.getAddress()); order.setStatus(OrderStatus.WAITING_ASSIGNMENT.getCode()); // 关键初始状态为待派单 order.setCreateTime(new Date()); // 3. 事务内保存订单 插入状态日志 try { orderService.save(order); // MyBatis Plus save方法 statusLogService.insertLog(order.getId(), OrderStatus.WAITING_ASSIGNMENT, 用户下单); return Result.success(orderConverter.toVO(order)); } catch (Exception e) { throw new ServiceException(创建订单失败); } }这里体现毕业设计应有的工程素养RequestBody OrderDTO接收前端数据OrderVO返回视图对象DTO/VO分离清晰OrderStatus.WAITING_ASSIGNMENT是枚举类定义的状态码非魔法数字statusLogService.insertLog(...)确保每次状态变更都有迹可循答辩时可展示日志表。2.2.3 管理后台人工派单触发状态跃迁管理员在/admin/order/list页面点击“派单”调用的是另一个接口// springboot-backend/src/main/java/com/example/controller/AdminOrderController.java PostMapping(/admin/order/assign/{orderId}) public ResultString assignOrder(PathVariable Long orderId, RequestBody AssignDTO dto) { // 1. 查询订单校验状态是否为WAITING_ASSIGNMENT Order order orderService.getById(orderId); if (!OrderStatus.WAITING_ASSIGNMENT.getCode().equals(order.getStatus())) { return Result.fail(订单状态异常无法派单); } // 2. 更新订单工人ID和状态 order.setWorkerId(dto.getWorkerId()); order.setStatus(OrderStatus.ASSIGNED.getCode()); order.setAssignTime(new Date()); orderService.updateById(order); // 3. 记录新状态日志 statusLogService.insertLog(orderId, OrderStatus.ASSIGNED, 管理员派单给工人ID: dto.getWorkerId()); return Result.success(派单成功); }注意if校验只有状态为WAITING_ASSIGNMENT才允许派单这是状态机思想的落地。很多毕设漏掉这步导致“已完工订单还能被重复派单”。3. 本地运行四步法绕过90%新手卡点的实操路径3.1 数据库准备用init_data.sql填平第一道坑别自己手建表直接执行database/init_data.sql不是schema.sql单独执行。原因init_data.sql里包含INSERT INTO t_user (...) VALUES (...),(...)其中第一个用户是管理员账号usernameadmin,password$2a$10$...是BCrypt加密后的密码第二个是测试客户usernametestuser第三个是测试师傅usernameworker1。如果你只跑schema.sql表是空的登录时永远提示“用户不存在”。操作步骤# 1. 登录MySQL mysql -u root -p # 2. 创建数据库字符集必须utf8mb4 CREATE DATABASE home_service CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 3. 切换数据库并执行初始化脚本 USE home_service; source /path/to/your/database/init_data.sql;注意init_data.sql里密码是BCrypt加密的明文是123456。管理员账号密码就是admin/123456客户账号testuser/123456师傅账号worker1/123456——这是硬编码在SQL里的不是后端生成的。3.2 后端启动修改application.yml三处关键配置springboot-backend/src/main/resources/application.yml需调整spring: datasource: url: jdbc:mysql://localhost:3306/home_service?useSSLfalseserverTimezoneAsia/Shanghai username: root # 改成你的MySQL用户名 password: 123456 # 改成你的MySQL密码 redis: host: localhost port: 6379 password: # 如果Redis没设密码留空 # JWT密钥必须改否则token校验失败 jwt: secret: your_custom_secret_key_here_32_chars # 至少32位随机字符串 expire: 86400 # 24小时过期血泪经验jwt.secret必须改原包里可能是123456这种弱密钥Spring Security的JWT工具类会因密钥长度不足直接抛IllegalArgumentException。我一般用Python生成python -c import secrets; print(secrets.token_urlsafe(32))。3.3 小程序调试用微信开发者工具配置合法域名微信小程序要求所有wx.request必须指向已配置的合法域名。本地开发时需在微信公众平台后台设置登录 微信公众平台 → 开发管理 → 开发设置 → 服务器域名在「request合法域名」中添加https://localhost注意是https不是http重要开发者工具中必须勾选「不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书」右上角详情 → 本地设置否则wx.request会报fail net::ERR_CONNECTION_REFUSED你以为后端没起来其实是域名校验拦截了。3.4 前后端联调验证用curl绕过小程序界面直测接口当小程序界面报错时先用curl验证后端是否真通# 1. 获取用户token模拟登录 curl -X POST http://localhost:8080/api/auth/login \ -H Content-Type: application/json \ -d {username:testuser,password:123456} # 返回示例{code:200,data:{token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...}} # 2. 用token下单替换上面返回的token curl -X POST http://localhost:8080/api/order/create \ -H Content-Type: application/json \ -H Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... \ -d {serviceType:cleaning,address:北京市朝阳区XX大厦,timeSlot:2024-06-15 14:00}如果第二步返回{code:200,data:{...}}说明后端API完全正常问题一定出在小程序端的网络配置或页面逻辑。4. 避坑指南答辩前必须扫清的五个致命细节4.1 现象小程序登录后首页空白控制台报Cannot read property length of undefined原因wxapp/app.js里onLaunch中调用getApp().globalData.baseUrl但globalData未初始化。原包里app.js第12行有globalData: { baseUrl: }但部分同学解压时误删了这行。解决打开wxapp/app.js确认App({对象内有globalData: { baseUrl: https://localhost:8080 }且baseUrl值与后端端口一致默认8080。4.2 现象后台管理端登录成功但订单列表显示“暂无数据”数据库里明明有订单原因springboot-backend/src/main/java/com/example/service/impl/OrderServiceImpl.java中listOrders()方法用了QueryWrapper但条件eq(status, status)写成了eq(status, null)导致查不到任何记录。解决找到该方法将queryWrapper.eq(status, status)改为queryWrapper.isNotNull(status)或传参时确保status不为null管理端列表应查所有状态而非指定状态。4.3 现象派单后师傅端收不到通知WebSocket连接失败原因原包springboot-backend里WebSocket配置类WebSocketConfig.java被注释掉了且pom.xml中spring-boot-starter-websocket依赖被移除。解决取消WebSocketConfig.java的注释在pom.xml中添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency小程序端utils/websocket.js中wsUrl需改为wss://localhost:8080/ws/worker/注意是wss不是ws。4.4 现象上传图片失败后端报java.io.FileNotFoundException: /upload/xxx.jpg (No such file or directory)原因springboot-backend/src/main/resources/application.yml中upload.path配置为/upload/但Linux/Mac系统下该路径不存在且Java无自动创建目录权限。解决方案A推荐在application.yml中改为相对路径upload.path: ./upload/Spring Boot会自动在jar包同级目录创建upload文件夹方案B手动创建/upload目录并赋权chmod 755 /upload。4.5 现象演示视频里“评价功能”能点但实际点击无反应原因wxapp/pages/order/detail/detail.js中onEvaluate()方法调用wx.navigateTo({url: /pages/evaluate/index?orderId this.data.order.id})但/pages/evaluate/index页面不存在——原包里只有/pages/evaluate/create评价提交页缺少评价列表页。解决复制/pages/evaluate/create文件夹重命名为index修改index/index.js中onLoad方法增加根据orderId查询评价记录的逻辑在index/index.wxml中补充评价列表渲染view wx:for{{evaluations}} ...。5. 进阶技巧把毕业设计升级为可演示的“高光时刻”5.1 用Postman自动生成API文档答辩时直接投屏别再手写Word文档用Postman导入后端swagger-ui.html启动后访问http://localhost:8080/swagger-ui.html在Postman中点击Import→Link粘贴http://localhost:8080/v3/api-docsSpringDoc OpenAPI 3.0格式导入后Postman自动生成所有接口集合每个接口含请求示例、参数说明、响应模型答辩时打开Postman选中/api/order/create接口点击Send实时展示JSON响应体——比截图更可信。我从那以后每次指导毕设都强制学生用Postman导出HTML报告Export→HTML打印出来装订成册评委老师翻两页就点头“嗯接口设计规范”。5.2 给小程序加“离线缓存”让演示不依赖网络微信小程序默认关闭离线能力但家政系统常需查看历史订单。在wxapp/app.js中加入// app.js onLaunch中添加 wx.getStorage({ key: orderList, success: (res) { getApp().globalData.orderList res.data; // 缓存订单列表 } }); // 在订单列表页onLoad中优先读缓存 onLoad() { const cached wx.getStorageSync(orderList); if (cached cached.length 0) { this.setData({ orders: cached }); } else { this.loadOrders(); // 再发起网络请求 } }, // 请求成功后写入缓存 loadOrders() { wx.request({ url: getApp().globalData.baseUrl /api/order/list, success: (res) { if (res.data.code 200) { wx.setStorage({ key: orderList, data: res.data.data }); this.setData({ orders: res.data.data }); } } }); }这样即使演示时断网订单列表仍能显示——评委问“没网怎么办”你指屏幕“看历史订单还在”。5.3 后端加“慢SQL日志”答辩时秀性能优化意识在springboot-backend/src/main/resources/application.yml中开启MyBatis Plus慢SQL日志mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: # 开启慢SQL记录执行超100ms的SQL log-exception: true log-slow-sql: true slow-sql-threshold: 100启动后端故意在订单列表页筛选大量数据控制台会输出 Preparing: SELECT * FROM t_order WHERE status ? AND create_time ? Parameters: 1(Integer), 2024-01-01(Date) [SQL Time] 128ms答辩时说“我关注了性能这里查订单用了索引t_order(status,create_time)但仍有128ms下一步计划加Redis缓存热门订单”。5.4 数据库加“唯一约束”堵死重复下单漏洞原包schema.sql中t_order表缺少对customer_id service_type time_slot的联合唯一索引用户可能10秒内狂点下单按钮生成多条相同订单。手动修复-- 在MySQL中执行 ALTER TABLE t_order ADD UNIQUE INDEX uk_customer_service_time (customer_id, service_type, time_slot);然后在Java后端OrderController.createOrder()中捕获DuplicateKeyExceptiontry { orderService.save(order); } catch (DuplicateKeyException e) { return Result.fail(您已在该时段预约此服务请勿重复提交); }这个细节会让评委眼前一亮“哦他考虑到了并发场景”。希望帮到你。本文还有配套的精品资源点击获取