ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SpringBoot+微信小程序+AI大模型:智能外卖推荐系统毕设全解析

SpringBoot+微信小程序+AI大模型:智能外卖推荐系统毕设全解析 “基于SpringBoot微信小程序AI大模型的智能外卖点餐推荐系统”这个题目是近两年毕业设计里出现频率很高的一种组合。乍一看技术栈非常“全”后端框架、移动端小程序、人工智能三个热门方向全占了。但很多同学拿到题目后第一反应是“这不就是把SpringBoot的增删改查写完然后调一个GPT接口生成推荐结果吗”这个理解其实很危险。把SpringBoot、微信小程序、AI大模型三个关键词堆在一起不等于做出了一个有说服力的毕设。真正能拿高分、能讲清楚逻辑的作品一定不是“功能演示”而是一个从数据到推荐策略再到交互反馈的完整闭环。这篇文章我想拆开来讲讲这个题目到底在考察什么怎么从零搭建一套可运行、可演示、可答辩的系统以及哪些细节最容易让你在导师面前翻车。1. 先想清楚这个毕设题目真正在考察什么1.1 为什么“堆技术栈”不是解题思路很多同学一看到题目里有“AI大模型”就直接把OpenAI、文心一言、通义千问等接口接进来做一个“用户输入需求AI返回推荐菜品”的功能。这样做确实能在演示时显得很“智能”但如果深入问几个问题就很容易被发现只是表面功夫用户不输入需求时推荐怎么生成新用户没有历史订单系统靠什么推荐推荐结果和用户当前的位置、店铺距离、配送时长有关系吗为什么A用户看到的是“辣子鸡丁”B用户看到的是“轻食沙拉”大模型接口超时或报错时页面怎么办如果这些问题答不上来评审老师很容易判断这个系统的“智能”只是外包给了一个外部接口自己的系统并没有做核心的数据处理和决策逻辑这不是一个系统工程而是一个API调用Demo。所以这个毕设题目真正在考察的不是“会不会调第三方接口”而是你有没有能力把“推荐”这件事做成一个可运行、可解释、可评估的服务。1.2 标题里的“源码LWPPT讲解”对应哪些实际能力这类毕设项目标题中的“LW”通常指论文文档。不要小看论文这一部分它在最终评价里的权重往往超过代码本身。在代码层面需要你具备这些能力设计数据表用户、店铺、菜品、订单、评分、推荐日志、浏览记录等。设计后端接口登录鉴权、菜品列表、下单、推荐接口、订单查询。设计小程序页面首页推荐流、店铺详情、菜品详情、购物车、订单页、个人中心。接入AI能力要么接入大模型API做自然语言推荐要么自己实现协同过滤算法要么两者结合。处理边界情况网络异常、空数据、冷启动、高延迟、重复提交等。在论文层面需要你写清楚选题背景、系统需求分析、总体设计、数据库设计、功能实现、系统测试、总结与展望。你会发现代码能力只是其中一半另一半是对一个复杂需求的分析、拆解、设计、测试和表达能力。很多卷面好看的项目代码很漂亮最后分数不高问题往往出在文档和答辩。2. 技术选型为什么是SpringBoot、微信小程序、AI的三件套2.1 SpringBoot在后端选型里的位置外卖点餐系统的后端用SpringBoot不是唯一选择但在毕设场景下确实是比较稳妥的选择。SpringBoot的自动配置、内嵌Tomcat和大量Starter极大降低了项目搭建成本。相比SSH、SSM时代用SpringBoot写一个后端服务配置量少很多学生可以把精力放在业务逻辑而不是纠结XML配置。社区资料极其丰富。遇到问题搜索时几乎都能找到对应解决方案。这对独立完成的毕设阶段非常关键。生态齐全Spring Security或Sa-Token可以做登录鉴权Spring Data JPA或MyBatis可以操作数据库Spring Validation可以做参数校验这些都能直接支撑一个完整的外卖点餐系统。推荐算法的实现也基本不挑框架Java实现协同过滤、基于内容的推荐、规则推荐都不算复杂尤其对中小规模数据集来说性能和复杂度完全可控。如果说有什么替代方案用Node.js、Python Flask、Django也能做。但选择SpringBoot意味着你能获得更高的容错率和更成熟的工程实践参考。2.2 微信小程序的选择逻辑外卖点餐系统的前端选择微信小程序而不是Web网页、Android App或iOS App核心原因是贴近真实场景。小程序无需安装扫码或搜索即可使用和外卖用户“即用即走”的心理非常匹配。微信生态内已经有成熟的用户习惯所有用过微信的人用到小程序都没有学习成本。前后端分离的调试方式与SpringBoot接口天然配合后端提供RESTful API小程序端用wx.request调用。毕设答辩时可以很自然地说“外卖业务具备轻量、高频、碎片化访问的特征所以选择了微信小程序”。前端的技术栈上通常有两种选择一是直接用微信原生开发适合对小程序的页面生命周期更熟悉的人二是使用uni-app开发一套代码可多端编译。从毕设的角度看原生小程序的学习成本更低调试工具链也更简单资料也更好找。除非你对uni-app已经比较熟练否则我更建议直接用原生小程序。2.3 AI大模型在这里应该承担什么角色这是整个系统最关键的设计决策。AI大模型在外卖推荐系统里可以承担多种角色但不应该包揽所有事情。我认为合理的分工是数据驱动的推荐逻辑由传统推荐算法承担比如基于协同过滤或基于标签匹配的推荐。大模型主要负责“表达层”和“对话层”比如根据推荐结果生成自然语言推荐理由、根据用户的模糊描述匹配菜品偏好、或者在用户做选择题时提供更人性化的回复。举个例子数据层算出“用户A最近常点的5个菜品”推荐引擎再结合店铺评分和配送距离过滤出3个候选餐厅。最后大模型不是重新算推荐而是把这3个候选包装成一句推荐语“根据你最近的口味偏好附近这家川菜馆的辣子鸡丁评分最高距离你只有800米预计29分钟送达。”这个方案的好处是就算大模型接口不可用推荐系统本身还是能正常工作系统核心不会崩。大模型成为增强体验的一层而不是唯一的智能来源。3. 从零搭起一个最小可运行的外卖推荐系统长什么样3.1 环境准备与项目初始化动手之前先把基础环境准备好。以下是我建议的清单JDK 8 或 11如果Spring Boot版本高需要JDK 17见下方注意Maven 3.6MySQL 5.7 或 8.0IntelliJ IDEA微信开发者工具Redis可选如果要做缓存或会话管理这里比较常见的坑是版本匹配。Spring Boot 2.x搭配JDK 8比较顺手Spring Boot 3.x要求JDK 17起步而且部分第三方依赖可能还没有适配新版本。如果后续遇到“程序包javax.*不存在”这类问题通常就是JDK和Spring Boot版本不匹配。建议使用Spring Boot 2.7.x搭配JDK 8或11这是目前网上资料最多、排错最方便的组合。3.2 数据库设计的核心表一个外卖点餐推荐系统最核心的数据模型至少包括这些表表名核心字段作用userid, openid, nickname, avatar, gender, location用户信息openid用于小程序登录shopid, name, address, latitude, longitude, rating, delivery_time店铺信息推荐时需要店铺评分和位置dishid, shop_id, name, price, image_url, category, tags, monthly_sales菜品信息tags是推荐的重要依据ordersid, user_id, shop_id, total_amount, status, create_time订单主表order_itemid, order_id, dish_id, dish_name, price, quantity订单明细用户偏好分析的主要数据来源ratingid, user_id, shop_id, dish_id, score, comment, create_time用户评分数据recommend_logid, user_id, rec_type, dish_ids, reason, create_time记录推荐结果方便论文截图和算法分析在设计推荐系统的数据库时建议在dish表里加上tags字段比如“微辣”“高蛋白”“素食”“低卡”等这样后面实现标签匹配时会省很多事。同时orders表和order_item表要保留足够的历史数据推荐算法的输入才有意义。前端小程序需要的数据尽量通过后端接口聚合返回不要在小程序端做复杂的多表联查。后端接口返回给小程序的数据结构最好是小程序直接能用的比如“推荐列表”就是一个包含店铺信息、菜品信息、推荐理由的数组。3.3 后端接口怎么划分按职责划分后端接口大致可以分成四类用户类微信登录code换openid然后生成自己的会话token、用户信息更新。业务类店铺列表、菜品详情、购物车、创建订单、订单列表。这些接口是外卖系统的基础功能属于必须完成的。推荐类首页推荐、猜你喜欢、推荐理由、基于用户输入的AI推荐。这是系统的核心亮点。管理类管理员登录、店铺和菜品管理、订单管理。如果毕设题目没有单独要求后台管理系统可以用简单的Controller配合数据库初始化脚本完成。登录这块小程序端通过wx.login拿到code传给后端后端调用微信接口换取openid然后再生成自己系统的登录态。注意不要把openid直接当成session使用也不能把openid传给小程序端它属于用户敏感信息正确做法是后端生成一个随机的token维护token和用户ID的映射关系。3.4 微信小程序端的页面流程小程序端建议至少包括以下页面首页推荐流、搜索框、分类导航、附近的店。店铺页店铺信息、菜单列表、加入购物车。菜品详情页菜品图片、价格、标签、评价、推荐理由。购物车页已选菜品、合计金额、去结算。订单页订单列表、订单详情、状态跟踪。个人中心头像昵称、历史订单、偏好设置。推荐页AI对话式推荐入口输入“想吃辣的”或“今晚不想胖”等模糊需求。首页是重中之重。建议首页默认展示三部分内容顶部“AI帮你选”入口中间“附近热卖”底部“猜你喜欢”。“猜你喜欢”的推荐结果来自后端推荐接口并且每条推荐下面都展示推荐理由这是提升系统“智能化”感知的关键。4. 推荐功能怎么设计才能既落地又有亮点4.1 冷启动新用户没有行为数据怎么办推荐系统第一天就会遇到冷启动问题。新用户没有任何订单记录、浏览记录、评分记录协同过滤完全失效。常见的冷启动策略有三种默认推荐热门销量榜把月销高、评分高的菜品作为兜底。让用户在首次使用时选择题“你更偏爱哪种口味辣/清淡/甜/鲜”直接收集偏好标签。基于用户位置推荐附近高评分店铺。我建议毕设系统至少实现第一种和第三种理想情况下再支持第二种。这三种都实现后你的“新用户体验路径”就是完整的而且每个阶段都有数据支撑。4.2 推荐策略规则 协同过滤 大模型的三层结构我之前提到不要把所有智能都交给大模型接口。更稳的做法是设计成三层第一层基于规则和统计。当用户没有行为数据时按销量、评分、距离排序。简单稳定不需要训练响应快。第二层基于物品的协同过滤。核心逻辑是“与你购买过的菜品相似的菜品”相似度通过“被同一个用户同时购买”来计算。实现时只需要计算菜品之间的共现矩阵逻辑不复杂但能明显提升个性化感受。例如A和B两个用户都点了鱼香肉丝那么鱼香肉丝和宫保鸡丁之间的相似度就会提高以后点过鱼香肉丝的C用户就有机会看到宫保鸡丁。第三层大模型的自然语言处理。用户输入“想吃点清淡的”或“推荐一个适合加班夜宵的东西”系统把用户输入和候选菜品标签、店铺评分、距离等信息拼成提示词调用大模型API生成Top3推荐和推荐理由。这里大模型是“智能表达层”不是替代前两层的数据决策。推荐接口可以设计为带参数的模式recommend?userId1typedefault适合默认猜你喜欢跑规则 协同过滤。recommend?userId1typeaiquery想吃辣的适合AI对话式推荐调用大模型生成结果。这种设计还有一个好处哪怕大模型接口需要付费或暂时不可用默认推荐还能正常工作不会导致系统瘫痪。4.3 大模型API的调用封装接入大模型API时不要直接在业务代码里散落到处都是。更合理的做法是单独封装一个AIService支持超时控制。设置合理超时时间比如3到5秒。外卖场景等不了太久超过时间就返回兜底推荐。异常降级。捕获网络异常、限流异常等降级到默认推荐接口。提示词模板管理。把prompt放在配置或枚举里方便调整和维护。结果解析。大模型返回的内容可能是非结构化文本需要解析成系统可展示的格式比如要求大模型输出JSON并做校验。如果只是做毕设可以用一个简单的HttpClient调用API但务必在代码里体现出“我会考虑超时和稳定性”这个工程意识这在答辩时非常加分。5. 最容易让毕设翻车的5个工程细节5.1 微信小程序的合法域名问题开发阶段小程序后台“不校验合法域名”这个选项很好用。但到了答辩展示如果还是靠这个开关显得不太专业。更合理的做法是本地开发时在微信开发者工具中勾选“不校验合法域名”方便连本机后端。需要部署演示时提前把后端API接口部署到一台有公网地址的服务器上并在小程序后台配置request合法域名。如果你没有服务器本地演示时也可以始终使用“不校验合法域名”模式但要提前检查在win/mac、局域网IP下的连接是否正常。注意小程序必须使用HTTPS域名来调用后端接口。如果只是为了答辩没有正式备案的话往往需要一台临时服务器来支撑演示。更简单的替代方案是本地起后端用本机IP让同网段手机访问并在开发者工具测试时关闭域名校验。这至少能保证演示环节不容易断链。5.2 下单时的数据一致性和重复提交外卖系统里结算下单很容易出现并发或重复提交问题用户连点两次“提交订单”生成了两条一样的订单。用户已经支付成功但因为网络超时后端没有收到回调前端显示未支付。后端扣了库存但用户最终取消订单库存没有返还。毕设阶段不要求你实现分布式事务但至少要做到前端下单按钮加loading状态防止重复点击。后端创建订单接口里对同一用户短时间内的相同请求做幂等处理比如检查是否已经存在相同用户、相同创建时间的订单。订单状态变更写下状态机不出现“已支付”被改成“已取消”的非法流转。这些点并不难实现但能在代码评审和答辩时体现工程素养。5.3 数据库初始化和演示数据很多同学答辩演示时页面空空如也因为没有好好造数据。建议在项目里准备一批初始化SQL脚本至少6到8家店铺位置分散在前端地图可见范围内。每家店铺8到12个菜品包含标签、价格、月销量。为测试用户准备一批历史订单横跨不同口味和店铺。如果做了协同过滤确保历史订单数据足够使推荐结果有明显差异。演示前先跑一遍接口确认推荐列表非空AI推荐能返回结果订单流程能走通。这一步不值钱但是最影响现场体验。5.4 大模型接口不稳定时的应对大模型API在演示现场可能因为网络、限流或Key额度不足而失败。千万不要在答辩时出现“AI功能无法展示”的尴尬。建议准备两套方案代码里保留降级逻辑API失败时自动回退到规则推荐并在前端给出一句“智能推荐暂时不可用已为你展示热销推荐”。提前录制一段演示动图或录制视频作为备份。不是让你作弊而是应对现场不确定性的正常手段。5.5 微信支付怎么处理如果毕设题目没有硬性要求接入真实微信支付最好用模拟支付替代。在订单流程里做“一键模拟支付”将订单状态直接置为“已支付”并在论文里写明这是为了演示流程实际生产环境需要申请微信支付商户号并接入统一下单、支付回调等接口。这样既诚实又能让流程完整。如果题目明确要求对接真实微信支付注意需要企业主体、商户号、证书等前置条件。个人开发者的小程序很难开通支付权限。我曾经看到有同学的毕设强行接支付最后演示时无法付款整个流程直接断了。这个风险要提前规避。6. 从“能交差”到“能拿高分”四个加分方向6.1 推荐理由生成让“智能”变得可感知这是整个系统最值得做的加分项。当用户看到推荐结果时平台不只是给出菜品名称而是给出推荐理由。比如系统学习到用户偏好吃辣看到“毛血旺”时会展示“根据你近期偏好推荐这款香辣口味的川菜适合重口味”。推荐理由的生成有两种实现方式规则模板根据用户购买次数、评分、偏好标签、距离等生成固定模板句子。大模型润色规则先生成一个粗略的结果由大模型生成更自然的表达。推荐理由的可解释性在答辩时可以回答一个最致命的问题“你的系统为什么给用户推荐这道菜”没有推荐理由的推荐系统答辩时很难自圆其说。6.2 增加简单的用户行为采集在小程序端给菜品列表、菜品详情页增加曝光和点击埋点。这些行为数据可以上传到后端后续推荐时参考。后端在返回“猜你喜欢”时可以排除用户最近已下单的菜品或者给近期浏览过但未下单的菜品加权。这会让系统的推荐策略更有说服力因为你不再只是依赖订单数据还考虑了用户的即时兴趣。6.3 增加管理端接口和测试报告不需要做复杂管理后台但至少在论文里提一下管理员接口加上Swagger或Knife4j生成接口文档这样答辩时可以直接展示API。数据库设计文档、接口测试、核心算法流程的贴图能显著提升论文观感。6.4 论文写作中的“算法对比”推荐算法部分不要只写“我用了协同过滤”建议至少加入一组对比实验比如同一批用户数据基于规则推荐 vs 基于协同过滤推荐用准确率、召回率或用户反馈来评价。哪怕是离线模拟数据也比纯文字描述有说服力。7. 开发顺序、验收清单与排查链路7.1 建议的开发顺序很多同学喜欢先把所有代码写完再联调结果死磕一周发现一堆问题。我更建议按下面的顺序来先做完数据库设计把初始化SQL写好。完成后端基础CRUD接口包括登录、店铺、菜品、购物车、订单。完成小程序基础页面跑通“从首页到下单”的完整流程。接入推荐逻辑先实现规则推荐再实现协同过滤最后接入大模型。完善推荐理由、异常降级、演示数据和答辩文档。最后打包整理源码、论文、PPT。核心原则是先在最小闭环里验证全链路再逐步增加“智能”内容。一次跑通全流程比单独写完所有功能再合并调整顺手得多。7.2 答辩前最后要检查的清单检查项判定标准后端能启动无报错数据库自动初始化成功小程序能连后端登录、首页、店铺页都能正常显示数据下单流程完整从选菜、加购物车、提交订单到模拟支付成功推荐接口有数据“猜你喜欢”和“AI推荐”均非空推荐结果合理测试用户的历史订单和推荐结果具有明显相关性异常降级有效关闭大模型API默认推荐仍可用论文结构完整需求分析、数据库设计、功能实现、系统测试齐全PPT有逻辑不是贴大段代码而是讲清楚系统架构和推荐流程7.3 出了问题的排查顺序如果开发或演示时遇到异常建议按这个顺序排错先看后端日志。启动报错、请求报错、SQL异常90%的问题在日志里都有明确线索。再看前端控制台。小程序请求失败是网络、域名还是参数问题Network面板直接能看到。再看数据。推荐为空时先检查推荐表或订单表里有没有数据再检查推荐逻辑里过滤条件是否把结果全过滤了。再看环境。端口、IP、HTTPS域名、开发者工具校验开关都是最常见的坑。最后才看算法逻辑。确认数据和环境都没问题再单步调试协同过滤或大模型调用。排查时不要乱改代码。每改一个变量、一个接口先复现一次确认问题被解决再继续下一步。这个题目真正值得投入的地方“基于SpringBoot微信小程序AI大模型的智能外卖点餐推荐系统”表面上是个毕设题目实际上是一个典型的小型工程训练。它逼着你同时考虑数据建模、接口设计、前端交互、算法落地、异常处理和文档表达。你的收获不是“学会了调用大模型API”而是理解了一个完整的推荐服务是怎么从数据到策略再到用户侧被消费掉的。从这里学到的能力无论是继续做后端开发、算法还是全栈方向都算是真正能迁移的底层素养。如果你正在做类似的毕设项目我的建议很简单别急着炫技先把一条完整链路跑通再逐步把“智能”填进去。先能成立再追求亮眼。你的答辩、你的代码、你的文档都会因为这一个小小的方法论变得完全不一样。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进