资讯动态

毕业设计实战:基于Spring Boot的家政服务网从零到部署全流程

发布时间:2026/9/9 9:01:25 来源:尧图企业网站定制
毕业设计选了个家政服务网用Spring Boot从头到尾撸了一遍。从选题、建表、写接口到打包部署整个过程踩了不少坑也积累了不少经验。这篇就按我实际做的流程把这个项目从设计思路到上线部署完整拆开讲讲。内容偏实战选了这个题或者准备做类似管理系统的同学可以直接照着思路走。1. 项目整体设计与思路拆解1.1 为什么选家政服务网这个方向当时选题的时候我给自己定了几条标准一是业务不能太复杂但也不能只是个简单的增删改查二是要有明确的用户角色区分三是功能要能讲出东西来答辩时有话可说。家政服务网刚好满足这几点——它有前台展示、用户下单、后台管理还涉及到订单状态流转这类稍带逻辑的业务。从实际价值来看现在家政服务需求确实不小保洁、月嫂、陪护这些服务都在往线上走。一个家政服务网至少需要覆盖几个核心场景用户浏览服务、下单预约、查看订单进度管理员维护服务信息、处理订单、管理用户。这些场景映射到系统里就是一套完整的前后台交互流程工作量适中结构也清晰。1.2 功能模块怎么划分我在设计功能模块时没有一开始就追求大而全而是先梳理出三个主要端用户前台、服务人员端和系统管理后台。用户前台主要负责服务展示和下单包括服务分类浏览、服务详情查看、在线预约下单、个人订单管理等。服务人员端是我后期结合实际需求加上去的因为家政服务这个业务天然有服务人员接单的场景加上这个角色之后整个订单流程就从用户下单 - 管理员指派 - 服务人员完成 - 用户评价完整串起来了。管理后台则负责基础数据维护和订单管理包括服务类别管理、服务项目管理、订单分配与处理、用户管理、评价管理和公告管理。核心业务链路其实就一条用户在小程序/网页端浏览服务选中后提交预约订单管理员在后台看到订单后分配给对应的服务人员服务人员完成后更新状态用户收到提醒并可进行评价。这条链路跑通项目的主体功能就完成了百分之八十。1.3 技术栈选型与为什么不选更复杂的东西技术栈我最终定为Spring Boot 2.x MyBatis Plus MySQL 8.0 Thymeleaf Bootstrap Layui。这套组合可能有人觉得不够新但很适合毕业设计这个场景原因很简单——它稳定、资料多、出问题容易排查。Spring Boot简化了Spring应用的搭建和配置不需要再写一堆XML配置文件这对开发效率的提升非常明显。MyBatis Plus则是在MyBatis基础上做了增强单表CRUD可以直接用内置方法不需要手写SQL省下不少时间。选Thymeleaf而不是前后端分离是因为毕业设计项目如果既做前端又做后端再加上Vue和接口联调工作量会翻倍而服务端渲染模式一套搞定逻辑也清晰。数据库用MySQL 8.0除了性能好navicat等工具支持也更完善。这里顺便说一下如果你用的是更高版本的Spring Boot比如3.x注意JDK要用17以上MyBatis Plus也需要换适配版本。我自己就在版本兼容上卡过后面会详细讲。2. 数据库设计与核心业务表2.1 建表思路先梳理业务流程再动手数据库设计这一步我是先画业务流程图把每个角色和动作的关系整理清楚然后才开始建表。这样做的好处是避免边写代码边改表结构到后期维护成本会非常高。家政服务网的数据库我最终建了10张左右的表核心表包括用户表、管理员表、服务分类表、服务项目表、预约订单表、服务人员表、评价表、公告表。这几张表几乎覆盖了系统所有功能点表结构也简单清晰理解起来不费劲。2.2 核心表结构与关键字段说明拿预约订单表举例这是整个系统的核心表字段设计直接影响业务逻辑的实现。我当时设计了这些字段每个字段都有各自的用途订单编号用户下单后生成唯一订单号Java后端用UUID或时间戳加随机数生成比如用yyyyMMddHHmmss加三位随机数。用户ID关联用户表表示这个订单属于哪个用户。服务项目ID关联服务项目表记录用户预约的是哪项服务。服务人员ID管理员分配服务人员后写入初始为空。预约时间用户希望上门服务的时间注意这里要处理日期格式前端传过来的是字符串后端需要转换。订单状态我用的是tinyint类型0待接单、1已分配服务人员、2服务中、3已完成、4已取消。这个状态是关键前后端都要保持一致。下单时间记录创建时间用LocalDateTime类型。备注用户填写的上门地址补充说明。用户表的核心字段就是用户名、密码、手机号、姓名、地址。密码我当时用了MD5加盐加密虽然现在看不算最安全但作为毕业设计够用。这里建议密码字段长度设置合理一点加密后是32位字符串varchar(64)就足够。服务项目表需要重点设计的是分类关联和价格信息。我用了parentId或typeId去关联服务分类表价格用decimal类型比如decimal(10,2)注意不要用float涉及到金额的计算浮点数会有精度问题。2.3 表之间的关系怎么理表之间的关系其实就是业务关系的映射。用户与订单是一对多关系一个用户可以有多个订单服务分类与服务项目是一对多关系一个分类下可以有多项服务订单与服务人员是多对一关系多个订单可以由同一个服务人员处理。实际写代码时MyBatis Plus提供了分页插件和条件构造器联表查询直接写SQL就好不需要在实体类上配置太多关联映射。这是我踩过的一个坑——一开始想用Plus的TableField(exist false)去搞复杂关联结果发现越搞越乱后来干脆在Mapper里手写SQL反而简单直接。3. 核心功能实现与实操要点3.1 项目初始化和全局配置用Spring Initializr创建项目选择Spring Web、Thymeleaf、MySQL Driver、MyBatis Plus这几个依赖生成项目后第一件事就是改配置文件。我当时用的是application.yml配置了数据源、MyBatis Plus的日志输出和驼峰映射。MyBatis Plus有一个比较关键的配置是map-underscore-to-camel-case: true它能把数据库的user_name自动映射到Java的userName省掉大量属性映射的麻烦。另一个是日志配置开发环境把SQL日志打出来排查问题方便很多。再说一个容易忽略的地方MySQL 8.0的驱动配置driver-class-name要写com.mysql.cj.jdbc.Driver不是老版本的com.mysql.jdbc.DriverURL里需要加上serverTimezoneAsia/Shanghai和useSSLfalse否则连接数据库时会报时区错误。3.2 登录鉴权拦截器实现就够了用户和管理员登录我用的是传统的Session方式加一个拦截器。没有引入Spring Security或者JWT因为对于这种单体项目Security配置反而增加学习成本Session方式已经完全够用。实现思路是定义一个LoginInterceptor里面重写preHandle方法检查Session中是否存在用户或管理员信息如果不存在就重定向到登录页。另外要注意放行登录请求、注册请求、首页展示相关的请求这个用addPathPatterns和excludePathPatterns配合搞定。这里有一个小细节问题出现的场景是页面请求和异步请求混在一起时拦截器重定向到登录页会导致Ajax请求拿到登录页的HTML而不是JSON前端解析就会报错。我在实际项目中是把请求头里的X-Requested-With判断出来如果是Ajax请求就返回JSON提示否则才重定向。3.3 用户下单预约的完整流程下单流程是核心中的核心。用户在前台选好服务后跳转到预约页面填写联系人和地址以及预约时间提交后后端做了什么我这里的处理逻辑是接收参数后先校验服务是否存在、是否在可预约状态然后生成订单编号设置订单状态为0待接单写入数据库。整个操作放在一个事务里确保数据不会出现半写入状态。这里特别注意一点预约时间从前端传到后端是字符串格式一定要统一日期格式我用的是DateTimeFormat(pattern yyyy-MM-dd HH:mm)来接收。因为这个问题我最初测试时发现数据库里存的时间少了一个8小时——原因是时区没配好后来把serverTimezone设置成Asia/Shanghai就正常了。管理员端接单流程也比较关键。首页展示待接单订单列表管理员点击分配服务人员时弹窗选择服务人员提交后更新订单的服务人员ID和状态为1。服务人员登录后看到自己名下的订单列表点击开始服务状态变为2点击完成服务状态变为3。用户端此时看到的状态就是已完成可以评价了。3.4 后台管理的实现代码生成器提速后台管理模块其实就是标准的CRUD但如果一个个手写还是有点浪费时间。MyBatis Plus官方提供了代码生成器可以根据数据库表自动生成Entity、Mapper、Service、ServiceImpl和Controller。我用了它一次性生成所有基础代码再针对业务需求修改关键部分比如订单的联表查询、状态修改方法、统计报表接口等。这个方法效率确实高但也提醒一点生成器生成的代码只是骨架业务逻辑还得自己写不要幻想全部自动化。比如订单管理列表我需要显示用户名、服务项目名、服务人员名这些字段分散在不同表里生成器生成的单表查询接口满足不了最终还是要手写联表SQL配合Page分页返回。4. 开发环境搭建与调试部署全程记录4.1 开发环境准备工具版本一定要提前统一我当时的开发环境配置如下JDK 1.8、IntelliJ IDEA 2022版、Maven 3.8、MySQL 8.0、Navicat。这里有一个非常关键的提醒多台开发机器比如宿舍电脑、实验室电脑的环境版本要保持一致尤其是JDK和MySQL的大版本。我就遇到过在本机跑得好好的换台电脑部署MySQL版本低导致SQL语法报错的情况。如果你准备在Windows上做开发环境变量一定要配置正确否则Maven和Java命令识别不了。JAVA_HOME、MAVEN_HOME、PATH这三个是绕不开的。配置完在命令行执行java -version和mvn -v验证一下通畅了再继续。4.2 从零到本地跑通的完整步骤整个流程其实不复杂但顺序错了容易浪费时间。我实际操作的顺序是先导入SQL文件建库建表然后修改配置文件里的数据库连接信息启动项目地址栏访问首页。第一步导入SQL文件时注意先创建一个空的数据库设置字符集为utf8mb4然后导入。很多同学会忘记设置字符集结果中文乱码排查起来很费劲。utf8mb4比utf8多了对emoji的支持现代项目基本都用它。第二步修改application.yml里的数据源信息重点检查用户名和密码是否与本地MySQL一致。我开发时用的是root账号密码就是安装MySQL时设置的密码——注意不是登录Navicat的密码MySQL本身连接密码不支持空密码。第三步启动项目IDEA里直接运行主类。启动成功后控制台会显示Tomcat started on port(s): 8080。看到这句话基本就成功了一大半剩下的就是浏览器访问测试各个页面功能。4.3 打包部署jar包方式更适合新手项目完成后要部署到服务器我采用的是Spring Boot最标准的可执行jar包方式。IDEA右侧Maven面板执行package命令成功后在target目录下会生成一个jar文件。部署到Linux服务器时我用的是宝塔面板作为服务器运维工具可以直接上传jar包创建站点时选择Java项目类型设置JDK版本、运行端口和项目路径一键启动即可。对于没有Linux基础的同学来说宝塔能节省大量时间成本。进程管理方面宝塔会用supervisor或systemd管理Java进程崩溃后自动拉起省去手动重启的麻烦。生产环境不建议直接java -jar启动因为关掉SSH终端进程就没了宝塔的守护机制能解决这个问题。4.4 部署高频问题端口、内存、数据库连接部署时我遇到过三个高频问题这里提前说一下省得到时候抓瞎。第一个是端口被占用。项目默认端口是8080但服务器上可能已经跑了其他Java项目。解决办法是在配置文件里指定server.port: 8081或者启动命令里加--server.port8081。第二个是内存不够新买的服务器如果只配了1G内存启动Spring Boot加上MySQL很容易内存告急。解决办法是给JVM设置合理的内存参数java -jar -Xms128m -Xmx256m xxx.jar把堆内存限制住系统才有内存给MySQL和其他服务用。第三个是数据库连不上一般就是URL里的IP不对。本地开发是localhost或127.0.0.1服务器部署要改成服务器的内网IP。云服务器的话还需要在安全组规则里开放MySQL的3306端口否则外部IP连不进去这个坑我踩过一次才反应过来。5. 常见问题与排查技巧实录5.1 问题速查表实际开发过程中我记录了不少问题这里整理成一张速查表方便遇到同类问题时快速定位。问题现象可能原因解决方案项目启动报错Access denied for user数据库用户名或密码错误检查yml配置确认本地MySQL账号密码页面中文乱码数据库字符集不是utf8mb4建库时指定utf8mb4配置文件加characterEncodingutf8时间比正常晚8小时MySQL连接未指定时区URL加serverTimezoneAsia/Shanghai页面样式丢失静态资源路径没有适配项目路径检查Thymeleaf模板中资源引用使用th:href{/css/style.css}登录后跳到首页仍能访问后台拦截器配置放行路径有误检查拦截器配置后台链接要添加拦截校验上传文件后找不到文件上传路径配置不对配置虚拟路径映射或存储在项目运行目录的upload文件夹前端提交JSON后端接收不到缺少RequestBody注解在Controller方法参数前加上RequestBody点击保存没有反应表单提交方式不对或参数名不一致检查前端input的name与后端实体类字段是否一致代码改动后浏览器还是旧页面浏览器缓存了静态资源强刷一次CtrlF5或给静态资源链接加版本号页面报500错误控制台SQL执行失败表名或字段名是MySQL保留字修改字段名或者SQL中加反引号包裹5.2 避坑经验三个让我印象最深的踩坑现场第一个坑是MyBatis Plus的版本兼容问题。我一开始用了MyBatis Plus 3.4的旧版本框架版本和Spring Boot 2.6搭配时没问题但换了Spring Boot 2.7之后启动就报Invalid value type for attribute factoryBeanObjectType查了半天才知道是Plus版本太老导致兼容性出了问题。最后把Plus版本升级到3.5.2才解决。这里提醒一下Spring Boot版本不要随便升升了之后相关的依赖版本都得跟着调整。第二个坑是Thymeleaf模板的页面报错信息不够直观。Thymeleaf的报错一般只给出模板路径和行号但具体是哪个表达式出错有时候看不出。排查思路是把模板里的动态标签一段段注掉缩小范围。后来我习惯在本地先用纯HTML页面把业务跑通再套模板效率反而高一些。第三个坑是首页图片加载慢实际上是因为我用了外部图片链接服务器在访问外网时速度不稳定。后来把所有图片统一传到项目本地upload目录访问速度快了很多还顺便解决了一个安全问题——外部链接有时候会失效导致页面图片变成裂图答辩演示时非常尴尬。5.3 从排查到预防几件值得提前做的事踩过这些坑之后我开始养成一些好习惯日志一定要打全Controller入口、Service关键方法调用、数据库操作结果这三个位置至少要有日志输出接口返回值要统一结构输出格式有问题时能马上定位配置文件里环境相关的信息准备两套开发环境和部署环境分开放打包前只需改一处开关即可切换。还有一点很重要数据库表结构设计时尽量给每张表加上create_time和update_time字段。这个习惯看似不起眼但在排查数据问题和做统计报表的时候能省很多事。MyBatis Plus有自动填充功能配置一下插入和更新时的自动填充策略代码量也不大。结语如果你也选了类似的家政服务网、校园服务、二手交易平台这种题目有一个建议可以分享给你不要急着写代码先花两三天时间把用户角色理清楚、把每个角色要完成的核心操作流程走一遍再开始建表和写代码。我最初以为数据表建好了就万事大吉结果真正写业务逻辑时才发现缺一个服务人员角色导致整个流程都不完整后面返工改表改代码浪费了不少时间。顺序对了这个项目做下来就没有想象中那么痛苦。我自己做完这个家政服务网之后最大的体会是这类系统级项目真正考验的不是你用了多牛的技术框架而是你对业务逻辑的理解和把复杂流程拆解成可执行模块的能力。把这些练好了换任何题目都难不倒你。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价