SSM+微信小程序房屋租赁系统开发全攻略:从架构到实践 📅 发布时间:2026/8/27 2:50:50 👁 浏览次数: 简介在前后端分离的开发模式日益普及的今天SSMSpringSpringMVCMyBatis作为经典的Java企业级开发框架组合依然在课程设计与毕业设计中占据重要地位。Spring负责依赖注入与事务管理SpringMVC处理HTTP请求与响应映射MyBatis则通过灵活的SQL映射简化持久层操作三者协同构建出职责清晰的后端服务体系。与此同时微信小程序凭借其轻量、即用即走的特点成为移动端业务展示与交互的理想载体。当SSM的后端接口能力与微信小程序的即时触达相结合便能高效支撑起如房屋租赁这类具备信息发布、预约管理、角色权限等典型需求的业务场景。本文详细拆解了基于SSM的微信小程序房屋租赁系统的设计与实现过程涵盖数据库建模、后端接口封装、小程序页面交互、部署上线与常见问题排查帮助开发者快速掌握这套成熟技术栈的落地方法。 一个做毕设或练手项目的朋友大概率绕不开“SSM微信小程序”这个组合。这套“基于SSM的微信小程序房屋租赁系统”从标题看很标准也是这几年被验证过的成熟选题后端用SpringSpringMVCMyBatis前端用微信小程序原生框架数据库走MySQL整个链路清晰非常适合用来做课程设计、毕业设计或者作为第一次接触前后端分离开发的练手项目。我拿到这个项目后第一反应不是急着跑起来而是先把它拆开看了一遍结构。这类系统看起来简单但里面其实藏了不少值得梳理的细节从数据库表设计、后端接口规划到小程序端的页面交互每一步都有它自己的逻辑。这篇文章我把整个项目的设计思路、核心代码、配置方式、部署流程以及我实际踩过的坑全部整理出来希望能帮你省点时间也帮你把这套系统真正吃透。1. 项目整体设计与思路拆解1.1 核心需求解析房屋租赁系统的本质是解决“房东发布房源、租客查找房源、双方完成预约和交易”这件事。落到功能上无外乎三类角色、两条主线。三类角色分别是管理员、房东也可以叫中介、租客。两条主线是房源信息的发布与展示、预约看房的流程推进。围绕这两条主线系统至少要覆盖以下功能用户注册与登录微信授权登录为主后台账号登录为辅房东端发布房源、管理房源上下架、修改、删除、查看预约记录、处理订单租客端浏览房源列表、按关键词搜索、查看房源详情、发起预约看房、管理个人预约记录管理员端用户管理、房源审核、预约记录管理、数据统计从技术实现角度这套系统最值得学习的点在于小程序端如何通过HTTP请求与后端SSM框架通信后端如何通过RESTful接口提供数据以及数据模型如何设计才能同时支撑三端管理员、房东、租客的差异化需求。1.2 技术选型为什么是SSM微信小程序先解决一个新手最容易纠结的问题为什么不直接用Spring Boot而要选SSM我的实际建议是如果你只是为了快速完成功能且不担心答辩被追问Spring Boot当然更省事但如果你是毕业设计或者想在简历上体现自己对Spring核心原理的理解SSM反而是更“安全”的选择。原因有三SSM是Spring、SpringMVC、MyBatis三个框架的整合每一层都可以被老师/面试官单独提问你能讲的东西更多也更容易体现底层功底。SSM项目的配置项是显式写出来的web.xml、spring-mvc.xml、mybatis-config.xml你能清楚看到请求从DispatcherServlet进入后经过了什么流程这对理解MVC本质有很大帮助。微信小程序端本身只负责展示和交互业务逻辑全在后端SSM的Controller层天然适合做API接口用ResponseBody返回JSON即可二者配合非常顺畅。小程序端选择原生框架而不是uni-app或Taro是因为这个项目体量不大页面总量通常不超过20个原生框架的语法简单、调试方便而且微信开发者工具对原生项目的支持最完善遇到问题搜索引擎一查就有答案。如果用uni-app你还要额外处理一套编译链和跨端兼容反而增加了复杂度。2. 核心细节解析与实操要点2.1 数据库设计的关键表结构数据库是这套系统的地基。我见过很多同学一上来就写代码做到一半发现字段不够用回头改表结构结果把Controller和Mapper全部连带改一遍极其痛苦。所以先把表设计敲定。核心表有六张用户表sys_user、房源表house_info、房源图片表house_image、预约看房表appointment、收藏表favorite、公告表notice。用户表的设计有个小诀窍建议用role字段区分管理员、房东、租客而不是建三张独立的表。原因是这三类角色在很多业务场景下共享基础信息手机号、昵称、头像拆成三张表会导致联表查询复杂而且微信授权登录后返回的openid也需要统一存储。用户表结构参考字段名类型说明idint(11)主键自增usernamevarchar(50)登录名后台账号passwordvarchar(100)密码MD5加密存储nicknamevarchar(50)昵称phonevarchar(20)手机号avatarvarchar(255)头像地址openidvarchar(100)微信openidroletinyint(4)1管理员 2房东 3租客create_timedatetime注册时间statustinyint(4)状态0禁用 1正常房源表是整个系统的核心表字段最多设计时要特别注意两个点一是租金字段用decimal(10,2)而不是int二是状态字段要能覆盖“待审核、已上架、已下架、已出租”四种状态否则后续扩展很麻烦。房源表关键字段参考字段名类型说明idint(11)主键landlord_idint(11)房东用户IDtitlevarchar(100)房源标题descriptiontext房源描述pricedecimal(10,2)月租金provincevarchar(50)省cityvarchar(50)市districtvarchar(50)区addressvarchar(255)详细地址areadecimal(10,2)面积平方米house_typevarchar(20)户型如“2室1厅”orientationvarchar(10)朝向floorint(8)所在楼层total_floorint(8)总楼层statustinyint(4)状态0待审核 1已上架 2已下架 3已出租create_timedatetime发布时间update_timedatetime更新时间需要说明的是这里字段冗余了province/city/district三列而不是建一张地区表来关联。这是故意为之的因为查询“北京的房源”比“通过area_code联查到北京”要快得多而且小程序端不需要复杂的地区层级关系直接用picker选择省市区字符串即可简单粗暴但非常实用。2.2 后端接口设计规范后端接口的设计直接影响小程序端的开发效率。我总结了一套自己的规范已经在这个项目里实践过两次效果很好。接口返回格式统一使用JSON封装类ApiResult结构固定为三个字段code200成功500失败、message提示信息、data业务数据。public class ApiResult { private Integer code; private String message; private Object data; public static ApiResult success(Object data) { ApiResult result new ApiResult(); result.setCode(200); result.setMessage(操作成功); result.setData(data); return result; } public static ApiResult error(String message) { ApiResult result new ApiResult(); result.setCode(500); result.setMessage(message); return result; } }接口路径设计遵循按资源划分的原则核心接口如下模块请求方式路径说明用户POST/user/login账号密码登录用户POST/user/wxLogin微信凭证登录用户GET/user/info获取当前用户信息房源GET/house/list分页获取房源列表房源GET/house/detail/{id}获取房源详情房源POST/house/add发布房源房东房源PUT/house/update修改房源房东房源PUT/house/status上下架房源预约POST/appointment/add发起预约看房预约GET/appointment/list查看自己的预约列表预约PUT/appointment/status更新预约状态收藏POST/favorite/add收藏房源收藏DELETE/favorite/delete取消收藏接口设计中有两个容易被忽略的细节第一所有需要登录才能访问的接口都应该在请求头中携带token。我这里用的是拦截器Redis的方案小程序端登录成功后把token存在Storage中每次请求通过wx.request的header带上。如果用Session在小程序端会非常别扭因为小程序的请求不是浏览器原生的手动维护cookie成本很高。第二分页接口的参数命名统一为pageNum和pageSize返回的数据结构中除了列表数据还应该返回total总数方便小程序端实现“加载更多”的分页逻辑。2.3 微信小程序端页面与交互设计小程序端我采用的架构是原生语言 自定义组件 分包结构。没有引入WebView也没有用第三方UI库全部手写WXML和WXSS好处是考试/答辩时你能讲清楚每个样式是怎么来的而不是一句“调用了vant组件”。页面结构如下pages/index首页展示推荐房源列表顶部带搜索框pages/house/list房源列表页支持按区域筛选、价格排序pages/house/detail房源详情页展示图片轮播、基本信息、联系房东按钮pages/publish发布房源页房东权限可见pages/appointment我的预约页pages/favorite我的收藏页pages/user个人中心页首页是流量的入口我用了onPullDownRefresh实现下拉刷新onReachBottom实现触底加载。这两个生命周期是原生小程序特有但非常高频的能力建议仔细研究一下。房源详情页是最复杂的页面因为要传两个参数houseId房源ID和landlordId房东ID。进入页面后需要调用两个接口获取房源详情、根据landlordId获取房东信息。这里要避免一个常见问题在onLoad里同时发两个异步请求可能导致先渲染详情后渲染房东信息界面闪烁。我的处理方式是用Promise.all把两个请求合并等两个都返回后再setData。Page({ onLoad(options) { const houseId options.id; const landlordId options.landlordId; Promise.all([ api.get(/house/detail/${houseId}), api.get(/user/landlord/${landlordId}) ]).then(([houseRes, landlordRes]) { this.setData({ house: houseRes.data, landlord: landlordRes.data }); }); } });这样处理不仅观感更好而且减少了页面加载时的“白屏时间”。3. 实操过程与核心环节实现3.1 SSM框架整合的核心配置SSM整合最怕的就是配置文件彼此之间依赖关系搞混。我第一次搭的时候web.xml、spring-mvc.xml、mybatis-config.xml每个都看了很久还是搞不清谁先谁后。这里我直接给出最简可用的配置组合。web.xml负责启动Spring容器和配置DispatcherServletservlet servlet-namespringmvc/servlet-name servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class init-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-mvc.xml/param-value /init-param load-on-startup1/load-on-startup /servlet servlet-mapping servlet-namespringmvc/servlet-name url-pattern//url-pattern /servlet-mappingspring-mvc.xml负责扫描Controller、配置视图解析器和JSON转换器!-- 扫描Controller层 -- context:component-scan base-packagecom.example.controller/ !-- 启用注解驱动 -- mvc:annotation-driven/ !-- 静态资源放行 -- mvc:default-servlet-handler/这里有个关键点DispatcherServlet的url-pattern用的是“/”而不是“/”。用“/”会把JSP和静态资源全部拦截导致404。很多新手踩过这个坑记住“/”就对了。然后还需要一个spring-context.xml来扫描Service和Dao以及配置数据源。这个文件在web.xml中通过context-param加载context-param param-namecontextConfigLocation/param-name param-valueclasspath:spring-context.xml/param-value /context-param listener listener-classorg.springframework.web.context.ContextLoaderListener/listener-class /listener这样SSM就完成了分工Spring管ServiceSpringMVC管ControllerMyBatis管Dao各司其职。3.2 小程序端请求封装与登录态管理微信小程序的wx.request是一个低阶API如果不做封装每个页面都要重复写成功回调、失败回调、loading动画、错误提示代码量会爆炸。我这里的解决方案是封装一个request.js工具。const BASE_URL http://localhost:8080/lease; function request(url, method, data) { return new Promise((resolve, reject) { wx.request({ url: BASE_URL url, method: method, data: data, header: { Content-Type: application/json, token: wx.getStorageSync(token) }, success(res) { if (res.statusCode 200) { if (res.data.code 200) { resolve(res.data); } else { wx.showToast({ title: res.data.message, icon: none }); reject(res.data); } } else if (res.statusCode 401) { // 登录过期跳转登录页 wx.navigateTo({ url: /pages/login/login }); } }, fail(err) { wx.showToast({ title: 网络请求失败, icon: none }); reject(err); } }); }); } module.exports { get(url, data) { return request(url, GET, data); }, post(url, data) { return request(url, POST, data); }, put(url, data) { return request(url, PUT, data); }, delete(url, data) { return request(url, DELETE, data); } };登录态是整个系统的关键。我的策略是首次登录时前端调用wx.login获取code然后把code传给后端后端调用微信接口获取openid生成token并返回给前端。前端把token存到Storage。后续所有请求都带上token。后端在拦截器里校验token确定用户身份。这个流程里有个小陷阱微信的code五分钟有效且只能使用一次。如果你在调试过程中反复调用wx.login会导致后面的code失效。我就踩过这个坑所以在代码里加了判断只有在未登录或token过期时才调用wx.login。3.3 核心业务预约看房功能的完整实现预约看房是整个租赁流程中业务逻辑最完整的一个功能很能体现开发者对状态机的理解。我的设计是预约状态分为三种待房东确认0、已确认1、已取消2。租客端发起预约时后端需要做一系列校验校验用户是否已登录拦截器完成校验房源是否存在且状态为上架1校验不能预约自己发布的房源校验该时间段是否已被同一房源的其他预约占用校验通过后插入一条预约记录状态默认为待确认(0)同时给房东推送一条站内通知。房东端从“我的预约”里看到新预约可以选择确认或取消。确认后预约状态变为已确认(1)系统自动向租客发送一条通知小程序内通知或短信根据实际条件选择。这个功能的难点在于并发控制假设同一天上午10点有两组租客同时预约同一个房源怎么避免冲突我在appointment表里给house_id和appointment_time建了唯一索引数据库层面兜底业务层面则先用select进行预检查。虽然不能100%解决极端并发但在这个业务场景里已经完全够用了。3.4 房源发布与管理的前后端联动房东发布房源是另一个核心功能。前端表单字段很多大约有12个字段包括标题、描述、租金、户型、面积、朝向、楼层、地址等。图片上传用的是微信小程序的wx.chooseMedia接口选择后调用wx.uploadFile上传到后端后端把图片保存到本地指定目录返回图片URL前端把URL拼接到表单数据里一起提交。后端的Controller接收时注意使用RequestParam逐个接收而不是用一个实体类直接接收。原因是前端可能没传某些字段如果用实体类接收缺省字段会变成null插入数据库时容易触发非空约束异常。PostMapping(/house/add) public ApiResult add(RequestParam(landlordId) Integer landlordId, RequestParam(title) String title, RequestParam(price) BigDecimal price, RequestParam(description) String description, RequestParam(value images, required false) String images) { HouseInfo house new HouseInfo(); house.setLandlordId(landlordId); house.setTitle(title); house.setPrice(price); house.setDescription(description); house.setImages(images); house.setStatus(0); // 新发布默认待审核 house.setCreateTime(new Date()); houseMapper.insert(house); return ApiResult.success(null); }房源发布后默认进入待审核状态管理员审核通过后才在小程序端展示。这个审核环节看似多余但实际上非常重要它能避免房东批量发布垃圾房源也能让管理员有“掌控感”。在答辩时你可以把这个设计包装成“内容风控与审核机制”是加分项。4. 常见问题与排查技巧实录4.1 后端启动失败配置文件常见错误SSM项目最大的坑就是各种配置错误导致Tomcat启动时报错。我整理一下高频错误报错信息原因解决方案Error creating bean with name houseMapperMyBatis的Mapper扫描路径不对检查spring-context.xml中MapperScannerConfigurer的basePackage是否正确No qualifying bean of type com.example.service.HouseServiceService接口没有被Spring扫描到检查spring-context.xml中context:component-scan的base-package是否有service包Failed to configure a DataSource数据库连接配置错误检查jdbc.properties中的url、username、password是否正确Invalid bound statement (not found)Mapper接口和Mapper.xml的namespace或方法名不匹配检查Mapper.xml中的namespace是否为接口全限定名方法id是否与接口方法一致404错误请求路径找不到Controller方法检查Controller的RequestMapping路径与前端请求路径是否一致这里最值得重点说的是第四种“Invalid bound statement”。出现这个错误时Tomcat可以正常启动但调用接口就会报错。原因通常是MyBatis没有加载到Mapper.xml文件或者在pom.xml中漏掉了mybatis-spring-boot-starter等依赖。如果在IDEA中确认target目录下没有Mapper.xml文件那就是Maven没有把resources目录下的xml文件打入classpath需要在pom.xml中配置build resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource resource directorysrc/main/resources/directory /resource /resources /build4.2 微信开发者工具中的常见白屏与网络问题微信小程序开发中“白屏”是一个出现频率极高的问题。我分几种情况说第一种request合法域名校验失败。在开发者工具中默认会校验请求域名是否在后台配置的合法域名列表中。解决方式是在开发者工具右上角点击“详情”→“本地设置”勾选“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”。这是开发阶段最快的处理方式但是上线前必须在微信公众平台配置合法域名且必须是HTTPS。第二种真机预览时请求localhost失败。这是非常经典的问题开发者工具里本地服务可以正常访问但手机预览时请求localhost指向的是手机本身肯定找不到后端。解决方式把请求地址改成电脑在局域网中的IP同时关闭电脑防火墙。这里有个小技巧用命令行执行ipconfigWindows或ifconfigMac查看IP然后BASE_URL改成http://192.168.x.x:8080/lease。需要特别注意如果后端是放在云服务器上直接用服务器公网IP即可。第三种tab页面切换白屏瞬间。这个现象通常是因为切换tab时页面重新渲染了如果页面数据量过大会出现短暂的空白。解决方式有两个方向一是减少setData的数据量不要把整个列表都setData进去而是分批渲染二是用wx.nextTick包裹setData让渲染操作延后到当前帧结束。4.3 接口报错502/504的排查思路如果你把后端部署到云服务器上前端请求返回502或504不要慌按下面的顺序排查502表示网关收到无效响应说明请求已经到达了Nginx或Tomcat但Tomcat没有返回有效数据。常见原因是Tomcat本身挂了或者请求超时。先看Tomcat日志如果日志里显示OutOfMemoryError那就是内存不够调整Tomcat启动脚本中的JVM参数例如-Xms256m -Xmx512m。504表示网关超时通常是Nginx转发请求到Tomcat后Tomcat处理时间过长超过了Nginx的proxy_read_timeout默认值60秒。如果你的某个接口需要大数据量查询可以调大这个参数location / { proxy_pass http://127.0.0.1:8080; proxy_connect_timeout 60s; proxy_read_timeout 120s; }还有一个容易被忽略的点如果后端接口是POST且body比较大需要在Nginx配置适当调大client_max_body_size否则上传房源图片时会报413错误。4.4 小程序端常见问题速查表现象原因解决方式setData数据量大页面卡顿列表接口返回了大量数据一次性渲染只渲染首屏数据配合onReachBottom做分页加载图片显示不出来图片URL是相对路径如/upload/image.jpg拼接完整的后端地址如https://xxx.com/upload/image.jpg登录成功后页面没有跳转登录接口返回后没有执行wx.switchTab或wx.navigateTo在登录成功回调里添加页面跳转逻辑收藏按钮点击无反应请求接口未携带token后端拦截器返回401检查request.js中header是否每次请求都带上token发布房源后列表没有刷新发布成功后返回的是上一页上页是缓存数据发布成功后调用wx.navigateBack并在上一页的onShow中重新拉取列表数据这里尤其想说一下最后这个“页面缓存数据不刷新”的问题。很多新手在发布房源后返回列表页发现新房源没出现第一反应是数据库没写入成功但其实数据库里已经有数据了问题出在列表页的onLoad只会在页面首次加载时执行返回时不会重新触发。正确做法是在列表页的onShow中重新调用获取列表的接口否则只能手动下拉刷新。5. 部署上线与项目答辩要点5.1 本地联调与线上部署本地联调时最推荐的组合是IDEA启动后端Tomcat微信开发者工具打开小程序。前端把BASE_URL改为http://localhost:8080/lease后端启动时注意端口要一致。如果要用手机真机预览BASE_URL必须改成局域网IP或公网IP另外需要保证手机和电脑在同一个局域网内。Windows用户还要检查防火墙我遇到过几次情况同一个WiFi下电脑能访问Tomcat手机就是连不上最后发现是Windows防火墙拦截了8080端口的入站请求。在Windows防火墙设置中添加入站规则允许8080端口即可。线上部署建议用一台CentOS服务器环境配置为JDK 1.8 Tomcat 8.5 MySQL 5.7 Nginx。步骤为将项目打包成war包在IDEA中执行cleanpackage把war包上传到Tomcat的webapps目录启动Tomcat./startup.sh查看日志tail -f logs/catalina.out配置Nginx反向代理转发到Tomcat端口如果项目构建的是Spring Boot的可执行jar包就更简单了java -jar lease-system.jar一条命令启动。关于HTTPS我强烈建议有条件的话在微信公众平台配置合法域名时尽量用HTTPS。小程序正式版若请求的是HTTP接口会有安全隐患微信官方也明确要求上线必须使用HTTPS。如果暂时没有条件配置可以用阿里云一年的免费证书再加上Nginx配置不算难。5.2 答辩时容易被追问的几个问题如果这是毕业设计答辩老师大概率会问这几个问题提前准备一下第一个问题SSM框架各自的职责是什么Spring负责IOC和AOPSpringMVC负责请求分发和参数绑定MyBatis负责持久化。你要能举个例子说明比如“Spring管理Service层的依赖注入SpringMVC把前端的请求映射到Controller方法MyBatis把SQL查询结果映射成Java对象”。第二个问题为什么小程序端用uni-app或原生这个问题如实回答即可原生小程序天然集成微信生态能力且不需要额外编译性能更好。如果你会用uni-app也可以说“考虑到项目规模不大原生方案更轻量”。第三个问题如何保证数据安全可以从三个层面回答参数校验后端对前端传参进行非空和合法性校验、SQL注入防护MyBatis的#{}预编译机制能有效防止SQL注入、权限控制拦截器校验token后端根据role控制访问权限。第四个问题项目的扩展空间在哪里可以回答接入微信支付实现线上租金支付增加地图组件展示房源位置增加视频看房功能引入消息队列做预约提醒等。这些都是合理的扩展点说明你对系统有长远思考。6. 踩坑记录与个人实操心得6.1 数据库与后端联调中的几个“坑”我在开发过程中遇到过一个比较隐蔽的问题MySQL中存储的房源价格是Decimal(10,2)但MyBatis查询出来传给前端时微信小程序端显示的不是整数而是带了一堆小数位比如“2800.00”。用户界面很不友好。解决方式有两种一是在后端把price转成String类型再返回格式化两位小数二是在前端做一次parseFloat再展示。我实际项目中选了第一种在后端写统一的类型转换工具类保证所有金额字段都以两位小数的字符串返回前端的活就越轻越好。另外一个问题是MySQL的日期时间字段是用datetime还是timestamp。我用的是datetime原因是租赁系统涉及预约时间timestamp的范围上限是2038年对长期运营的租赁系统来说不保险。而且datetime支持到9999-12-31存储前不用考虑时区转换问题。6.2 微信小程序端的独家体验优化有几个细节优化我觉得很值得分享因为它们直接影响用户体感第一个是图片懒加载。房源列表如果图片很多可以给image组件加lazy-load属性它能让图片在滚动到可视区域时才加载显著降低首屏加载压力。第二个是减少setData的体积。微信小程序的setData实际上是JS对象和视图层之间的通信数据量大时性能明显下降。我习惯在列表接口返回大量数据时只setData当前页的数据数组而不是把整个返回数组塞进去。第三个是骨架屏。房源详情页加载时间稍长我用简单的view模拟了骨架屏效果在数据返回前展示灰色占位块数据返回后再替换为真实内容。这个小细节在答辩时很加分因为体现的是工程化思维。第四个是下拉刷新的节流。如果不做处理用户快速下拉会连续触发多个请求导致数据错乱。我的处理方式是在请求期间加一个isLoading锁请求未完成时忽略新的触发。6.3 从完成到加分我还会做哪些扩展如果你时间富余我建议做这几个扩展它们能让系统在答辩或实际应用中有质的提升一个是为房源信息接入地图定位。微信小程序内置的wx.getLocation可以获取用户经纬度map组件可以显示房源位置。把“房源地址”从一串文字变为一个地图上的点视觉冲击力和实用性都会明显提升。另一个是房东端增加“看房安排”日历视图。用calendar或自绘一个网格视图按日期展示每天有多少预约点击某一天能看到当天的预约列表这对房东日常管理极其友好。还可以做一个“租金趋势”统计页。基于历史成交数据用canvas画一个折线图展示近六个月的平均租金水平。代码写起来不复杂但能让系统的“数据分析”属性拉满。最后是消息推送。目前很多租赁系统短信通知成本较高但你可以用微信小程序的订阅消息功能在租客预约成功后向房东推送一条模板消息。微信小程序后台有免费模板消息额度足够测试使用。7. 最后的几点经验这套基于SSM的微信小程序房屋租赁系统从立项到能跑通核心流程按部就班大概需要两到三周。我个人的建议是第一周先搞定数据库和所有后端接口第二周集中写小程序端页面最后留出三天的联调和测试时间。千万不要边写前端边改后端来回切换会大大降低效率。写代码的过程中优先把登录、房源发布、房源列表、预约看房这四个主流程打通其他功能都是在这四条主线上加分支。主流程通了整个项目的框架感就出来了后续加功能只是工作量问题不会再有技术风险。关于代码质量我建议在项目里养成写注释的习惯。不用多每个Controller方法的上面写一行说明“该接口用于什么场景前端哪个页面在调用”对答辩和后续维护都有很大帮助。如果你拿到的项目压缩包解压后直接跑不起来不用慌绝大多数问题是环境问题。按顺序排查JDK版本是否符合、Maven依赖是否下载完整、数据库初始化SQL是否执行成功、Tomcat端口是否冲突、微信开发者工具的合法域名校验是否关闭。把这五关全部通过项目基本就能跑起来了。最后再分享一个关于调试效率的小技巧在后端Controller的每个接口入口处加一行log.info(接收到请求: {}, 接口名)前端请求时观察后端日志的打印情况能瞬间定位是前端没发请求、请求没到后端还是后端处理报错。这个小习惯能为你省下至少一半的联调时间。本文还有配套的精品资源点击获取