资讯动态

SpringBoot+微信小程序上门维修系统毕设全攻略:从搭建到答辩

发布时间:2026/10/2 2:51:41 来源:尧图企业网站定制
做毕设选“SpringBoot 微信小程序上门维修服务系统”这个题目的同学我猜你大概率是冲着这个组合“技术够主流、业务够生活化、演示够直观”去的。这个题我太熟了几乎每年答辩都能见到几个做类似同城服务选题的学生但真正能把整个链路讲清楚、被答辩老师追问不倒的十个里面也就两三个。这篇东西我不给你整虚的直接按“选题拆方案、后端怎么搭、小程序怎么写、联调怎么调、论文答辩怎么讲”的顺序来把该避的坑和该加分的细节全给你点透。先把这个系统到底是个什么东西说清楚。它的业务模型很简单用户家里水管漏水、空调不制冷、电路跳闸打开微信小程序按服务分类下单系统推送给附近的维修师傅师傅抢单或由平台派单上门维修完成后用户在线支付并评价。整个闭环涉及三类角色用户端小程序、师傅端小程序或同一个小程序分角色、后台管理端。对于毕设来说这个业务规模刚刚好——复杂度够写出一篇像样的论文但也不至于做到一半做不下去。适合谁来参考如果你正在准备计算机毕业设计或者想做一个同城到家服务类小程序当作品集项目这篇内容可以直接照抄思路。下面我拆开讲。1. 毕业设计选题与整体方案设计1.1 需求画像拆解这个系统到底要解决什么问题上门维修这个场景核心痛点就四个用户找不到靠谱师傅、师傅接单没有稳定渠道、价格不透明、服务过程不可追踪。你的小程序系统要做的就是通过线上下单、状态流转、评价体系把这些问题解决掉。所以在写需求分析的时候不要只写“用户登录、下单、支付”这种流水账而是要说清楚你设计的每个功能点在真实场景中对应什么环节。整个系统按角色拆用户端需要注册登录、服务分类浏览、下单预约、订单状态查看、在线支付、评价投诉、个人中心。师傅端需要注册入驻审核、接单抢单、订单状态更新、完工结算查看、个人业绩统计。管理后台需要服务分类管理、师傅入驻审核、订单管理、用户管理、数据统计。这样拆分出来你的功能结构图直接就出来了而且每一块都可以对应到具体的表结构和接口设计。核心业务流转建议做成这样用户选择服务分类比如“家电维修”“管道疏通”→ 填写地址和预约时间 → 提交订单进入“待接单”状态 → 师傅在师傅端看到可抢订单列表 → 师傅接单状态变“已接单” → 师傅上门点击“开始维修” → 维修完成用户确认 → 用户在线支付 → 互评。这套流程里每个状态变化都要记日志方便后期论文画状态图和写测试用例。1.2 技术栈选型为什么是SpringBoot加微信小程序先回答那个经典问题为什么前端选微信小程序而不是H5或者App三个理由。第一微信小程序免安装、用完即走最符合“家里突然漏水用户快速找维修师傅”这种应急场景第二微信自带登录授权体系用户不需要注册账号体验门槛低第三对于毕设而言小程序开发者工具免费、调试方便、演示效果好答辩现场直接扫码就能跑。后端选SpringBoot就更好解释了。生态成熟、社区资料多遇到问题随便搜都有答案内嵌Tomcat打包成jar就能跑不用单独配服务器Spring家族的东西写在简历上是加分项面试也爱问。另外SpringBoot对快速开发太友好了集成MyBatis-Plus、Redis、JWT、MinIO这些组件基本就是加依赖加配置的事能让把精力放在业务逻辑而非环境搭建上。有人会问要不要用uni-app这个看你自己的情况。如果你只做微信小程序原生语法完全够用而且不用多一层编译。但如果论文里想体现“跨端”概念技术上可以换成uni-app。我个人建议毕设走稳妥路线——原生微信小程序配SpringBoot这条路最成熟踩坑最少。1.3 数据库设计与表关系规划表结构设计直接决定了你论文里的E-R图好不好画也决定了后面写代码顺不顺畅。核心表我建议按这个清单来表名用途关键字段user用户表openid、昵称、手机号、头像worker维修师傅表真实姓名、手机号、技能分类、审核状态、评分service_category服务分类表分类名称、图标、描述、排序service_item服务项目表所属分类、项目名、价格、预约类型work_order订单表订单号、用户ID、师傅ID、项目ID、地址快照、状态、金额、预约时间order_status_log订单状态日志表订单ID、状态、操作人、操作时间payment_record支付记录表订单ID、支付方式、流水号、金额、时间comment评价表订单ID、评分、内容、图片订单表是重中之重。订单号建议用“日期随机数”的格式比如 20250615 加 6 位随机数方便人眼识别和后期排查。地址信息一定要冗余一份快照到订单表里不要只存用户ID再去关联查地址因为用户后面改地址的话历史订单的地址就会被改写。状态字段用int类型每个数字对应含义在代码里用枚举常量维护。再加一张订单状态日志表记录每一次状态的变更这个表在答辩时很好用可以直接证明你考虑了数据可追溯性。2. 后端SpringBoot工程搭建与核心功能实现2.1 Maven工程脚手架搭建与实际目录分层建议创建项目的方式有两种一种是去Spring Initializr网站勾选依赖然后生成包另一种是直接用IDEA的Spring Initializr功能新建。IDEA 2026版本里创建SpringBoot项目的入口在New Project - Spring Initializr选好JDK版本和依赖后等待下载就行。毕设环境我建议用JDK 8或JDK 11不要一上来就上JDK 17或更高——热词里提到的“SpringBoot版本太高”问题大多是JDK和SpringBoot版本不兼容导致的比如SpringBoot 3.x要求JDK 17起步且包名从javax.servlet变成了jakarta.servlet很多老教程里的代码直接import javax就会编译报错。依赖方面毕设项目通常需要spring-boot-starter-web、mybatis-plus-boot-starter、mysql-connector、lombok、hutool工具类库可选项、jjwtJWT库、minio对象存储、spring-boot-starter-data-redis如果做验证码或缓存。Maven构建慢的问题在settings.xml里配上阿里云镜像基本就解决了。项目目录结构我推荐经典分层不要花里胡哨com.example.repair ├── config // 配置类如CORS、MybatisPlus分页插件、MinIO配置类 ├── controller // 接口层 ├── service // 业务层接口实现分开 ├── mapper // MyBatis-Plus的Mapper接口 ├── entity // 数据库实体类 ├── dto // 请求参数对象 ├── vo // 响应视图对象 ├── common // 统一返回结果、错误枚举、全局异常 └── utils // JWT工具、MinIO工具等为什么要强调分包因为答辩的时候老师一定会翻你的代码结构如果你所有代码全堆在controller一个类里印象分直接崩塌。分包清晰说明你有工程化意识。2.2 统一返回结构与全局异常处理这是很多自学的同学最容易忽略、但规范项目必有的东西。前后端分离开发时你不可能每个接口返回的格式都不一样这样小程序端没法做通用处理。统一返回结构长这样Data public class ResultT { private Integer code; private String msg; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMsg(success); result.setData(data); return result; } public static T ResultT error(String msg) { ResultT result new Result(); result.setCode(500); result.setMsg(msg); return result; } }全局异常处理用RestControllerAdvice把业务异常、参数校验异常、未知异常统一拦截返回同一个格式。这样做的好处是小程序端请求封装的时候只需要判断code是不是200就行不用每个接口单独处理异常情况。我在实际项目里见过太多因为异常格式不统一前端联调时反复改代码的情况这个坑你提前避开。2.3 微信登录鉴权与JWT身份认证微信登录的原理要先讲清楚用户在小程序端调用wx.login得到临时凭证code然后小程序把code发给你的后端后端拿着code再加AppId和AppSecret去微信接口换取openid。openid是用户在你这个小程序下的唯一标识基于它去查或建用户表记录。获取openid的后端接口核心逻辑// 调用微信接口GET https://api.weixin.qq.com/sns/jscode2session // 参数appid, secret, js_code, grant_typeauthorization_code // 返回openid, session_key String url https://api.weixin.qq.com/sns/jscode2session?appid appId secret appSecret js_code code grant_typeauthorization_code; String result restTemplate.getForObject(url, String.class); // 解析result拿到openid注意微信这个接口本身不能被在小程序端直接调用AppSecret一旦暴露在客户端就等于是裸奔所以必须走你的后端转发。拿到openid后查用户表如果没有就自动注册有就直接登录然后签发一个JWT返回给小程序端。JWT的载荷里放userId和角色过期时间给24小时小程序端收到后存到storage里后续每个请求在header里带上。// JWT生成示例 String token Jwts.builder() .setSubject(userId.toString()) .claim(role, user) .setExpiration(new Date(System.currentTimeMillis() 24 * 60 * 60 * 1000)) .signWith(SignatureAlgorithm.HS256, secretKey) .compact();鉴权部分用拦截器实现。写一个Interceptor实现HandlerInterceptor接口在preHandle里从请求头取Authorization字段解析token校验通过就放行异常就返回401。注册拦截器的时候注意用addPathPatterns指定拦截路径excludePathPatterns放行登录相关的路径。这个设计在答辩时可以顺便展开讲“JWT无状态认证为什么适合分布式部署”是很好的加分话题。2.4 订单状态机与抢单并发处理订单状态流转是整个项目最核心的业务逻辑。建议在代码里维护一个OrderStatus常量类public class OrderStatus { public static final Integer WAIT_ACCEPT 0; // 待接单 public static final Integer ACCEPTED 1; // 已接单 public static final Integer IN_PROGRESS 2; // 维修中 public static final Integer WAIT_PAY 3; // 待支付 public static final Integer FINISHED 4; // 已完成 public static final Integer CANCELLED 5; // 已取消 }师傅抢单这里有一个并发问题值得专门设计多个师傅同时抢同一个订单如果直接用“先查询订单状态再更新”的写法极可能出现两人都看到“待接单”然后都去更新造成一单多接。解决的思路有两个。简单可靠的是用MySQL的乐观锁在订单表加一个version字段更新时带上where version?影响行数为0就说明被别人抢了。进阶一点的是用Redis的setnx做分布式锁抢单时先加锁再更新释放锁要处理超时问题。毕设阶段用乐观锁完全够而且逻辑简单好解释int rows workOrderMapper.updateStatusByVersion(orderId, OrderStatus.WAIT_ACCEPT, OrderStatus.ACCEPTED, workerId, version); if (rows 1) { // 抢单成功 } else { // 已经被别人抢了 }派单策略可以做成手动派单加自动派单可选管理员在后台指定师傅或者系统按师傅技能分类和当前待处理订单数智能派单。后者你能写一个简单的分配算法论文里还能多一张流程图。2.5 文件上传与MinIO集成让图片存储更像真实项目毕设项目里用户报修时上传故障照片、完成后上传维修凭证这些都是图片上传需求。本地磁盘存储不是不行但有两个问题重启容易丢、非本机访问不了。云OSS要钱要配置对学生来说也不是最优解。MinIO这个开源对象存储就非常合适完全私有化部署没有额外费用。SpringBoot集成MinIO的步骤概括为三步dependency groupIdio.minio/groupId artifactIdminio/artifactId version8.5.7/version /dependency配置项写到application.yml里endpointMinIO服务地址、accessKey、secretKey、bucket名称。然后写一个MinioConfig配置类注入一个MinioClient的Bean。工具类提供两个核心方法上传文件返回文件名获取访问URL。上传时要注意文件名不要用用户原始文件名防止重名和路径穿越建议用UUID或时间戳重命名。MinIO控制台和SpringBoot要部署在同一台内网机器上的话小程序端访问图片时不能用内网IP要在桶的策略里配置成公网可访问的URL或者通过Nginx做一下反向代理。2.6 Redis的合理应用场景别为了用而用很多毕设同学听到“技术亮点”就想着把Redis塞进来但用不好反而画蛇添足。这个项目里Redis合适的场景有手机验证码存储5分钟过期、师傅位置缓存实时坐标短期存储、热点服务分类缓存。验证码用Redis的setex设置过期时间天然匹配验证码的使用模式。服务分类这种不常变的数据第一次查询后缓存到Redis后面直接走缓存这就是典型的缓存穿透、缓存雪崩的答辩题目切入点。但注意别把订单这类核心数据放进Redis做持久化存储MySQL才是主存储Redis只做辅助这个主从关系要在答辩时说清楚。3. 微信小程序端开发与关键技术实现3.1 工程结构、tabBar与页面规划微信小程序的工程结构主要分成这么几个文件app.json是全局配置包括页面注册、window样式、tabBarapp.js是全局生命周期utils目录放公共工具pages目录下每个页面一个文件夹包含wxml、wxss、js、json四个文件。tabBar建议放三个首页、订单、我的。首页展示服务分类和服务项目订单页面展示我下单的订单列表并区分状态标签我的页面放个人资料、地址管理、售后入口。如果你是“一个程序两种角色”的设计师傅登录后看到的页面结构就要有所区分可以在登录逻辑里判断用户角色然后通过switchTab或redirectTo跳转到不同的tabBar页面。页面顶部导航栏高度在iPhone X及以上机型会有刘海热词里提到“微信小程序顶部导航栏高度”实际是不同机型适配的问题。简单粗暴的做法是自定义导航栏用wx.getSystemInfo获取statusBarHeight和menuButtonBoundingClientRect来计算高度省事一点的做法是用默认导航栏需要适配的元素只有安全区域给底部加padding-bottom: env(safe-area-inset-bottom)就行。毕设阶段我建议直接用默认导航栏把精力放在核心功能上。3.2 微信小程序请求封装与登录态管理小程序端请求不要每个页面都写一遍wx.request一定要封装。在utils目录下新建request.js用Promise包一层const request (url, method GET, data {}) { return new Promise((resolve, reject) { wx.request({ url: baseUrl url, method: method, data: data, header: { Authorization: wx.getStorageSync(token), Content-Type: application/json }, success: (res) { if (res.data.code 200) { resolve(res.data.data); } else if (res.data.code 401) { // token失效重新登录 wx.removeStorageSync(token); login().then(() { // 重新发起当前请求 }); } else { wx.showToast({ title: res.data.msg, icon: none }); reject(res.data); } }, fail: (err) { wx.showToast({ title: 网络异常请稍后重试, icon: none }); reject(err); } }); }); };这里有几个细节是实测踩出来的。第一请求超时时间wx.request默认是60秒有些慢接口建议单独设置timeout不要迷信默认值第二Content-Type要根据后端接口的接收方式设置SpringBoot接口用RequestBody接收就必须设application/json用RequestParam就必须走form格式第三登录态失效的处理一定不能只是在页面上弹个错而是要跳回登录流程重新获取token不然用户会一直卡在报错界面。登录流程建议在一个独立页面做进入小程序时检查storage里有没有token没有就调wx.login拿code再调后端登录接口换取token换到token后存入storage再跳转到首页。这里说一个常见的迷思有些人会直接在app.js里写死登录判断但其他页面有同步请求依赖登录结果时就会偶发拿不到token。稳妥做法是app.js里只做静默登录暴露一个loginReadyPromise其他页面用await等待登录完成后再发初始化请求。3.3 首页服务分类展示与滚动加载优化首页通常包含两个核心板块顶部的服务分类九宫格或横向滑动分类和服务项目列表。分类数据通过后端接口获取后渲染列表默认加载第一页。这里要处理的典型问题是“微信小程序页面列表加载更多”大部分前端新手都会踩到的坑是一次性把后端所有数据全查出来渲染到页面上数据量一上来渲染性能就崩了。正确做法是分页。小程序支持两种途径触发加载更多页面滚动触底onReachBottom和用户下拉加载。先用page参数记录当前页码size固定10条。每次请求完成后把新数据concat到已有列表并在本地维护一个hasMore标志位判断是否还有下一页Page({ data: { list: [], page: 1, size: 10, hasMore: true, loading: false }, loadMore() { if (!this.data.hasMore || this.data.loading) return; this.setData({ loading: true }); request(/service/list, GET, { page: this.data.page, size: this.data.size }) .then((res) { const list this.data.list.concat(res.records); this.setData({ list: list, page: this.data.page 1, hasMore: res.records.length this.data.size, loading: false }); }); }, onReachBottom() { this.loadMore(); } });防重复请求的loading判断非常关键。没有这个判断用户快速滑动时会同时发出多个相同页码的请求列表会出现重复数据后端也会收到一堆无用流量。页面底部加一个“加载中/没有更多了”的提示条这个交互细节可以截图放到论文里作为功能展示。3.4 定位与地址选择这个环节最容易出幺蛾子上门维修系统的地址选择是核心交互之一。方案上可以用微信自带API或者腾讯地图SDK。如果用微信自带能力流程是wx.chooseLocation({ success: (res) { // res.name 地址名称res.address 详细地址res.latitude 纬度res.longitude 经度 this.setData({ address: res.address, latitude: res.latitude, longitude: res.longitude }); } });注意wx.chooseLocation需要在app.json里配置permission参数includeLocation: true。如果只弹授权框不开权限用户点“允许”也进不去选择器。这是一个非常隐蔽的坑有些人调了半天还是提示“请授权定位”其实就是这个配置没写。另外真机测试时定位精度受环境影响较大室内可能偏移一两百米所以不要让用户手动填经纬度而是让用户选地址然后由腾讯地图的逆地理编码把地址转成经纬度。后端保存坐标字段时统一用Decimal类型的经度、纬度方便后续做“附近师傅”的范围查询。3.5 支付逻辑简化小程序支付的正确打开方式微信小程序支付对于个人开发者来说最大的门槛是——个人主体的小程序申请不了微信支付商户号这个限制会卡死很多个人项目。毕设阶段的处理方式我认为有两种第一种如果本身有企业资质或能借到企业主体走正常的wx.requestPayment流程第二种普通学生项目就用“模拟支付”功能。模拟支付的实现就是在支付页面展示一个虚拟的支付弹窗用户点“确认支付”前端调后端接口把订单状态直接改成已支付并生成一条支付记录。答辩的时候老师基本都知道个人主体做不了真实支付所以不用心虚。论文里就写“系统设计了支付接口预留微信支付对接能力开发环境中使用模拟支付完成闭环”。这比硬着头皮接一个第三方支付包挨批要好得多。真要做对接记得处理好payment_record表和微信回调通知notify_url这一块代码量不大但是流程要完整回调验签和订单金额核对是重点。4. 前后端联调、抓包调试与Verilog常见问题排查4.1 联调环境配置真机调试的地址问题开发时在小程序开发者工具里后端地址填http://localhost:8080通常没问题但一旦上真机调试手机访问不了你电脑上的localhost这时就要换成局域网IP在application.yml里把服务配成0.0.0.0或者让服务监听你的局域网网卡IP。还有一点很容易被忽略手机和电脑必须连同一个WiFi。如果办公室或宿舍有AP隔离可能互相ping不通最简单的方案是手机开热点电脑连手机热点这样局域网环境绝对互通。另外一个小程序端的注意项开发时需要在开发者工具右上角“详情 - 本地设置”里勾选“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”。不然请求一发就会被卡住提示“不在以下合法域名列表中”。如果是体验版或正式版则必须在微信公众平台配置request合法域名且必须是HTTPS。很多同学第一次发布体验版后所有接口全挂就是只完成了开发环境配置忘了去公众平台配置生产环境的request合法域名。这里补一句没有备案域名的话可以先把后端部署到云服务器配一个HTTPS域名或者用云厂商的API网关方案过程稍烦但这是小程序的硬性限制。4.2 用Charles抓包小程序请求排查问题的利器小程序前端报错但后端日志全无痕迹这种问题遇到几次你就知道抓包工具的重要性了。Charles是一个HTTP代理工具原理很好理解它作为中间人手机端所有请求都先经过它再转发到服务器这样你就能看到完整的请求头、请求体、响应体。用Charles抓小程序包的步骤第一步电脑上安装Charles并保证和手机在同一局域网第二步开启Proxy菜单下的SSL Proxying添加要抓的域名比如你的后端IP或localhost第三步手机WiFi设置里手动配置HTTP代理填电脑IP和默认端口8888第四步如果是HTTPS请求还需要在手机浏览器访问chls.pro/ssl下载并信任Charles证书然后在设置里“允许从网络安装证书”并开启用户凭据信任。完成这些后在小程序里触发一个请求Charles的Interface列表就能看到这个请求点击进去可以查看headers、JSON body、耗时。有一次我排查一个“小程序里永远拿不到数据但Postman正常”的问题就是用Charles发现小程序请求头里带了Authorization而后端拦截器对未带token的请求会返回401但后端日志没有打印这个请求一下子定位到了是token解析失败。不过要强调一点抓包只能抓你自己写的、你有权调试的小程序不要拿这个技巧去做任何违反法律法规的事情。抓包的全部目的就是排查自己的联调问题。4.3 小程序请求后端接口报错的排查清单联调阶段最容易遇到的一类问题是请求发出去了后端返回各种异常。这里整理一个速查表现象可能原因处理方案请求报404接口路径写错、Controller没加RequestMapping前缀用Postman先验证接口是否存在请求报405请求方法不匹配GET调成了POST检查前端method和后端GetMapping/PostMapping请求报500后端逻辑异常、空指针、数据库错误看后端控制台堆栈日志加日志输出请求CORS报错跨域问题域名或端口不一致后端配置CORS允许跨域返回数据为null实体类属性名与JSON字段名不一致检查JsonProperty和MyBatis自动驼峰映射配置真机调试连不上局域网IP不通、防火墙拦截手机电脑同一网络关闭后端所在机器防火墙HTTPS证书报错小程序要求合法域名和TLS开发阶段勾选不校验域名正式版配置合法域名CORS问题给的统一解法是在SpringBoot里写一个CorsConfigConfiguration public class CorsConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) .allowedOriginPatterns(*) .allowedMethods(GET, POST, PUT, DELETE, OPTIONS) .allowedHeaders(*) .allowCredentials(true) .maxAge(3600); } }SpringBoot版本如果高于2.4注意allowedOriginPatterns方法和allowCredentials搭配使用的坑直接用allowedOrigins(*)加allowCredentials(true)会导致浏览器拦截。4.4 那些“高级话题”要不要碰金仓、读写分离、SpringBoot高版本热词里有“金仓读写分离配置”“SpringBoot版本太高”这类搜索词这里结合毕设实际说一句国产数据库适配是很好的加分方向但不要在初版就把主存储放在金仓上。建议的做法是先用MySQL把系统跑通论文的数据库设计部分写清楚表结构和关系然后在“系统扩展”章节写一段“兼容适配方案”说明系统数据访问层基于MyBatis-Plus的通用Mapper设计可以平滑切换到人大金仓、达梦等国产数据库。如果答辩老师恰好研究这个方向你可以顺势聊聊读写分离与中间件的概念如果不懂也不会翻车。SpringBoot版本这块很多刚接触Java的朋友会用最新版本结果配置文件、导入的包名都跟网上教程对不上报错连环炸。毕设求稳用Spring Boot 2.7.x或3.0.x配对应版本的JDK即可。我见过用Spring Boot 3.2 JDK 21跑的毕设报一堆spring.factories读取失败的问题因为新版改了自动装配机制很多旧依赖不支持。最终项目能跑起来比版本新不从像素上重要一万倍。5. 论文撰写、图表绘制与答辩准备5.1 论文结构安排与各章内容要点计算机毕业设计论文一般结构是绪论、关键技术介绍、需求分析、总体设计、详细设计与实现、系统测试、总结展望。绪论里“研究背景与意义”从行业痛点写起但不要胡编数据比如不说“统计接入纠纷率上升了30%”除非有真实来源。国内外研究现状这块要查文献可以搜类似家政服务App、到家服务平台的研究相关文献是很多的。需求分析章节放用例图和用例说明总体设计放功能结构图、系统架构图、E-R图、数据库表设计。详细设计是对每个模块的讲解配合核心代码片段、时序图代码不要大段全贴截图关键代码并配上文字说明。系统测试章节除了功能用例最好加一个测试结论的表格列出用例编号、功能模块、测试步骤、预期结果、实际结果、是否通过。这个表格极其加分能证明你真的跑过一遍系统。5.2 图表工具与绘制技巧画图工具推荐ProcessOn或draw.io免费、模板多、导出方便。论文里必配的图有系统功能结构图、用户端业务流程图、订单状态图、系统架构图、数据库E-R图、部分核心时序图。功能结构图用树状图表达业务流程图用泳道图表达各个角色的交互订单状态图可以用状态机图。画图的核心原则是图要跟实现一致千万不要为了好看画出代码里就没有的模块答辩时被追问某一个功能时你完全不知道怎么回答场面会很尴尬。5.3 答辩高频问题与应对思路答辩老师问的问题主要集中在几个方向技术原理、功能逻辑、设计取舍。列几个经常被问到的“SpringBoot的自动装配原理是什么”——这是一个必问问题。你至少要能说清楚SpringBootApplication包含EnableAutoConfiguration后者通过Import导入AutoConfigurationImportSelector这个类会扫描META-INF/spring.factories文件里配置的自动配置类再根据ConditionalOnClass等条件注解按需装配。不要只会说“启动时自动加载”要把SPI机制和条件装配说透。“为什么用MyBatis-Plus不用MyBatis”——答MyBatis-Plus提供了单表CRUD的通用方法减少手写SQL内置分页插件底层仍然是MyBatis不改变原有生态。“订单状态这样设计有什么好处”——这个问题考察状态机设计你可以答通过状态字段配合状态日志表能够追溯订单流转过程状态枚举集中管理避免硬编码后续如果要加“退款中”等状态只需扩展枚举。“微信小程序存储的openid会不会泄露隐私”——答openid是当前小程序下的用户唯一标识不是用户微信号并且后端不会回传openid只下发JWT用户自身也看不到自己的openid设计上满足最小化原则。“你的系统安全性是怎么考虑的”——三个层面答传输层走HTTPS业务层JWT做身份认证、参数校验、统一异常处理存储层密码使用BCrypt加密敏感操作记录日志。顺带提一下接口幂等性设计比如支付重复回调只处理一次。5.4 答辩演示的演示路径建议演示环节最忌讳在现场边想边点。提前准备一份“演示走查表”路径建议是进入首页展示服务分类 → 选择一个维修服务项目 → 填写故障描述和地址 → 提交下单订单状态显示待接单 → 切到师傅端查看可抢订单列表 → 点击接单订单状态变为已接单 → 师傅端点击开始维修状态变维修中 → 用户端确认完成 → 进入支付页模拟支付 → 支付成功双方可以评价 → 管理后台上线看到新订单数据和评价数据。每个环节之间把关键接口的调用情况用开发者工具network或Charles展示一下。整条链路走下来时间控制在8到10分钟正好覆盖核心功能不会拖沓。最后再分享一个我做这类毕设辅导比较多年的个人体会这个题目的上限和下限都跟工程完成度挂钩。最怕的不是功能少而是做完主流程但关键支线断节——比如师傅审核没有后台入口、订单取消逻辑没处理库存答辩时老师随便一追问就露馅。建议你在写代码时先梳理一份“完整流程路径清单”把每个角色的完整生命周期走一遍状态能进能退、订单能取消能退款该有的日志和校验都补上这套基本功练出来的工程习惯去工作后都吃得开。就按这个路子做你的毕业设计和答辩稳得很。

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

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

免费获取报价 →
↑