家政管理系统App毕业设计:从部署到答辩的全流程指南
发布时间:2026/9/13 12:54:47 作者:尧图编辑部 阅读量:1,286

简介一份面向计算机专业毕业设计或课程设计的家政管理系统APP完整项目覆盖需求分析、系统架构、Android端实现、后端接口与数据库设计适合需要快速搭建同类移动应用或理解完整开发流程的在校生。压缩包共1728个文件以XML布局、PNG素材、JSON配置、Java源码为主另含Gradle构建脚本及第三方依赖库包体仅3.52MB便于下载与本地编译。已有60人学习下载。项目模块划分清晰包含用户注册登录、服务分类与预约、订单管理、在线支付、评价反馈等核心功能并关注数据安全与接口异常处理结合技术挑战与后续扩展思路能够帮助读者掌握从需求到测试上线的完整闭环也为二次开发或答辩演示提供实际参考。1. 家政管理系统 App zip毕业设计里最常见的「小而全」技术栈打开「毕业设计家政管理系统app.zip」这个压缩包目的通常不是研究代码而是要让整套系统在自己电脑上跑起来然后写论文、做答辩演示。这类毕业设计的技术选型高度雷同Android 客户端加 Java 系后端MySQL 存数据业务围绕用户下单、服务人员派单、订单状态流转展开。它不像企业级系统强调高并发反而把重点放在「一条完整链路能否通」建表、接口调通、app 展示数据、角色权限区分。下面直接按解压后要做的事来排先分清项目构成再改掉几处最容易导致连不上的参数最后给出答辩前用来验证的命令和检查点。2. 解压 zip 后先看目录识别 Android 端、服务端和 SQL 脚本2.1 顶层目录的三种典型形态解压后不要急着用 Android Studio 打开先在文件管理器里看清顶层结构。毕业设计打包出来的 zip 通常有三种形态。第一种是「完整工程型」里面同时存在app/、server/和sql/三个目录README 里甚至写好了启动顺序。这种最省事按顺序执行即可。第二种是「Android 主导型」整个 zip 就是一个 Android 工程后端代码和 SQL 脚本放在app/src/main/assets/或作为附件出现在论文里先去assets/、doc/目录翻有没有.sql文件没有就得从代码里反推接口约定。第三种是「全混在一起型」所有.java、.xml、.sql文件都堆在根目录直接用后缀搜索最可靠用*.sql找数据库脚本用AndroidManifest.xml确认有没有 Android 工程再用pom.xml或build.gradle判断后端类型。识别目标特征文件说明Android 端AndroidManifest.xml、build.gradle找得到就一定能用 Android Studio 打开后端pom.xml、application.ymlSpring Boot 是毕业设计主流后端数据库*.sql、init.sql、db.sql建表脚本决定接口能不能查出数据说明文档README.md、需求文档.docx很多项目把架构图放论文里这张表看一眼就能定位到三类关键文件。注意一点新版 Android Studio 会用自己的 Gradle 版本去兼容老工程如果打开时报 Gradle 版本错配不要立刻改动gradle-wrapper.properties里的版本号先看build.gradle里compileSdk和minSdk是不是低于本地环境多数「打不开」都是这两个值不一致导致的。2.2 Android 工程的分包结构与入口 Activity看清顶层分类后进 Android 工程内部确认分包。毕业设计常用的分包方式有两种按类型分和按功能分。按类型分会出现activity、adapter、entity、utils四个常规包按功能分会变成user、order、worker这种业务包。判断项目属于哪种只需要在src/main/java下扫一眼包名。入口 Activity 通常在AndroidManifest.xml的intent-filter里声明了MAIN和LAUNCHER的那个。首次运行时需要特别留意启动页的逻辑有些项目会先跳登录页有些项目写死了LoginActivity作为入口。如果登录接口没调通app 会一直停在登录页或直接闪退这往往是后端还没启动或地址没改对而不是代码有问题。AndroidManifest.xml里还有一项必须检查就是网络声明。Android 9API 28以后默认禁止明文 HTTP 流量而毕业设计项目后端几乎都是本机http://开头的地址不放开的话请求会直接抛出CLEARTEXT communication not permitted。判断方法很简单搜索 manifest 里有没有usesCleartextTraffictrue这个点下一章会给出完整改法。2.3 后端工程的分层与 SQL 脚本位置后端如果是 Spring Boot包结构通常为controller、service、mapper、entity。controller 处理 HTTP 请求service 写业务逻辑mapper 对应数据库操作。毕业设计里常见的做法是使用 MyBatis 的 XML 文件SQL 写在src/main/resources/mapper/下接口文件名和Mapper注解类一一对应。找 SQL 脚本还有个更直接的办法看application.yml或application.properties里的spring.sql.init配置。如果配了schema.sql数据库初始化就归 Spring Boot 管如果没配建表脚本就是独立的.sql文件需要手动导入 MySQL。两种方式对应不同的排错思路手动导入时注意表的创建顺序外键表必须等主表建完再建否则会报Cannot add foreign key constraint。2.4 版本匹配关系一眼判断能否直接运行识别完三层结构之后先核对三组版本关系再动手。第一组是 Android 的compileSdk与本地 SDK 版本电脑装的 SDK 版本低于项目要求时会提示failed to find target SDK。第二组是 Gradle 版本与 Android Studio 版本Gradle 7 以上的工程用旧版 Studio 打开会直接界面报错。第三组是后端 Spring Boot 与 JDK 的对应关系Spring Boot 2.x 用 JDK 8 或 11Spring Boot 3.x 必须 JDK 17 以上。顺着这三组关系排查大部分「跑不起来」都能在十分钟内定位到原因。一个实用的判断顺序是先java -version看本机 JDK再打开build.gradle看sourceCompatibility最后看 Spring Boot 的pom.xml或build.gradle里声明的版本。三者对齐后启动阶段可以少踩一半坑。3. 让 app 连上后端数据库建库与连接参数的 5 处必改3.1 数据库脚本的执行顺序与字符集先说建库。拿到.sql脚本后用命令行导入比用 Navicat 图形界面更容易观察报错mysql -u root -p -e CREATE DATABASE IF NOT EXISTS housekeep DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; mysql -u root -p housekeep db.sql第一条命令建库并指定字符集为utf8mb4第二条命令把脚本导入这个库。utf8mb4用来存用户昵称、服务备注里的生僻字utf8在某些 MySQL 版本下会因字符不够而告警。如果导入时报Unknown database说明建库名和脚本里写的USE语句不一致直接打开脚本文件把开头的USE xxx;改成实际的库名或者建库时就用脚本里那个名字。导入完成后不要急着启动后端先确认数据表数量。执行SHOW TABLES;对比脚本里 CREATE 语句的条数如果数量对不上大多数情况是某段 SQL 中途报错被中断。常见中断原因是外键顺序和自增主键缺失可搜索脚本中FOREIGN KEY出现的位置调整建表顺序即可。3.2 application.yml 里最容易被忽略的 4 个参数后端配置文件里真正影响启动和联调的是这四组参数端口、数据库连接、时区、文件上传大小限制。一个典型的本地配置长这样server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/housekeep?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true spring.servlet.multipart.max-file-size: 10MB max-request-size: 10MB逐项说明server.port决定后端占用哪个端口改它就必须同时改 Android 端请求地址里的端口两边不一致会出现连接超时而不是请求被拒url里的serverTimezone不写高版本 MySQL 驱动连DATETIME字段时会报时区异常map-underscore-to-camel-case控制数据库下划线字段名自动映射到 Java 的驼峰属性不开这个user_name就会映射为空登录时用户名永远校验不过multipart 两个限制是上传头像和服务图片必改的默认 1MB 在手机拍照场景下大概率超限报 500。一个特别容易踩的坑是driver-class-name的驱动类名。MySQL 5.x 的驱动是com.mysql.jdbc.Driver8.x 变成了com.mysql.cj.jdbc.Driver。如果项目里用的是旧驱动、本机装的是 MySQL 8数据库连接会一直报通信失败。判断方式报错信息里出现Public Key Retrieval is not allowed时在 url 末尾追加allowPublicKeyRetrievaltrue这是 MySQL 8 默认认证插件导致的不是代码问题。3.3 Android 端 baseUrl 的三种写法后端启动后把请求地址写进 Android 工程。先创建一个通用的配置类集中管理地址避免散落在各个 Activity 里public class ApiConfig { // 模拟器访问宿主机用 10.0.2.2真机用电脑局域网 IP public static final String BASE_URL http://10.0.2.2:8080; // 登录接口 public static final String LOGIN_URL BASE_URL /api/user/login; // 提交订单 public static final String ORDER_URL BASE_URL /api/order/create; }三种环境的地址写法要分清Android Studio 自带模拟器里访问本机后端用10.0.2.2代替localhost这是模拟器对宿主机回环地址的固定映射真机调试时把地址改成电脑在局域网里的 IP例如http://192.168.1.100:8080真机和电脑务必处于同一个 Wi-Fi如果后端部署在云服务器直接用公网 IP 或域名。无论哪种地址里都不能漏端口。改完地址还有个必然要处理的明文流量问题。在AndroidManifest.xml的application标签上加这一行application android:usesCleartextTraffictrue ... 加完后http://请求才能正常发出。上了生产环境应当改用 HTTPS 并移除这一项但毕业设计演示阶段这是最快通路。如果加了仍然报网络连接失败去res/xml/下建一个network_security_config.xml对特定域名放行写法是在network-security-config里配置domain-config cleartextTrafficPermittedtrue。提示如果 baseUrl 改完仍然超时先确认电脑防火墙没有拦截 8080 端口的入站连接Windows 下需要在「高级安全 Windows Defender 防火墙」里放行 Java 进程。3.4 后端跨域与 OkHttp/Retrofit 的联动Android 端用的是 OkHttp 或 Retrofit 时请求层一般不会触发浏览器那套跨域限制。但有些项目后端为了兼容 Web 管理端在 controller 上加了CrossOrigin注解或者用了一个全局 CORS 过滤器。此时要注意如果 Android 端请求的Content-Type是application/json后端 CORS 配置里没有显式允许这个头预检请求会直接失败错误表现为后端收到OPTIONS请求但没有后续POST。排查方式是在后端日志里看到底收到什么方法如果卡在OPTIONS在 CORS 配置里加上allowHeaders(*)即可。4. 核心业务落地家政订单状态机与接口设计4.1 订单表与状态字段的设计家政管理系统的核心数据表是订单表。先看一张毕业设计里常见的订单表结构CREATE TABLE t_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL UNIQUE COMMENT 订单编号, user_id BIGINT NOT NULL COMMENT 下单用户ID, worker_id BIGINT DEFAULT NULL COMMENT 接单服务人员ID, service_type INT NOT NULL COMMENT 服务类型1保洁 2家电清洗 3保姆, service_time DATETIME NOT NULL COMMENT 预约服务时间, address VARCHAR(255) NOT NULL COMMENT 服务地址, amount DECIMAL(10,2) NOT NULL COMMENT 订单金额, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待接单 1已接单 2服务中 3已完成 4已取消, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );这个表的三个设计点order_no用唯一索引而不是直接拿自增 id 对外展示防止用户根据订单号批量试探他人数据worker_id允许为空因为下单时还没有人接单接单操作才给它赋值status用数字表示状态比字符串省空间但需要在代码里建一个常量类约束取值范围。金额用DECIMAL(10,2)而不是FLOAT后者在比较和求和时会有二进制精度误差对账时会出现差几分钱的结果。update_time用ON UPDATE CURRENT_TIMESTAMP是这里容易被忽视的地方。订单状态每变一次这个字段自动刷新之后查「最近服务记录」就能直接按它排序不需要再额外写更新时间戳逻辑。4.2 派单与接单的接口约定用户端和服务人员端通常共用同一个 app进入时选择角色。对应的接口设计一般是三组RestController RequestMapping(/api/order) public class OrderController { PostMapping(/create) public Result create(RequestBody OrderDTO dto) { // 用户提交订单状态置为 0待接单 // 校验 service_time 必须晚于当前时间 } GetMapping(/pending) public Result pendingList(RequestParam Integer workerId) { // 服务人员端拉取待接单列表 // where status 0 order by service_time asc } PostMapping(/accept) public Result accept(RequestParam Long orderId, RequestParam Long workerId) { // 接单update t_order set status 1, worker_id ? // where id ? and status 0返回受影响行数判断并发 } }接单接口是并发问题最典型的地方。两个服务人员同时点接单如果代码先查一遍status 0再更新两个请求都能查到就会把订单重复派给两个人。正确做法是直接在update语句的where条件里带上status 0MySQL 的行锁会让后一个更新受影响行数为 0以此判断已被抢单。毕业设计里写出这条 SQL比用分布式锁更贴合项目体量也更容易在答辩时讲清楚。待接单列表的查询条件只需要status 0但如果表里数据量到了几十万缺少索引会让这个接口越来越慢。应对做法是给status和service_time建联合索引(status, service_time)既过滤状态又按时间排序。数据量小的时候可以不建但对熟悉索引用途是有加分的。注意演示接单流程时最好准备两个模拟器或一台真机加一个模拟器分别登录用户端和服务人员端方便现场演示状态流转。4.3 登录态与角色区分的实现登录接口返回的通常是一串 token 或者直接返回用户 id。毕业设计项目常见做法是登录后把 token 存进 SharedPreferences每次请求在拦截器里塞进Authorization头。后端用一个拦截器检查 token没有或不合法就直接返回 401。这种做法的坑在于token 过期时间设成 0 或没设过期时间的项目比比皆是一旦用户长时间停留再操作后端会忽然开始报未登录。建议初始化时在 token 生成处固定一个过期时间例如 24 小时演示时就不会出现中途掉登录的问题。角色区分可以放在用户表里加role字段数字 1 表示用户、2 表示服务人员。前端根据 role 跳转不同的主页。有个容易忽视的点角色切换后下拉刷新旧页面会拿到别的接口数据这是因为 baseUrl 没变但请求参数里没带上角色。让所有订单相关接口都从登录后的用户信息里取角色而不是让前端每次传能有效避免这类错乱。5. 演示与答辩前必查的 3 个验证点5.1 先用 curl 验证后端再打开 app打开 app 之前先用 curl 确认后端接口真的通这一步能把「代码问题」和「环境问题」分开。后端启动后执行curl -X POST http://localhost:8080/api/user/login \ -H Content-Type: application/json \ -d {username:admin,password:123456}返回 JSON 里包含 token 或用户信息说明后端和数据库都没问题。如果报Connection refused去看后端启动日志里实际监听的端口可能是 8080 被占用改到了其他端口如果返回 404说明接口路径和 controller 里RequestMapping不一致可以用curl http://localhost:8080/api/order/pending逐个探测接口做一个简单的路径对照表。后端通完再开 app手机上报的任何网络错误都集中到 baseUrl 和局域网地址上去排查范围一下就缩小了。5.2 金额与时间字段的类型陷阱答辩验证时最常翻车的两个字段类型问题是金额和时间。金额用FLOAT算累计页面显示88.999999时间用LocalDateTime传给前端出现2025-06-01T10:30:00这种带 T 的格式。前者在表和实体里改用DECIMAL后者在后端用JsonFormat(pattern yyyy-MM-dd HH:mm:ss)统一输出格式。还有时区问题数据库存的是CURRENT_TIMESTAMP如果 JDBC url 里没指定serverTimezone取出来的时间比实际早 8 小时。验证时直接对比订单创建时间与当前时间差 8 小时就去补serverTimezoneAsia/Shanghai。5.3 图片上传后找不到文件的路径错位头像和服务图片上传后页面 404 是本类项目的高频问题。原因几乎都是上传时写了磁盘绝对路径访问时却用相对路径请求。查找方法看后端日志或代码里file.transferTo的落地目录再用完整路径访问一次http://localhost:8080/images/xxx.jpg确认文件真实存在于该目录。解决方式是把上传目录配成一个常量上传和访问都基于同一个基础路径并在 Spring Boot 里加一个映射Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(/uploads/**) .addResourceHandler(file: uploadPath); } }/uploads/**是 URL 前缀file:加物理路径是磁盘位置两者必须指向同一个目录。改完重启后端再用curl -I http://localhost:8080/uploads/a.jpg验证返回 200图片在 app 里自然能显示。本文还有配套的精品资源点击获取