尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

家政小程序毕设实战:Java+MySQL全栈开发与部署指南

发布时间:2026/9/26 11:24:34

资讯中心
01
ARTICLE

家政小程序毕设实战:Java+MySQL全栈开发与部署指南

家政小程序毕设实战:Java+MySQL全栈开发与部署指南
简介这份资源是面向计算机专业学生与Java初学者的一站式家政服务类微信小程序毕业设计源码包内含完整前后端工程与数据库文件可直接用于毕业设计、课程设计或小程序开发练手。压缩包共1212个文件约16.27MB以png、svg等界面素材js、vue、wxml、wxss等小程序与前端代码java后端源码以及json配置、sql数据库脚本和xml部署描述为主覆盖从页面渲染到业务逻辑再到数据存储的完整链路。项目围绕个人中心、用户管理、家政人员管理、家政服务管理、咨询信息与回复管理、家政预约管理、留言板管理及系统管理展开管理员可统一维护人员、服务与预约普通用户则能在线咨询并预约家政人员。开发环境采用JDK1.8、MySQL5.7、Maven3.3与Tomcat7前端可用HBuilderX或微信开发者工具打开便于对照调试与二次开发。目前已有67人学习适合需要完整赛题方案、模块化目录参考与排错思路的读者。1. 家政小程序毕设选型为什么 Java MySQL 这套组合至今没被淘汰打开任何一个毕设选题群家政服务类小程序的出现频率高得离谱。原因不复杂业务闭环清晰用户下单→阿姨接单→上门服务→评价结算角色权限分明普通用户、服务人员、管理员数据表关系够用但不至于失控。但真正让这个选题值得动手的是它逼着你把「小程序前端 Java 后端 MySQL 数据库」这条链路完整走一遍——而不是像很多管理系统那样只写 CRUD 就交差。我带过几届学生的毕设见过太多人卡在环境配置上耗掉两周也见过有人用现成模板改改界面就答辩结果被问到「订单状态怎么流转的」直接哑火。这篇笔记面向两类人一是选了家政小程序做毕设、需要一套能跑通的源码参考和部署路径的二是想用这个项目练手全栈开发、但不想在环境上反复翻车的。我会把技术选型理由、数据库设计、核心接口实现、部署调试和几个血泪坑按顺序讲清楚你照着做能跑起来也能在答辩时说出「为什么这么做」。2. 家政小程序的技术栈拆解从需求反推每一层选什么2.1 为什么是 Java 而不是 Node 或 Python 做后端毕设场景下选 Java 做后端核心理由不是「Java 更好」而是「Java 更稳、资料更多、答辩老师更认」。家政项目涉及订单状态机、支付回调模拟、定时任务比如超时未接单自动取消这些逻辑用 Spring Boot 写出来结构清晰Controller-Service-Mapper 三层分得明明白白论文里画架构图也好看。具体版本选择上我一般推荐 JDK 8 或 JDK 11 Spring Boot 2.7.x。别追 JDK 17 和 Spring Boot 3.x虽然新特性多但 MyBatis-Plus 某些版本、Druid 连接池、JWT 工具类在 Jakarta 命名空间下会有兼容问题毕设时间耗不起。Maven 依赖管理用 3.8 即可阿里云镜像配好拉包速度能快十倍。微信小程序端不需要额外框架原生 WXML WXSS JS 足够。如果你已经会 Vue可以用 uni-app 编译到小程序但纯毕设建议原生写少一层编译黑匣子出问题好排查。小程序基础库选 2.30 以上wx.request封装、wx.login换 openid、wx.chooseLocation选地址这些 API 都稳定。MySQL 选 5.7 或 8.0 都行。5.7 的好处是网上教程多、mysql-connector-java驱动版本兼容性好8.0 的好处是支持窗口函数、JSON 字段类型更完善。如果你论文里要写「数据库选型分析」可以说 8.0 的 InnoDB 默认行锁和事务隔离级别更适合订单并发场景。安装方式上Windows 用 MSI 安装包最省事Linux 用 apt 或 yum 装完记得systemctl enable mysql设置开机自启。2.2 家政业务的数据表怎么设计才不返工数据表设计是毕设里最容易埋雷的地方。我见过有人把订单、服务、用户全塞一张表后期加个「阿姨接单」功能就得改表结构论文也跟着重写。正确做法是按领域拆表核心表至少这几张表名作用关键字段user普通用户id, openid, nickname, phone, avatarstaff家政人员id, name, phone, skill, status, ratingservice_item服务项目id, name, price, duration, categoryorder订单主表id, user_id, staff_id, service_id, status, amount, create_timeorder_log订单状态流转id, order_id, from_status, to_status, operator, remarkaddress用户地址id, user_id, detail, contact, phonereview评价id, order_id, score, content, create_timeorder表的status字段用整数枚举0 待接单、1 已接单、2 服务中、3 已完成、4 已取消。每次状态变更往order_log插一条记录答辩时老师问「订单怎么流转的」你直接查这张表就能说清楚。staff表的status控制接单开关rating存平均评分每次用户评价后更新。建表时注意几个细节所有表加create_time和update_time用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP金额字段用DECIMAL(10,2)不用FLOATopenid加唯一索引外键关系在逻辑层维护物理外键不建避免级联删除把数据搞丢。2.3 小程序端请求封装与登录态保持小程序端最容易被忽略的是请求封装。很多毕设代码里每个页面都写一遍wx.request改个 baseURL 要改几十处。正确做法是抽一个request.js// utils/request.js const BASE_URL http://localhost:8080/api; function request(options) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL options.url, method: options.method || GET, data: options.data || {}, header: { content-type: application/json, token: wx.getStorageSync(token) || }, success(res) { if (res.statusCode 200 res.data.code 0) { resolve(res.data.data); } else if (res.data.code 401) { // token 过期重新登录 wx.removeStorageSync(token); wx.navigateTo({ url: /pages/login/login }); reject(res.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 };这段代码做了三件事统一拼接 baseURL、自动携带 token、统一处理 401 和错误提示。token在登录成功后由后端返回存到wx.setStorageSync后续每个请求自动带上。注意wx.request的header里content-type默认是application/json如果你后端用RequestParam接收表单参数要改成application/x-www-form-urlencoded否则参数收不到——这个坑我后面还会提。登录流程用wx.login拿 code传给后端换 openid 和 session_key后端生成 token 返回。不要在小程序端直接调微信接口换 openidappsecret不能放在前端。3. 从零跑通家政小程序环境搭建与核心接口实现3.1 后端工程结构与依赖配置后端用 Spring Boot 搭目录结构按标准三层分src/main/java/com/housekeeping/ ├── controller/ // 接口层 ├── service/ // 业务逻辑 │ └── impl/ ├── mapper/ // MyBatis 接口 ├── entity/ // 数据库实体 ├── dto/ // 请求/响应对象 ├── config/ // 配置类 ├── utils/ // 工具类 └── HousekeepingApplication.javapom.xml核心依赖dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.33/version /dependency dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.16/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt/artifactId version0.9.1/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependenciesMyBatis-Plus 省去了大量 XML 编写BaseMapper自带增删改查复杂查询再写 XML。Druid 做连接池监控页面能看 SQL 执行情况调试时很有用。JWT 做 token 签发和校验jjwt0.9.1 在 JDK 8 下稳定JDK 11 需要加javax.xml.bind依赖。application.yml关键配置server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/housekeeping?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: 你的密码 type: com.alibaba.druid.pool.DruidDataSource mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImplserverTimezoneAsia/Shanghai必须加否则 MySQL 8.0 下时间字段会差 8 小时。useSSLfalse避免本地连接时的 SSL 警告。map-underscore-to-camel-case让create_time自动映射到createTime省去手动写Results。3.2 订单创建与状态流转接口订单模块是家政项目的核心。创建订单接口需要校验用户是否登录、服务项目是否存在、地址是否属于当前用户。代码逻辑PostMapping(/order/create) public Result createOrder(RequestBody OrderCreateDTO dto, HttpServletRequest request) { Long userId JwtUtil.getUserId(request); // 校验服务项目 ServiceItem item serviceItemMapper.selectById(dto.getServiceId()); if (item null) { return Result.error(服务项目不存在); } // 校验地址归属 Address address addressMapper.selectById(dto.getAddressId()); if (address null || !address.getUserId().equals(userId)) { return Result.error(地址信息有误); } // 生成订单 Order order new Order(); order.setUserId(userId); order.setServiceId(dto.getServiceId()); order.setAddressId(dto.getAddressId()); order.setAmount(item.getPrice()); order.setStatus(0); // 待接单 order.setCreateTime(new Date()); orderMapper.insert(order); // 记录状态日志 orderLogMapper.insert(new OrderLog(order.getId(), null, 0, 用户, 创建订单)); return Result.success(order.getId()); }JwtUtil.getUserId从请求头 token 解析用户 ID解析失败抛异常由全局异常处理器返回 401。OrderCreateDTO只包含serviceId和addressId金额从数据库查不信任前端传的价格——这是安全底线。状态流转接口用PUT /order/status接收orderId和targetStatus校验当前状态是否允许流转到目标状态。比如待接单0只能到已接单1或已取消4已完成3不能再变。每次变更写order_log同时更新staff表的接单状态。3.3 小程序端页面跳转与数据绑定小程序端页面按角色分用户端首页、下单、订单列表、个人中心、阿姨端接单大厅、我的订单、管理端Web 后台不在小程序里做。首页用swiper轮播服务分类wx:for渲染服务列表点击跳详情页带serviceId参数。下单页用picker选地址wx.chooseLocation获取经纬度form提交时调request封装的方法。订单列表用onShow生命周期刷新数据因为从详情页返回时onLoad不会重新触发。分页用scroll-view的bindscrolltolower加载更多page和pageSize传给后端。数据绑定注意setData的性能不要频繁调用列表数据一次性 setwx:key用唯一 ID 不用索引否则列表更新时 DOM 复用会出错。这些细节答辩时老师不一定问但代码质量体现在这里。4. 部署与联调把项目从本地搬到能演示的状态4.1 MySQL 建库建表与初始数据拿到源码后第一步是建库。用 Navicat 或命令行都行mysql -u root -p CREATE DATABASE housekeeping DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE housekeeping; source /path/to/housekeeping.sql;utf8mb4而不是utf8因为用户昵称可能包含 emojiutf8存不进去。导入 SQL 后检查service_item表有没有初始服务数据没有的话手动插几条INSERT INTO service_item (name, price, duration, category) VALUES (日常保洁, 120.00, 2, 保洁), (深度保洁, 300.00, 4, 保洁), (家电清洗, 150.00, 1, 清洗), (月嫂服务, 800.00, 8, 母婴);staff表也插几条测试数据status设为 1 表示可接单。user表不用插小程序登录会自动创建。4.2 后端启动与接口自测IDEA 里直接跑HousekeepingApplication控制台看到Started HousekeepingApplication说明启动成功。用 Postman 测接口POST /api/user/login传{ code: xxx }返回 tokenGET /api/service/list带 token返回服务列表POST /api/order/create传{ serviceId: 1, addressId: 1 }返回订单 ID如果登录接口报appid或secret错误检查application.yml里微信配置有没有填对。毕设演示可以用测试号但测试号不能真机调试只能开发者工具里跑。真机调试需要正式 appid个人主体也能申请流程不复杂。4.3 小程序端配置与真机预览微信开发者工具导入小程序代码修改app.js里的globalData.baseUrl指向后端地址。本地调试用http://localhost:8080但真机预览时手机访问不到电脑的 localhost需要把后端部署到局域网 IP 或者用内网穿透工具。毕设答辩一般用开发者工具演示不强制真机。开发者工具里勾选「不校验合法域名」否则wx.request会拦截 localhost 请求。这个选项在「详情 → 本地设置」里只对开发阶段有效上线要配 HTTPS 域名。联调时常见问题小程序请求后端返回 404检查RequestMapping路径和前端url是否一致返回 500 看后端控制台异常栈返回 401 检查 token 有没有带或者过期。把这些排查顺序记住能省很多时间。5. 避坑与排查家政小程序开发中最容易翻车的 5 个点5.1 中文乱码数据库、连接、响应三处都要查现象服务名称在数据库里正常小程序端显示问号或乱码。原因三个环节可能出问题——数据库字符集不是utf8mb4、JDBC URL 没加characterEncodingutf-8、Spring Boot 响应没配produces application/json;charsetutf-8。解决建库时指定utf8mb4JDBC URL 加useUnicodetruecharacterEncodingutf-8Controller 的RequestMapping加produces属性。三处都对了才不会乱码。5.2 时间差 8 小时serverTimezone 和 Jackson 时区现象订单创建时间是凌晨 2 点数据库里存的是前一天 18 点。原因MySQL 8.0 默认时区是 UTCJDBC 没指定serverTimezone就按 UTC 解析。另外 Jackson 序列化Date时默认用 UTC 时区。解决JDBC URL 加serverTimezoneAsia/Shanghaiapplication.yml里加spring.jackson.time-zoneGMT8。如果还不对检查 MySQL 全局时区SHOW VARIABLES LIKE %time_zone%用SET GLOBAL time_zone 8:00改。5.3 token 失效不跳转前端拦截器没写对现象token 过期后接口返回 401但小程序没跳登录页页面卡住。原因request.js里只处理了code 0的情况401 没单独判断或者判断了但reject之后页面没做处理。解决在request的success回调里优先判断res.data.code 401清除本地 token 并wx.redirectTo到登录页。注意用redirectTo不是navigateTo避免页面栈堆积。5.4 订单状态并发更新没加乐观锁现象两个阿姨同时点接单订单被接了两次。原因查询订单状态和更新状态之间有时间窗口两个请求都查到「待接单」都执行了更新。解决用 MyBatis-Plus 的Version乐观锁或者 SQL 里加条件UPDATE order SET status 1 WHERE id ? AND status 0根据影响行数判断是否成功。毕设演示并发场景少但代码里加上这个逻辑答辩时是加分项。5.5 小程序 setData 数据量过大导致卡顿现象订单列表加载 50 条后页面滑动卡顿。原因setData一次性传了完整列表每次滚动加载都重新 set 全量数据。解决分页加载每次setData只追加新数据用concat合并数组。图片用lazy-load列表项用wx:key优化复用。如果数据量确实大考虑用recycle-view组件。6. 让家政小程序毕设多拿 10 分三个低成本高回报的进阶技巧6.1 用订单日志表做状态流转可视化答辩时老师最爱问「订单状态怎么保证不出错」。你如果只回答「代码里判断了」说服力一般。但如果你把order_log表的数据查出来在小程序端用时间轴展示「谁在什么时间把订单从待接单改成已接单」这就是一个完整的审计链路。实现上订单详情页加一个GET /order/logs?orderIdxxx接口返回日志列表前端用wx:for渲染时间轴。代码量不大但演示效果很好。6.2 用定时任务处理超时未接单家政业务里用户下单后如果 30 分钟没阿姨接单应该自动取消并通知用户。这个逻辑用 Spring 的Scheduled实现Scheduled(fixedRate 60000) // 每分钟执行一次 public void cancelTimeoutOrders() { Date timeout new Date(System.currentTimeMillis() - 30 * 60 * 1000); ListOrder orders orderMapper.selectList( new LambdaQueryWrapperOrder() .eq(Order::getStatus, 0) .lt(Order::getCreateTime, timeout) ); for (Order order : orders) { order.setStatus(4); orderMapper.updateById(order); orderLogMapper.insert(new OrderLog(order.getId(), 0, 4, 系统, 超时未接单自动取消)); } }启动类加EnableScheduling。这个功能代码不到 20 行但论文里可以写「基于定时任务的订单超时处理机制」听起来就比纯 CRUD 有含量。6.3 接口文档用 Swagger 自动生成毕设论文一般要求附接口文档。手写费时且容易和代码不一致。加springfox-swagger2和springfox-swagger-ui依赖配置类里开EnableSwagger2Controller 方法加ApiOperation注解启动后访问http://localhost:8080/swagger-ui.html就能看到所有接口。截图放进论文比手写表格规范得多。注意 Spring Boot 2.7 配 Swagger 2.9.2 有路径匹配问题需要加spring.mvc.pathmatch.matching-strategyant_path_matcher。这三个技巧都不复杂但能让你的项目从「能跑」变成「有设计」。我自己的习惯是每做完一个模块先想「这个功能答辩时怎么讲」再决定要不要加日志、加定时、加文档。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。