行业资讯
📅 2026/9/9 10:43:28
基于微信小程序的个性化推荐外卖点餐系统毕设实战指南
做毕设选了这个题目说明你眼光不错。基于微信小程序的个性化推荐外卖点餐系统这个选题既踩中了移动互联网时代人们最日常的点餐需求又巧妙融入了“个性化推荐”这个听起来就很有技术含量的亮点。作为一个帮不少人远程调试过代码、也评审过不少毕设的老学长我可以负责任地告诉你这个题目做好了绝对是个拿得出手的“良”甚至“优”的毕业设计。这篇文章我就结合自己带项目的经验把这个毕设从需求分析、技术选型、功能拆解到算法落地、避坑指南从头到尾给你梳理一遍。不管你是正在犹豫选题、已经开题还是代码写到一半卡住了这篇文章都能给你一些实实在在的参考。1. 项目整体设计与思路拆解别一上来就写代码很多同学拿到这种题目第一反应是“先搭个框架能跑就行”。这个心态要不得。毕业设计尤其是带有“个性化推荐”这种关键词的题目考察的核心其实是你“为什么这么做”的思考过程而不是你“用了什么框架”的堆砌结果。1.1 核心需求解析这个系统到底要解决什么问题先把这个题目拆开看它其实包含三层含义第一层微信小程序端。这意味着你的系统必须运行在微信这个超级App的生态里用户扫一扫或者搜一搜就能用无需下载安装。这要求你熟练掌握小程序的开发框架WXML、WXSS、JS/TS、组件库以及微信特有的登录授权wx.login、支付wx.requestPayment等API调用。这是整个系统的“门面”。第二层外卖点餐系统。这决定了系统的业务核心功能。简单来说至少要覆盖用户端浏览菜品、加购、下单、支付、评价、订单跟踪和商家端菜品管理、订单管理、出餐状态以及管理员端用户管理、商家审核、数据统计等。这一部分是工作量的大头也是最容易做“流水账”的地方。第三层也是真正的“题眼”——个性化推荐。很多同学做到这里就懵了不知道推荐怎么“个性化”。简单理解就是系统需要根据用户的历史行为浏览过什么、点过什么、评分过什么从菜品库中挑选出“这个用户最可能喜欢”的菜品主动推送到他的首页或推荐列表里。这部分的算法实现和效果展示决定了你项目的技术深度和答辩时的底气。1.2 技术选型与理由为什么是这套组合拳对于这类全栈毕设即前端后端数据库全部自己完成技术选型的核心原则是自己熟悉 技术新颖 框架庞大。别为了追求复杂而选择不熟悉的技术栈除非你有十足的把握能在答辩前跑通并讲清楚。常见的、也是比较稳妥的组合拳是前端小程序端微信官方原生的小程序开发工具或者使用uni-app框架。如果你只做了微信端推荐原生开发可控性最强遇到问题查文档也最直接。如果你想顺便做个H5版本或者以后还想发布到支付宝小程序、百度小程序那uni-app是更好的选择一套代码多端运行。对于大多数面向独立小程序端的毕业设计原生开发足够。后端服务端这是重头戏选择非常多。如果你已经学过Java那Spring Boot几乎是标配了生态成熟资料丰富毕业设计里的一堆订单管理、用户管理之类的基础CRUD增删改查操作用Spring Boot封装好接口后开发效率极高。如果你平时用Python多那Flask或Django会更顺手尤其是做推荐算法相关的功能Python在处理数据分析、算法测试时的便利性优势非常突出。我个人见过太多因为后端语言不熟光配置文件就折腾一个月的案例。所以这里务必量力而行。数据库MySQL是绝对的主流。如果项目中的数据关系比较复杂比如用户、订单、菜品、评论、推荐之间的关联关系传统的关系型数据库处理起来不仅逻辑清晰而且后续写SQL做统计报表也方便。需要缓存用户登录态或热门菜品数据时再引入Redis作为补充即可。推荐算法实现这一步可以放在后端单独写成服务模块或脚本。至于推荐算法本身怎么选下一节详细展开。注意技术选型不是让你去追新奇的框架而是要在“你掌握了”和“项目需要”之间寻找一个平衡点。用自己熟练的技术栈把业务功能做得完整、稳定比用一堆花哨但不熟练的技术最终做成一团浆糊要强得多。2. 个性化推荐算法落地这个项目的灵魂做好这步就成功了一半外卖配送系统这么多大家拼的就是谁更懂用户。个性化推荐模块就是要告诉评委我的系统不是死板的“菜品展示柜”它“认识”每一个用户。2.1 推荐算法的核心思路基于用户的协同过滤在众多推荐算法中最合适、也最容易向评委讲清楚的就是基于用户的协同过滤User-Based Collaborative Filtering。核心思想就一句话与你口味相似的人喜欢的菜你大概率也会喜欢。具体流程拆解下来就是以下三层构建“用户—菜品”评分矩阵这个矩阵是算法的“原始素材”。构建方法一般有两种一种是用户主动给菜品评分1-5星这种数据最直接但缺点是数据稀疏用户很少主动打分另一种是隐性评分比如根据用户的下单次数、浏览时长、加购行为等通过一套规则转换成评分。比如用户下单过某个菜品记5分浏览过详情页超过10秒记3分仅仅是列表页划过记1分。这种隐性评分的数据量要远比显性评分大得多对算法效果也更有利。计算用户之间的相似度。这是算法的核心数学步骤。常用的公式有余弦相似度、皮尔逊相关系数等。以余弦相似度为例公式大致是similarity A·B / (|A|×|B|)也就是把每个用户的评分向量看作高维空间中的一个点计算两个点之间夹角的余弦值。余弦值越接近1说明两个用户的评分习惯越相似品味越接近。生成推荐列表。找到与当前用户最相似的K个用户比如K5把这5个用户最喜欢的菜品评分高、点击多中当前用户没有吃过或没见过的菜品挑选出来再按照相似度加权计算一个“预测评分”按预测评分从高到低排序取Top-N比如前10个展示在首页推荐板块。这套流程下来你的系统就有了“千人千面”的基础用户A和用户B打开小程序看到的推荐菜品列表是不同的。而且随着用户行为数据增多推荐会越来越准这个点在答辩时非常加分的你可以大讲特讲。2.2 冷启动问题与优化策略新用户怎么办推荐系统在真实场景下会遇到一个大难题也是答辩时评委很爱问的问题冷启动。就是说一个全新用户你没有任何他的历史行为数据协同过滤算法无从算起。看到他的请求推荐模块如何响应这里提供三种由浅入深的解法你可以按需选用基于热门度的推荐兜底。新用户第一次打开时直接把全站下单量最高、评分最好的Top-10热门菜品推荐给他。这是最简单有效的方法保证用户第一眼不觉得“冷”。基于物品内容的特征推荐。适当引入菜品的标签属性比如“辣度中辣”“食材鸡肉”“口味酸甜”新用户即使没点过单但如果在注册或首次进入时勾选过偏好比如“我喜欢吃辣”系统就可以直接根据标签匹配推荐相关菜品。对用户分群推荐。联合用户注册时填写的地区、学校/公司等基础信息将用户大致分群给同群用户推荐该群热门的菜品。实际操作建议:你在论文和答辩PPT里不需要三个方法全部实现。把“基于热门度的兜底”写进代码里跑通然后在讲“冷启动”这个问题时提出另外两种思路作为“后续优化方向”既可以展示你对系统的深入思考又为你省下了一些不必要的编码工作量。2.3 算法代码的工程化封装别把算法库直接堆在Controller层这一小节算是实操经验。很多同学写了算法喜欢把所有的相似度计算逻辑全部写在Controller的某一个接口里这样代码看起来非常臃肿也不利于测试和后续修改。我强烈建议你这样分层写单独抽出recommendation_service.py或RecommendationService.java这一个服务类。这个服务类对外暴露一个getRecommendations(userId, limit)方法返回一个推荐菜品Id列表。算法内部再细分为buildUserItemMatrix()构建矩阵、calcUserSimilarity()计算相似度、generateRecList()生成推荐列表三个私有方法。这样做的好处非常直接第一你的推荐逻辑主体专注做推荐跟订单模块、用户模块的耦合度降到了最低出了问题只需要在这个类里排查。第二如果以后你想换一种推荐算法比如从基于用户换成基于物品或者换成基于内容的推荐你只需要重写这个算法服务类的内部代码对外的接口丝毫不用变完全不影响其他模块的正常工作。这就是模块化设计的意义在答辩时也可以作为项目亮点来说。3. 系统核心功能架构与关键模块拆解功能不全等于白做这部分我要提醒的是很多人的毕设里功能看着齐全但都是在“演示层面”转圈一深究就露馅。这里把外卖点餐系统必须回答清楚的核心模块和关键逻辑给你盘一盘。3.1 用户端与商家端功能怎么拆用户端做的是“点餐闭环”功能最好参照美团外卖、饿了么的流程来规划按顺序是以下五个环节首页展示除了推荐菜品入口还需要有基于地理位置的门店筛选功能可以通过wx.getLocation实现做不了精确的LBS也用模拟数据顶上去、公告信息、轮播图等。菜品浏览页这里要特别注意列表的加载性能尤其是菜品图片比较多时建议使用小程序自带的懒加载机制并对图片进行压缩处理免得一个页面要等好几秒才加载出来观感很差。可以按菜品分类做tab切换。点餐与购物车这是一个高频使用的功能痛点在于业务规则多。比如“起送价”限制、“配送费”计算逻辑满免配送费等、商家的营业时间判断、菜品口味和规格大份/小份、辣度的选项等。这些细节直接决定了你的系统“像不像真的”。订单生成与支付模拟支付还是真实接入微信支付我给你的建议是做毕设首选“模拟支付”也就是点击支付按钮后程序假装调起收银台直接修改订单状态为“已支付”。这样省去申请商户号、配置支付证书、回调验签这些既繁琐又容易踩坑的环节还避免审核问题。你可以把微信支付V3的对接原理、流程在论文和答辩里作为“下一步计划”或“系统难点”进行陈述效果一样很好。如果老师要求必须有真实支付再考虑接入沙箱或真实商户号快捷实现。订单评价与历史订单这是个性化推荐模块取数的重要来源尽量让用户评价时提供“口味评分”和“配送速度评分”等额外选项这些结构化数据后期对算法训练很有价值也是你推荐系统的一个重要特色。商家端往往是被忽略的部分。其实做个“简化版”后台就行核心功能包括菜品管理上架、下架、改价、改图、订单管理接单、出餐、完成、基本信息设置营业状态、公告。注意权限隔离商家端绝不能看到别的商家的数据这是基本底线。3.2 管理员端与数据库设计数据模型的表怎么建管理员端不用做得很花哨但至少有一个查看维度的数据面板比如今日订单总数、今日销售额、用户增长趋势、热门菜品排行。图表折线图、柱状图建议使用现成的开源图表库如ECharts的微信小程序版通常很快就能出效果。这一块的实操重点我把数据库的表结构核心字段给你关键地点一下用户表 (user)用户主键id、微信openid唯一标识用于静默登录、昵称、头像、地址、注册时间等。商家表 (merchant)商家id、名称、起送价、配送费、公告、营业时间、评分等。菜品表 (dish)菜品id、所属商家id、菜品名称、描述、图片url、价格、分类如“热菜”“凉菜”“主食”、销量、库存等。订单表 (orders)订单id、用户id、商家id、订单金额、配送费、总金额、收货地址、订单状态待支付/已支付/已接单/配送中/已完成、下单时间等。订单项表 (order_item)订单明细id、订单id、菜品id、菜品名称冗余字段防止菜品改名后历史订单无法还原、单价、数量、小计。评分表 (rating)评分id、用户id、菜品id、评分值、评论文案、创建时间。用户行为日志表 (user_behavior)用于推荐系统取数的记录用户id、菜品id、行为类型浏览、加购、下单、行为时间。4. 完整实操过程记录从“零”到“能跑”的保姆级指引这里我只能给你一个最直接、最有效的实操顺序因为毕设时间非常宝贵容不得你走太多弯路。4.1 环境准备与创建基础工程我默认你有一台能联网的电脑已经想清楚了后端到底用什么语言。以“前端原生小程序 后端Spring Boot MySQL”为例的口径环境准备阶段做完这几步就行本地环境装好JDK 1.8、Maven或Gradle构建依赖工具、MySQL数据库、Navicat/DBeaver数据库可视化工具、微信开发者工具去微信公众平台官网下载稳定版。新建工程模板后端直接用 Spring Initializr 网站快速生成一个Spring Boot 工程骨架勾选Web、MyBatis、MySQL驱动依赖。前端在微信开发者工具里新建项目时选择“不使用云开发服务”建立基础目录结构。调试一切从简把微信开发者工具的“不校验合法域名”选项勾上本地调试必备后端写好一个简单的/api/hello接口前端用一个wx.request去调用它看到数据打通了再继续往下走。4.2 后端接口开发的合理顺序开发后端代码切忌从“用户模块”开始往下写因为用户模块不值得调试纯浪费时间。我建议按业务闭环的顺序来起步阶段先横切系统把公共响应体结构code、msg、data和后端统一异常处理写好避免每个接口返回乱七八糟的数据。这一步很不起眼但极大影响后续联调效率。第一阶段先做“菜品查询”和“商家查询”相关的接口。因为前端页面一旦加载最先请求的就是这些接口。把列表和详情返回给前端后你就能用假数据在页面上看到东西了。第二阶段做“模拟登录”。小程序端通过wx.login拿到 code发给后端后端向微信服务器换openid再从本地数据库查找该用户是否存在若不存在则在库里为用户创建一条记录再返回一个自定义的登录态token给前端保存。这是后续用户识别的基础。第三阶段做“购物车”和“确认订单”接口。这两个接口依赖登录态。购物车其实不用存数据库纯前端维护一个状态就行确认订单要校验菜品库存和起送价。第四阶段做“订单创建”和“模拟支付”接口。创建订单时需要把订单主表和订单项子表的数据一起写入。模拟支付接口就是更新订单状态为“已支付”。第五阶段做“订单查询”和“评价提交”接口。用户端“我的订单”列表用得到评价提交接口把评分写入到rating表给推荐算法供数。最后阶段把商家端和管理员端的简单CRUD增删改查补齐。4.3 前端页面開發与接口对接前端开发同样有方法。从大类上说可以用微信开发者工具的“小程序模板”自己创建视图文件即可。核心技巧就一句话先做静态页面再造动态数据。拿首页举例先不听接口直接把菜品名称、价格、图片先用硬编码数据写死在WXML里渲染出大概的页面布局看看排版是否合理。再切换到JS文件的data里定义几个假变量让页面通过{{ }}模板语法渲染出来。最后把data里的假值换成通过wx.request向后端发请求拿到的真实数据。分这三步走前端每一步的边界都特别清晰排查问题也容易。特别提醒:微信开发者工具的Console面板里如果报401多半是你的请求没有带上登录态headertoken。如果报TypeError: Cannot read property xxx of undefined多半是后端返回的数据结构和前端预期的不一致先去后端接口文档或直接看后端返回的JSON结构对照不要在前端无脑排查。4.4 远程调试时的常见流程既然你标题里提到了远程调试这一节就再展开一下。很多同学是组队做的毕设或者自己电脑系统有问题需要让异地朋友帮忙查看并修改代码。此时“远程调试”不等于“把工程打包发过去让他改”那样效率太低。合理流程是在本地把整个后端工程的压缩包不包含target构建目录和数据库存放目录发给远程协助者。在本地把数据库结构文件.sql导出一起发给他让他导入到他的MySQL里。本地启动后端服务端口默认8080配合Ngrok、花生壳或者局域网穿透工具如果只是局域网直接用电脑的IP地址访问即可生成一个公网访问地址。远程协助者用这个公网地址替换小程序里的request的 baseUrl就能访问到你后端的接口。如果只是“远程看代码”更简单用腾讯会议或向日葵的屏幕共享功能两个人都能同时在屏幕上看到对方的代码一边看一边沟通即可。5. 项目调试、安全规范与避坑指南这些坑我提前帮你踩了这部分可能是全文最容易让你少走几个月弯路的内容。光会写代码不够关键在于知道哪些地方藏着雷。5.1 绕过微信小程序的“后台域名校验”本地开发阶段你直接用http://localhost:8080作为API请求地址微信开发者工具会报“不在合法域名列表”。解决方法是打开微信开发者工具 - 右上角“详情” - “本地设置” - 勾选“不校验合法域名、web-view业务域名、TLS版本以及HTTPS证书”选项。这样你做本地测试就畅通无阻了。但请务必记住这只是开发阶段的“作弊”手段。小程序上线发布或真机预览时如果你还是直接请求HTTP地址会被微信拦截。真正的生产环境部署后端必须绑定备案过的HTTPS域名然后在微信公众平台的“开发管理”-“开发设置”-“服务器域名”里配置好request合法域名。5.2 微信支付的一个大坑与处理思路我看你热搜词里反复出现“微信支付v3对接”和“由于小程序违规,支付功能暂时无法使用”这两个关键词估计是卡在这个环节上了。这里必须说清楚微信支付对个人主体小程序是不开放支付接口权限的。如果你的主体是个人的即便你把支付逻辑写得天花乱坠上线后也无法真实收款。正因如此“模拟支付”几乎是所有学生毕设的必经之路。怎么模拟才显得专业不要只是简单地把状态从“待支付”改成“已支付”就结束了。可以做一个模拟支付确认弹窗展示“支付金额”“支付方式微信支付/余额支付”然后为了更逼真还可以做一个“收银台”动画效果。支付回调成功后更新订单状态并在页面跳转时给用户一个“支付成功”的反馈体验。这样虽然没接微信支付但在流程和交互上无可挑剔。5.3 小程序端常见疑难杂症的应急处理这里整理几个你在开发过程中非常容易碰到的问题热搜里也频繁出现直接给结论和解决方案问题现象排查思路解决方案wx.request请求返回fail域名未校验、本地服务未启动、跨域未解决后端未配CORS依次排查勾选“不校验合法域名”- 启动后端 - 后端加CORS配置类顶部导航栏高度计算错误未考虑不同机型的“刘海屏”状态栏高度不一致使用wx.getSystemInfoSync()获取状态栏高度用CSS的calc(100% 高度)动态计算导航栏高度蓝牙打印小票乱码蓝牙打印指令集转换错误传给打印机的数据需转换为GBK编码的字节流不能直接用UTF-8小程序内嵌H5页面左侧返回箭头消失原生导航栏与H5页面的返回逻辑冲突通过在web-view页面使用wx.navigateBack或 H5侧主动监听历史记录实现返回swiper组件内嵌video导致全屏错位video是原生组件层级和渲染方式不同于普通组件使用小程序官方提供的cover-view和cover-image覆盖或者适当调整swiper结构规避原生组件的层级限制6. 答辩展示与文档撰写要点让你从“做完”到“讲完”写代码是体力活答辩是脑力活。很多代码能力不错的同学一到答辩话就说不清楚。以下几点你务必提前准备好。6.1 让评委眼前一亮的演示思路演示环节切忌照着页面念“这是首页这是订单页”。你要把自己的项目当成一个产品来讲故事。你可以这样组织演示流程第一步展示问题先说“传统外卖点餐系统对每个用户展示的内容完全一样导致用户很难快速发现喜欢的菜品”。这就是你的项目要解决的问题。第二步展示系统能力演示注册一个新用户进入系统首页立刻看到冷启动推荐的热门菜品然后模拟这个用户多次下单、收藏、评分后退出登录再重新进入发现首页推荐的菜品已经发生了变化向这个用户的偏好偏移了。第三步展示技术深度打开数据库展示user_behavior表中的行为记录变化再打开后端日志或调试窗口展示算法模块运行的状态和推荐结果变化。这一步是为了证明代码是你自己写的而不是单纯搭了个静态网页。6.2 论文撰写时的技术难点怎么形容才算到位毕设论文的核心不是堆砌功能而是突出你“为什么要这样做”。推荐算法这一章务必写清三个小节算法对比选型比较基于用户的协同过滤、基于物品的协同过滤、基于内容的推荐这三种算法的优缺点并说明你选择基于用户协同过滤的理由。理由可以是“餐饮场景下用户口味相似性比物品内容相似性更有参考价值”。冷启动处理策略单独拿出一小节论述热门推荐、偏好问卷等策略如何解决新用户无行为数据的问题。算法效果评估这块比较容易忽略但其实很加分。你可以离线划分一部分历史数据用来做评估。简单来讲把真实点击/下单行为的Top-K推荐命中率做一个简单统计比如用户点了10个菜系统能命中6个就是60%的命中率但即便只有一个粗略数字也比“推荐效果好”这种空话扎实得多。最后再提一嘴如果做项目的过程中遇到卡壳的地方一定不要死磕超过两天。先放下代码出去走走或者去问同学回来往往会有新思路。毕设的时间管理拼的不是你能熬多少夜而是你的高效推进能力。祝你早日完成答辩顺利。