SSM+MySQL家政小程序源码解析:从环境搭建到订单实战

发布时间:2026/9/28 18:12:00
SSM+MySQL家政小程序源码解析:从环境搭建到订单实战 简介基于JavaSSMMySQL微信小程序的家政服务管理项目是一套高分毕业设计完整资源包面向计算机相关专业毕业生、课程设计及期末大作业需求者。资源内含项目源码、数据库脚本、配套毕业论文部署说明齐全经严格调试后确保稳定运行。压缩包合计1213个文件大小约16.41MB主要文件类型包括Java后端源码、Vue管理端页面、微信小程序wxml/wxss/js逻辑、MySQL建表与数据脚本、项目配置文件及论文docx文档结构清晰便于按功能模块阅读和二次开发。系统覆盖用户管理、家政服务展示、订单管理等核心业务界面美观、交互流畅。技术栈涉及Spring、SpringMVC、MyBatis等常用框架可与微信开发者工具、Navicat等工具链顺畅衔接。目前已有85人学习下载既适合快速搭建家政平台原型也可作为毕设论文撰写参考具备很高的实践价值。1. 家政服务小程序源码包先搞清这套 javassmmysql 资源能干什么一套基于 javassmmysql微信小程序 的家政项目小程序源码包拿到手我先翻目录源码、数据库脚本、论文三件套都在前端小程序和管理端代码也没缺不是那种只能看不能跑的演示工程。这套资源解决的是家政服务场景里三个最实际的问题用户怎么下单、服务人员怎么接单、管理员怎么管单。对正在准备毕业设计的学生来说它是导师指导过、能直接运行的整套项目对需要 java 课程设计案例源码或期末大作业的人来说能省掉从零设计表结构和写接口的成本。下面我从技术栈选型开始拆再说环境搭建和核心链路把跑通这套代码时踩过的坑逐个讲清楚最后给一个可以动手试的二开方向。2. 技术栈拆解SSM 组合为什么能撑起一个家政小程序2.1 Spring、SpringMVC、MyBatis 在这个项目里各管哪一层家政小程序这类业务特点是实体多用户、服务、订单、状态流转频繁待支付、已支付、进行中、已完成后端如果不用分层框架代码很快就会乱成一锅粥。SSM 在这里选的不是最炫的架构而是刚好把职责切干净。Spring 管的是对象生命周期Controller、Service、Mapper 都由 Spring 容器创建和注入业务模块之间不直接 new这样后面加一个「优惠券」模块不会动到订单模块的代码。SpringMVC 管的是请求入口小程序端 POST 过来的 JSON、管理员端 GET 的列表参数都由 DispatcherServlet 分发到对应 Controller。MyBatis 管的是 SQL 层把数据库表字段映射成 Java 对象让订单表的 status 字段和 Order 实体里的 orderStatus 对应上。在这套资源里Spring 的职责边界非常典型service 层放业务判断比如下单前检查服务状态是否可购买controller 层只做参数接收和返回mapper 层只写 SQL。拿到这种结构我第一件事就是看 mapper 目录下有几个 XML因为一个家政系统最复杂的部分往往都在订单和统计查询的 SQL 里。另外压缩包里能看到不少 .bak 结尾的备份文件比如 update-password.vue.bak、IndexAsideStatic.vue.bak这说明原开发者在迭代过程中保留了改版记录也印证了这套源码是实际改过的项目不是网上批量生成的空壳。一个典型的配置写法是这样的!-- applicationContext.xml 中核心的组件扫描与数据源配置 -- context:component-scan base-packagecom.home.service / bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName valuecom.mysql.jdbc.Driver/ property nameurl valuejdbc:mysql://localhost:3306/home_service?useUnicodetruecharacterEncodingutf8/ property nameusername valueroot/ property namepassword valueroot/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property namemapperLocations valueclasspath:mapper/*.xml/ /bean注意这里的 mapperLocations 指向 classpath:mapper 目录也就是说所有 MyBatis 的 SQL 语句都是外部 XML 文件不写在 Java 代码里。好处是改 SQL 不用重新编译坏处是如果你只搜 .java 文件永远找不到查询语句第一次翻这套源码的人容易懵。数据源用了 druid 连接池URL 里带上了 useUnicodetruecharacterEncodingutf8这个是中文数据不出乱码的前提。很多同学拿到源码先把密码改成自己的却漏了检查 URL 编码参数结果小程序端下单成功、中文用户名存进去变成问号这类问题后面避坑章节会单独说。2.2 核心表设计用户表、服务表、订单表怎么建模家政项目的数据库设计比想象中简单核心就三张表加若干辅助表。用户表、家政服务表、订单表这三张表把主业务链路串起来了下面是简化后的建表脚本-- 用户表 CREATE TABLE t_user ( id int(11) NOT NULL AUTO_INCREMENT, openid varchar(64) NOT NULL COMMENT 微信openid, nickname varchar(50) DEFAULT COMMENT 昵称, phone varchar(20) DEFAULT COMMENT 手机号, avatar varchar(255) DEFAULT COMMENT 头像地址, create_time datetime DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY uk_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 家政服务表 CREATE TABLE t_service ( id int(11) NOT NULL AUTO_INCREMENT, service_name varchar(100) NOT NULL COMMENT 服务名称, category varchar(50) DEFAULT COMMENT 服务分类, price decimal(10,2) NOT NULL COMMENT 价格, unit varchar(20) DEFAULT 次 COMMENT 计费单位, image varchar(255) DEFAULT COMMENT 服务图片, status tinyint(4) DEFAULT 1 COMMENT 1上架 0下架, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 订单表 CREATE TABLE t_order ( id int(11) NOT NULL AUTO_INCREMENT, order_no varchar(32) NOT NULL COMMENT 订单号, user_id int(11) NOT NULL COMMENT 下单用户, service_id int(11) NOT NULL COMMENT 服务id, service_name varchar(100) DEFAULT COMMENT 冗余服务名, amount decimal(10,2) NOT NULL COMMENT 订单金额, status tinyint(4) DEFAULT 0 COMMENT 0待支付 1已支付 2进行中 3已完成 4已取消, appoint_time datetime DEFAULT NULL COMMENT 预约时间, create_time datetime DEFAULT NULL, PRIMARY KEY (id), KEY idx_user_id (user_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;表结构里有几个值得注意的设计细节。用户表用 openid 做唯一键这是微信小程序的惯例普通用户不会主动注册账号首次进入小程序时后端拿 openid 判断是新用户还是老用户。服务表里 category 字段预留了分类能力后期加「保洁」「保姆」「维修」筛选就靠它。订单表里 service_name 是冗余字段下单时把服务名称直接存进订单表这样即使服务表把这条服务删了订单历史记录还能正常展示这种「冗余换查询稳定」的做法在毕设级别的系统里很实用。订单状态用 tinyint 而不是 varchar 存中文0 到 4 五个数字分别对应五个状态。好处是数据库体积小、判断快坏处是不看注释根本不知道 2 代表什么业务含义所以代码里一定要把状态定义集中在常量类或枚举类里后续维护才不会猜。2.3 MySQL 5.7 的选型理由与数据库脚本导入这套源码指定 MySql5.7以上我一般建议直接用 5.7 而不是 8.0原因有两个。第一是驱动兼容性源码里若用的是 com.mysql.jdbc.Driver这个驱动在 MySQL 8.0 下虽然也能连但 8.0 默认认证插件会导致连接报错需要改驱动为 com.mysql.cj.jdbc.Driver 并加 serverTimezone 参数第二是字符集行为5.7 默认 utf8 就是 utf8mb3而 8.0 默认已经是 utf8mb4表结构和索引长度行为有差异。对毕业设计来说直接用 5.7 能少踩一半坑。导入数据库用 Navicat 是最省事的新建连接填写主机 localhost、端口 3306、用户名 root、密码你自己设置的 MySQL 密码然后新建数据库库名建议与源码里的 JDBC URL 保持一致常见命名是 home_service 或 housekeeping最后右键数据库选择「运行 SQL 文件」选中压缩包里附带的 .sql 脚本执行执行完成后刷新就能看到表和初始数据。脚本执行时报错最常见的是「Query was interrupted」或者某个表已存在。前者通常是 SQL 文件太大或者有锁定等待关掉其他连接、重新执行即可后者说明同一套脚本跑了两遍建议先删掉已建的库再重新导入。管理员初始账号密码一般写在 SQL 脚本开头的 insert 语句里导入完成后用 Navicat 打开管理员表就能看到省得自己注册管理员。3. 环境搭建与启动从 JDK 到微信开发者工具的完整运行步骤3.1 环境清单与版本核对在动手之前先把环境版本定好版本不一致是这套系统跑不起来的第一大原因。下面是我实际跑通过的环境清单组件版本备注JDK1.8不要用 JDK 11部分老依赖有兼容问题Maven3.6.33.8 对仓库配置更严格建议 3.6.xMySQL5.75.7.20 以上均可IDEA2020.3社区版也可但配置 Tomcat 稍麻烦Tomcat8.5源码若带 web.xml 头版本匹配即可微信开发者工具稳定版最新需要开启「不校验合法域名」Navicat11 或新版本只用来导库和查数据JDK 环境变量方面检查 JAVA_HOME 和 PATH 是否正确指向 JDK 1.8。在命令行执行java -version确认后再执行mvn -v确认 Maven 能读到 JDK。这一步前后顺序很重要很多人 Maven 命令报错不是 Maven 的问题而是系统里装了多个 JDK 版本导致 PATH 指错了。3.2 修改数据库连接配置与 Navicat 验证后端连接数据库的配置通常在 src/main/resources 下的 jdbc.properties 或 db.properties 里。你要改的就三样URL 里的库名、用户名、密码改完后先别急着启动后端用 Navicat 验证一遍再继续。# jdbc.properties 数据库连接配置 jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/home_service?useUnicodetruecharacterEncodingutf8useSSLfalse jdbc.usernameroot jdbc.passwordroot注意密码在 properties 文件里是明文这套源码是毕设项目没有做加密也正常。如果你用的是 MySQL 8.0则 driver 要改成 com.mysql.cj.jdbc.Driver并且 URL 末尾加 serverTimezoneAsia/Shanghai否则会报时区错误。如果 MySQL 的 root 密码里有特殊字符比如 或 #properties 文件里不建议直接写最好改一个简单点的密码不然解析 URL 时很容易出玄学问题。改完配置后先在 Navicat 里用同一套账号密码测试连接确认能连上再启动后端。这一步能过滤掉 80% 的「后端起不来」问题因为它把数据库本身的故障从后端启动流程里隔离出去了。3.3 Maven 工程导入 IDEA 与 Tomcat 部署解压源码包后用 IDEA 的 File - Open 选择项目根目录IDEA 检测到 pom.xml 后会自动以 Maven 项目加载。首次加载会下载依赖国内网络环境下这一步最容易卡住建议先在 Maven 的 settings.xml 里配好阿里云镜像!-- settings.xml 中的 mirrors 配置放在 mirrors 标签内 -- mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirrormirrorOf写 central 表示只镜像中央仓库不会影响你项目里配置的其他私有仓库。配好之后回到 IDEA点击 Maven 面板的刷新按钮让依赖重新解析正常情况下几分钟内就能把 SSM 相关的 jar 全部拉下来。后端项目的部署方式常见做法是 IDEA 里配置一个本地 TomcatRun/Debug Configurations - 加号 - Tomcat Server - Local在 Deployment 页把项目的 war exploded 加进去Application context 填/或者源码里统一的前缀。启动 Tomcat 后控制台出现「Connected to server」和 Spring 容器刷新日志说明后端已经起来了。建议启动后先用浏览器访问http://localhost:8080/确认能看到服务端返回再切到小程序端调试。3.4 微信开发者工具导入小程序端与接口地址配置源码里的小程序目录通常是 housekeeping_app、miniprogram 或类似目录导入方式一样微信开发者工具选择「导入项目」目录选小程序根目录AppID 可以先用测试号。关键的一步在详情面板里勾选「不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书」不勾的话小程序请求本机后端会被直接拦截。小程序端的接口地址配置一般集中在 app.js 的 globalData 里// app.js 小程序端全局配置 App({ globalData: { // 后端服务地址用 localhost 只能跑开发者工具 // 真机预览时要改成电脑的局域网 IP baseUrl: http://localhost:8080, userInfo: null, token: } })开发者工具模拟器里用 localhost 没问题但如果你用手机扫码真机预览手机访问不到电脑的 localhost必须把 baseUrl 改成电脑的局域网 IP例如http://192.168.1.100:8080。两个地址对应的场景不一样这是小程序本地联调最容易忽略的一步。改成局域网 IP 后还需要确认 IDEA 里 Tomcat 的端口是 8080 且没有被占用同时电脑防火墙放行 8080 端口否则真机请求会超时。先用电脑浏览器打开http://localhost:8080验证后端存活再用手机浏览器访问http://192.168.x.x:8080验证网络链路两边都通小程序端才可能通。4. 核心业务链路登录、下单、接单与订单状态流转4.1 微信登录与用户身份识别小程序端不需要传统的用户名密码登录而是走微信的 wx.login 拿到 code再把 code 传给后端后端通过 code 换 openid。源码的登录 Controller 一般长这样RestController RequestMapping(/api/user) public class UserController { Autowired private UserService userService; PostMapping(/login) public Result login(RequestBody MapString, String params) { String code params.get(code); String nickname params.get(nickname); // 用 code 换 openid正常这里会调用微信接口 String openid wxService.codeToOpenId(code); User user userService.findByOpenid(openid); if (user null) { // 新用户先注册再登录 user new User(); user.setOpenid(openid); user.setNickname(nickname); userService.register(user); } // 生成 token 返回给小程序端 String token JwtUtil.createToken(user.getId()); return Result.ok().put(token, token).put(userInfo, user); } }这里的核心点在于后端永远以 openid 作为用户唯一标识。第一次进入是新用户系统自动注册并返回 token第二次进入直接查表返回老用户信息。token 的过期时间和签名密钥通常写在 JWT 工具类里毕设级别一般不会真去调微信授权的 code2Session 接口源码里大概率是模拟返回 openid 的处理你替换成自己的 AppID 和 Secret 后就能调通真实微信登录。改造真实微信登录时需要在后端把 code 换成 openid 的逻辑补全。对功能演示来说影响不大但答辩时如果被问到真实登录流程你得能说清楚 openid 从哪里来、token 怎么签发的。4.2 家政服务下单从提交参数到写库下单接口是整套系统最核心的接口。前端把选中的服务 id、预约时间、备注等参数 POST 到后端后端做状态校验后生成订单。简化后的下单逻辑是PostMapping(/create) public Result createOrder(RequestBody OrderCreateParam param) { // 校验服务是否存在且是上架状态 ServiceInfo service serviceService.getById(param.getServiceId()); if (service null || service.getStatus() ! 1) { return Result.error(服务不存在或已下架); } // 生成订单号时间戳 随机数 String orderNo H System.currentTimeMillis() RandomUtil.randomNumbers(4); Order order new Order(); order.setOrderNo(orderNo); order.setUserId(param.getUserId()); order.setServiceId(service.getId()); order.setServiceName(service.getServiceName()); order.setAmount(service.getPrice()); order.setStatus(0); // 0 待支付 order.setAppointTime(param.getAppointTime()); order.setCreateTime(new Date()); orderService.save(order); return Result.ok().put(orderNo, orderNo).put(amount, service.getPrice()); }下单逻辑里有几个细节值得留意。第一订单号生成用时间戳加随机数保证并发下不撞号这在毕设项目里够用生产环境一般会用更复杂的分布式 ID第二amount 不是前端传的而是后端从服务表里重新取价格这是防止前端篡改价格的关键第三先查服务状态再插入订单两步操作如果没有事务包裹并发高时会有超卖风险毕设答辩时把这两点讲清楚老师基本不会再追问。OrderCreateParam是一个接收前端参数的 POJO里面至少包含 serviceId、userId、appointTime 三个字段。这里传入的 userId 应该从 token 解析出来而不是直接信前端传参否则用户 A 可以给用户 B 下单。源码里如果没做这一步校验二开时建议补上。对应的 Mapper XML 里插入语句是这样insert idinsert parameterTypecom.home.entity.Order useGeneratedKeystrue keyPropertyid INSERT INTO t_order(order_no, user_id, service_id, service_name, amount, status, appoint_time, create_time) VALUES(#{orderNo}, #{userId}, #{serviceId}, #{serviceName}, #{amount}, #{status}, #{appointTime}, #{createTime}) /insertuseGeneratedKeystrue 会把自增主键回填到 Java 对象的 id 字段。注意字段名和 Java 属性名之间的映射如果实体里叫 appointTime表里叫 appoint_time在未开启驼峰映射时需要显式配置才能对应否则插入的数据能进去但查询出来时间字段是空的。4.3 管理端接单与派单流程管理端有两种常见设计一种是直接管理所有订单并手动指派给服务人员另一种是「派单」和「服务人员接单」都放在后台。这套源码里订单列表页一般会提供按状态筛选和按时间排序核心查询 SQL 类似SELECT id, order_no, user_id, service_name, amount, status, appoint_time, create_time FROM t_order WHERE status #{status} ORDER BY create_time DESC LIMIT #{offset}, #{pageSize}分页用 LIMIT 加 offset 实现pageNum 和 pageSize 两个参数由前端传过来后端把页码换算成 offset。管理端分页一般需要同时返回总数 total所以代码里通常有两个方法一个查列表、一个查总数再把两者组装成前端能识别的 JSON 格式。管理完成派单操作后订单状态从 1已支付变为 2进行中同时后台把服务人员信息写入订单关联字段。这里有个容易遗漏的点状态变更需要更新操作时间字段如果表里没有 follow_time 之类的字段前端就看不到「什么时候被接单」只能看到创建时间。展示层最好把下单时间、支付时间、接单时间、完成时间四类时间都记录清楚答辩演示时会好看很多。4.4 订单状态流转与对应的权限校验家政订单从创建到结束一共走五个状态状态值状态名触发动作操作方0待支付用户提交订单用户1已支付用户支付/模拟支付用户2进行中管理员派单或服务人员接单管理员/服务人员3已完成服务完成确认管理员/用户4已取消用户取消或超时取消用户/系统状态流转的逻辑一般在 Service 层的 confirmService 或 cancelOrder 方法里。做这块时最需要留意两个校验一是状态机校验比如已完成的订单不允许再取消代码里要 if 判断当前状态是否允许目标状态二是操作者校验比如只有该订单关联的用户才能取消自己的订单管理员才能派单。我见过不少同学在这块只做了前端按钮隐藏、后端不做状态判断结果用 Postman 直接调接口把状态 3已完成改成 0待支付搞得数据全乱。后端的校验一定要做前端只是体验层的限制后端才是数据正确性的最后一道闸。5. 避坑与常见问题数据库连接失败等五条踩坑记录5.1 数据库连接被拒绝3306 端口、驱动版本和账号权限一起查现象后端启动时控制台抛出Cannot create PoolableConnectionFactory或者Communications link failure程序卡在数据源初始化这一步出不来。原因80% 的情况是配置里的密码和 MySQL 实际密码不一致或者 MySQL 服务没有启动剩下 20% 是驱动版本不匹配。我在复现这套源码时曾犯过一个低级错误本机装的是 MySQL 8.0但配置文件还是 com.mysql.jdbc.Driver启动直接报认证插件错误。解决先打开 Windows 服务确认 MySQL 服务在运行命令行执行mysql -uroot -p你的密码验证账号密码接着在 Navicat 里用同一份配置连接测试最后再对应版本修正驱动MySQL 5.7 用 com.mysql.jdbc.DriverMySQL 8.0 用 com.mysql.cj.jdbc.Driver 并加 serverTimezone。把这三步走完连接被拒绝的问题基本能定位。5.2 小程序请求后端连不上域名校验和 HTTP 明文限制同时存在现象微信开发者工具里点登录或下单request 直接 fail控制台提示url not in domain list或者网络错误。原因微信小程序默认要求请求地址必须是备案过的 HTTPS 域名而本地开发是 http://localhost两端冲突。如果只勾选了「不校验合法域名」却还报错多半是工具版本把「不校验合法域名」和「启用 HTTP 明文」两个开关拆开了缺一不可。解决微信开发者工具的详情 - 本地设置里同时勾选「不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书」和「启用 HTTP 明文请求」。工具版本不同这两个开关名字略有差异多找一下。真机调试时还要额外把 baseUrl 改成电脑局域网 IP并放行电脑防火墙的 8080 端口之前章节已经提过。5.3 Maven 依赖下载卡死先配阿里云镜像再重新导入现象IDEA 导入 Maven 项目后一直转圈或者首次 build 报Could not transfer artifact超时错误pom.xml 文件里能看到红色波浪线。原因中央仓库在国外国内网络环境下下载速度不稳定某些 jar 一直拉不下来。这套源码依赖的 SSM 相关包文件比较多若下载中途断掉本地仓库会残留半成品文件之后每次构建都卡在同一个包上。解决按 3.3 节的方式在 settings.xml 配好阿里云镜像然后删除本地仓库 ~/.m2/repository 中对应报错目录里残留的 .lastUpdated 文件再回 IDEA 点 Maven 刷新。不要手动去 jar 包市场下载替换镜像生效后让它自己拉才是正路。5.4 MyBatis 查询返回空对象字段映射和驼峰命名是重灾区现象数据库里有数据接口也返回了 JSON但对象的某些字段是 null。比如 appoint_time 能查到createTime 却是 null其他字段都正常。原因MyBatis 的默认映射规则要求 Java 属性名和数据库列名完全一致。表里是 create_time下划线风格Java 属性是 createTime驼峰风格在没有开启 mapUnderscoreToCamelCase 时两者对不上MyBatis 就返回 null。解决在 mybatis-config.xml 中开启驼峰映射configuration settings setting namemapUnderscoreToCamelCase valuetrue/ /settings /configuration开启了 camelCase 映射后create_time 会自动映射到 createTime。这个开关对新增字段和联表子查询同样生效开启后不需要在每一条 SQL 里写 alias。如果开启后还有个别字段为 null那就去对应的 Mapper XML 里检查 resultMap手动指定 column 和 property这类问题一般集中在多表联查场景。5.5 后台管理系统登录跳转 404部署路径和过滤器规则要一致现象管理端输入账号密码点击登录接口返回成功但页面跳转到 /admin/index 时变成 404或者跳转后刷新又退回登录页。原因常见两种。一是 IDEA 给 Tomcat 配的 Application context 不是根路径/导致页面跳转的 URL 前缀跟实际部署路径对不上二是后端登录拦截器放行的路径配置有问题比如拦截了 /admin/** 但没放行 /admin/login刷新时被当成未登录踢回登录页。解决先确认 Tomcat Deployment 里 Application context 是/同时把项目里所有配置的前缀统一。再看拦截器或过滤器类里排除路径是否齐全登录接口、静态资源、验证码接口都要放行。最后用浏览器开发者工具看跳转请求的 Network 面板404 是路径问题302 循环是拦截器问题两个现象对应两个排查方向。6. 验证方法与二开方向先跑通接口自测再加一个服务分类6.1 三步接口自测浏览器看 JSON、开发者工具看请求、Navicat 看数据拿到这套源码后不要急着改业务先把接口自测流程走一遍确认系统真实可用。第一步浏览器直接访问后端接口比如http://localhost:8080/api/service/list能看到 JSON 数组返回说明后端服务和数据库连通。第二步在微信开发者工具里打开 Network 面板发起一次登录和一次下单请求重点看请求 URL、请求体参数、响应状态码。第三步下单完成后去 Navicat 刷新订单表看到新记录且 status 为 0同时金额与下单页面一致全链路才算真正走通。这套流程走完你基本就掌握了这个项目的运行时行为后面改任何代码都有了一个可对比的基线。遇到改完代码功能变怪的情况优先用这三步定位是前端、后端还是数据库层面的问题。6.2 二开实例给服务表加分类筛选一个值得动手试的改动是给服务表加「区域」字段。先执行 SQLALTER TABLE t_service ADD COLUMN region varchar(50) DEFAULT COMMENT 服务区域;然后在 Service 实体里加 region 属性在 Mapper XML 的查询 SQL 中加WHERE region #{region}最后在小程序服务列表页新增一个区域筛选的下拉框重新编译后你会发现整套链路已经跑通。这个例子的价值在于它覆盖了数据库表结构、实体类、Mapper XML、前端页面四个层面的改动是理解这套 SSM小程序项目改代码全流程的最小路径。改完后记得回到 6.1 的三步自测重新跑一遍确认新增的 region 条件真正传到了后端并生效。6.3 我的一个习惯先开 MyBatis 日志再动手改代码每次拿到新的 SSM 源码我都会先做一件事把 MyBatis 的 SQL 日志打开再启动系统。这样后端每执行一条 SQL控制台都会打印出完整语句和参数定位查询报错和参数传递问题会快很多。!-- logback.xml 或 log4j.properties 中加入以下配置 -- logger namecom.home.mapper levelDEBUG/其中 com.home.mapper 换成你项目里 Mapper 接口的实际包名。开这个日志后下单时能看到 insert 语句实际带入的参数查询时能看到 where 条件拼接的完整 SQL很多「页面报错但不知道哪里错」的问题看一眼控制台日志就明白了。从那以后我每次跑通这类毕设源码都强制走一遍同样的流程先看数据库脚本再对连接配置然后接口自测最后才动业务代码。这套流程让我避免了很多次「改了十行代码却不知道哪里带崩了」的尴尬。希望帮到你。本文还有配套的精品资源点击获取