资讯详情

微信小程序点餐外卖源码拆解:从前后端架构到上线避坑

📅 2026/10/17 6:42:10 | 华诺云谱 👁 阅读
微信小程序点餐外卖源码拆解:从前后端架构到上线避坑
简介面向餐饮行业的微信小程序点餐外卖项目适合小程序开发者、餐饮商家及想快速搭建线上点餐系统的技术团队使用。该资源提供开箱即用的完整方案覆盖在线点餐、外卖对接、叫号排队、微信支付、配送管理、用户账号、数据分析、API接口、推送通知等核心模块可帮助理解小程序前后端协作模式并在此基础上定制自己的业务需求。压缩包共521个文件约839KB包含137个js、108个wxss、104个json、102个wxml、44个wxs等分别对应逻辑处理、页面样式、配置数据、结构布局与数据处理脚本另有png图标、license与说明文档目录结构清晰便于快速定位源码。目前已有314人学习下载。对于需要快速掌握微信小程序完整业务流程的开发者该包提供了从界面到后端接口的可直接运行的参考实现尤其适合在餐饮场景下进行二次开发或学习实践。1. 微信小程序点餐外卖开箱即用到底省了哪些事微信小程序点餐外卖这套资源把门店菜单、购物车、下单、支付、配送、订单管理串成了完整闭环而且前后端代码都是现成的。我拆包检查后发现它不是那种只有页面没有逻辑的演示版而是可以直接启动、真机预览、替换商家信息后上线的完整工程。对你来说它至少省下两周从零设计数据表和对接微信支付的开发量。适合三类人手上同时接了好几个私活的独立开发者、刚入门但想看到完整工程长什么样的小程序学习者、以及急着给客户做餐饮外卖方案的外包同学。不过开箱即用不等于零坑接下来的几章我会把导入、联调、上线前后的坑一条条列出来你自己动手时就能避开。2. 资源包解剖前后端目录、接口约定与数据库设计2.1 前端小程序目录页面、组件、工具函数怎么划分这套资源的前端用的是原生微信小程序没有套 uni-app 或 Taro最大好处是依赖少、调试直观拿到代码直接用开发者工具打开就能看效果。根目录下分四个部分app.js、app.json、app.wxss 是全局入口pages 目录按业务拆成首页、菜单、购物车、订单列表、订单详情、个人中心六个页面components 目录放商品卡片、数量步进器、购物车栏、空状态组件utils 目录统一管理请求封装、鉴权、价格格式化函数config 目录放不同环境的接口地址。第一次看这个目录分配时我觉得挺合理首页同时承担了点餐台的功能因为餐饮场景用户进店第一眼就是菜单把菜单塞进二级页面是反直觉的。商品卡片组件是重点。它接收商品对象内部渲染图片、名称、价格、加号按钮并通过事件把加购意图抛给父页面。这个设计的价值在于菜单页、搜索页、套餐详情页都可以复用同一套视觉和交互改样式只动一处。数量步进器组件则负责购物车里的加减操作它内部维护 count并通过 triggerEvent(change, count) 通知外部。真正需要小心的不是组件本身而是商品数据里的价格字段——资源里统一用的是“分”不是“元”组件展示价格时会调 utils/price.js 格式化成两位小数。这一点我在多门店改造时又踩过一次单位换算的坑后文会讲。utils/request.js 是整个前端的数据通道它对 wx.request 做了一层 Promise 化封装。核心逻辑就是把登录后拿到的 token 注入请求头统一处理 401 跳转登录、500 弹出错误提示并让调用方用 async/await 写业务代码。这个封装里有一个容易被忽略的细节接口返回的 data 字段可能是字符串也可能是对象因此函数内部会先做一次 JSON.parse 的兼容处理。如果你要拿这份资源做二次开发建议先看懂这个函数再动手否则后面每调一个新接口都容易在数据格式上翻车。类似这样的底层公共函数我的习惯是先把入参出参打印出来跑一遍确认 data 实际类型后再写业务。2.2 后端接口与数据表一份订单从手到仓库的流转后端部分用的是 Node.js 的 Express 框架路由和控制器分开数据库用 MySQL整个后端目录约二十个文件。接口路径按业务域划分包括登录、菜单、购物车、订单、支付回调、地址管理。以一套点餐流程为例前端先调 POST /api/user/login 用 code 换 openid换到 token 后存进 storage用户点菜时调 POST /api/cart/add 把菜品和 sku 选项写入购物车表结算时调 POST /api/order/create 创建订单并返回 order_no支付调 POST /api/order/pay 下单支付参数微信回调再走到 POST /api/order/callback。这套接口命名是典型的 REST 风格动词都在 HTTP 方法上资源路径用名词复数前后端对起接口来比较省事。数据表设计里最核心是 user、menu、cart、orders、order_item 五张表。user 表不存手机号和密码只存 openid、昵称、头像符合微信生态的登录方式。menu 表除了常规的 name、price、image 外还有 category_id、stock 和 sku_config 三个字段。category_id 用于菜单分类展示stock 是库存sku_config 是一个 JSON 字段用来存类似“辣度不辣/微辣/中辣”的扩展选项。orders 表除了订单号、用户 ID、金额、地址 ID 外最关键的是 status 字段用数字表示状态0 待支付、1 待接单、2 配送中、3 已完成、-1 取消。order_item 表存下单时的商品快照包括当时的价格和 sku 描述避免菜品改价后历史订单显示错乱。数据库初始化脚本放在 server/database/init.sql 里里面除了建表语句还预置了十几个测试菜品和一条管理员账号。导入时直接执行脚本即可。一个小提醒menu 表的价格字段是 INT单位是分别在业务代码里把它当成元来用否则会出现 28 元的菜显示成 2800 元的离谱事故。这种单位玄学我之前就栽过后面会展开。实际上只要你在所有涉及 money 的地方统一走 utils/price.js就能避开绝大部分单位问题。2.3 配置中心一份配置切换开发、测试、生产环境这份资源在 config 目录里放了三份环境配置分别面向开发、测试、生产并用 config/index.js 根据当前环境变量导出对应配置。配置项包括 baseUrl、appid、mchId商户号、payNotifyUrl支付回调地址和 locationKey位置服务 key。这种设计的好处是本地联调用 dev 配置接口地址指向 http://127.0.0.1:3000发布体验版时切到 test 配置指向测试环境域名正式上线再切 prod。切换方式不是手动改文件而是通过小程序自定义编译条件里的环境变量来指定这样不同角色可以共用一份代码而不互相踩配置。但这里有个边界问题要注意微信小程序的 wx.request 请求域名必须是 HTTPS 且在后台完成校验所以 test 和 prod 的 baseUrl 必须是已经配置好的合法域名。dev 环境只是本地用给了我们绕过域名校验的机会——在开发者工具里勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”即可。这并不意味着上线也能这么干正式版一旦校验失败所有请求都会直接白屏用户在“开发版/体验版/正式版”三个入口看到的表现完全不同。合理的工作流是本地用 dev 本地后端体验版用 test 测试环境域名正式版用 prod 官方 HTTPS 域名三套配置各司其职。配置中心还有一个容易忽略的参数wx.login 的登录态过期时间。资源里默认 token 有效期是 2 小时但实际餐饮场景用户可能点完餐放了好久才结算2 小时后 token 过期会导致下单失败。我在二次开发时会把 token 有效期拉长到 7 天同时在后端刷新逻辑里做自动续期这部分不属于开箱即用范围但值得你提前留意。总之配置中心的价值是让环境切换不再依赖改代码你只需要在编译时注入一个变量剩下的交给 config/index.js 去读。3. 把项目跑起来导入、启动、真机预览三步走3.1 导入项目AppID、项目名、目录选择的正确姿势把资源解压出来后用微信开发者工具选择“导入项目”项目目录要选到包含 app.json 的那一层而不是外层总目录。很多新手一顺手选了外层目录结果工具报“找不到 app.json”还以为资源有问题。AppID 先用测试号就行不需要注册企业主体如果手头有个人开发者的 AppID也可以直接填。唯一要注意的是项目导入后开发者工具会根据 project.config.json 里的 appid 读取所以如果你的测试号和个人 AppID 不一致记得在 project.config.json 里改 appid而不是只在弹窗里输一遍。导入完成后第一个现象是模拟器里会出现首页页面和顶部 tabBar但所有接口请求都是失败状态这是正常的因为后端还没启动。此时打开调试器 Console能看到类似 “request:fail url not in domain list” 的报错。别慌这不是代码 bug而是开发者工具默认校验域名。按这个顺序操作详情 - 本地设置 - 勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”然后重新编译请求就能发出去了。这一步我几乎每次做小程序项目都会先操作已经形成了肌肉记忆。如果把这次导入经历拆开看还有一个小坑如果你本机同时安装了多个版本的开发者工具默认打开项目可能用的是旧版本而旧版本对 ES6 转 ES5 的支持和新 API 的兼容性不一样。建议使用稳定版工具并在详情 - 本地设置里勾选“ES6 转 ES5”避免在 iOS 真机上遇到“function not defined”之类的诡异报错。我的标准流程是导入前先看一眼 README 要求的工具版本这个资源在 README 里写了基础库最低版本照着设置就行。3.2 后端启动数据库初始化与接口联调后端启动分三步装依赖、建库表、跑服务。先打开终端进到 server 目录cd server npm install npm run dev如果项目里已经锁定了依赖版本npm install 通常一分钟内完成。遇到 node_modules 安装失败多半是网络镜像问题可以换成国内 npm 镜像再装。数据库初始化是重头资源里已经给了 init.sql我一般这样执行mysql -u root -p database/init.sql # 初始化后用 mysql 客户端确认表是否创建成功 mysql -u root -p -e use takeout; show tables;执行完会看到 user、menu、orders 等表都已经创建好菜单表里也有测试数据。接下来修改 server/config/config.js 里的数据库连接信息把用户名、密码、库名改成你本机的实际值。我遇到过最典型的报错是 ER_ACCESS_DENIED_ERROR原因就是密码写错或账号没授权还有一种是服务启动成功后查不到数据十有八九是连错库了init.sql 建的库名和你配置文件里的库名不一致仔细核对一下就行。接口联调时先用 Postman 测两个关键接口登录和菜单列表。登录接口传一个 code 参数后端拿 code 去微信服务换 openid这一步没真机构造不出来有效 code所以资源里做了一个 mock 分支当 code 为 test 时后端直接返回一个写死的 openid 和 token。这对本地开发非常友好。我建议你第一次联调时就切到 mock 分支把整条链路跑通后再放开真实微信登录否则光卡在 code 换 session 上就能耗半天。后端服务默认监听 3000 端口启动日志会输出 “server running at port 3000”。如果端口被别的服务占用资源里是写活端口号的你在 config.js 改一下参数再重启即可。这里有一个容易忽视的关联前端配置文件里 baseUrl 的端口必须和后端监听的端口一致否则会请求 404。我在一次乱改端口后前端调不通排查了半天才发现两个端口没对上这类低级错误往往最费时间。现在我会在启动后端后先 curl 一下健康检查接口再决定要不要继续看前端。3.3 真机预览域名校验与调试开关本地模拟器跑通之后下一步是真机预览。微信开发者工具顶部的“预览”按钮会生成一个二维码手机扫码后可以打开小程序。但如果你后端跑在本机手机访问不到 127.0.0.1这时需要让手机和电脑连同一个局域网然后把前端配置里的 baseUrl 改成电脑的局域网 IP比如 http://192.168.1.100:3000再重新编译预览。预览版默认不校验域名前提是手机上打开了“调试模式”这个开关在微信小程序里点击右上角菜单选择“开发调试”或新版里的“打开调试”。真机上最常见的两个问题分别是白屏和请求超时。白屏多数是基础库版本低于项目最低要求解决方法是把调试基础库调到与开发者工具一致的版本请求超时则基本是 IP 不通先在电脑上 ping 一下手机的 IP再判断前端配的 IP 是不是电脑实际拿到的局域网地址。很多人电脑同时插了网线和 Wi-Fiipconfig 会显示好几个 IP选 192.168 开头那个有线网段的地址往往才是手机能访问的地址。这里还要补充一个关于“开箱即用”的细节资源里的 locationKey 是给门店定位用的如果演示环境没有申请对应 key真机上点击定位会弹“定位失败”。这不算 bug是第三方服务的 key 只对开发者自己有效。你在真机预览前最好把 locationKey 换成自己申请的腾讯位置服务 key否则门店定位功能就是个黑匣子报错信息也不直观。把 key 换好后复位真机预览定位弹窗和应用内定位提示会重新走一遍授权流程确认无误再进入下一步。4. 核心业务链路拆解菜单、购物车、订单状态机与支付4.1 菜单与SKU一套数据模型覆盖单品和套餐菜单模块的核心逻辑集中在 menu 表和前端菜单页。menu 表有一个 category_id 字段用于分类前端首页顶部是一排分类 tab点击后菜单列表联动过滤。商品卡片组件会根据商品类型判断是否展示“加购”按钮单品直接加购套餐则弹出一个 SKU 选择层比如选辣度、加料然后点“加入购物车”。这套交互在餐饮外卖场景里很常见资源里是用 sku_config JSON 字段实现的数据结构大致如下{ spicy: { name: 辣度, options: [不辣, 微辣, 中辣] }, extra: { name: 加料, options: [加卤蛋, 加牛肉, 不加] } }前端拿到这个 JSON 后动态渲染选择面板用户选中的每个选项都记录成一个唯一的 sku 标识比如“辣度-微辣|加料-加牛肉”。这个标识会随着加入购物车传到后端作为订单项的一个属性存到 order_item 表。很多初学小程序的开发者会忽略 SKU 校验后端只校验菜单 id不校验 sku 组合导致用户可以不选任何选项直接下单或者选了一个不存在的组合。正确做法是后端在订单创建时把 sku_config 里的合法组合读出来做一次组合校验这算是我做多个点餐系统总结出来的血泪经验。套餐的处理方式和单品略有不同。套餐在 menu 表里是一条记录其 price 是聚合价但下单后菜品快照需要把套餐拆成多个子项方便后厨分别做菜。资源里 order_item 表在写入套餐时会把所有子项展开成独立记录同一订单共享同一个 order_id并通过一个 parent_id 字段标识套餐头。这样设计有个好处历史订单无论后续菜单怎么变都能完整呈现当时买的组合。坏处是查询订单详情时要把平铺的记录重新聚合回套餐所以订单详情页里有一段树形结构重组逻辑看代码时不要把它当成冗余数据。4.2 购物车计算前端实时总价与后端价格校验购物车放前端还是后端是这类资源最纠结的点。这份资源选的是后端存储用户加购时实时写 cart 表。优势是换设备购物车不丢劣势是每次加减都要发请求弱网下体验不好。真实生产环境我见过混合解法前端本地存一份用于渲染后端存一份用于结算前端启动时跟后端做一次 merge。但如果你只想快速跑通资源原装方案完全够用。实时总价计算我一般会写成一个纯函数放在 utils/cart.js 里因为购物车页和结算页都要复用。价格单位是分所以循环累加时用整数加法避免浮点误差。前端展示用 price 函数除以 100 并保留两位小数。注意微信小程序里 JS 的 Number 类型精度有限金额一旦超过 2^53 分才会出问题但对餐饮场景来说完全不用担心。后端在订单创建时不会直接信任前端提交的 totalPrice它会把购物车里的明细重新读取一遍按当前 menu 表的价格和购买数量计算总价再和前端提交的金额做对比误差超过 1 分就往返回错。这一步是防止用户绕过前端直接改请求体里的金额非常重要。购物车加减还有一个隐藏问题库存不足时的提示。资源里的购物车添加接口会先查 menu 表 stock 是否大于当前购物车数量如果不够直接返回错误提示。这属于乐观校验真正的强校验在下单时做。如果你在页面里疯狂点加号后端接不住压力最好在组件里加一个防抖比如 300 毫秒内只发最后一次加购请求。这一点资源没有做我通常会自己补上毕竟一个加号连续点十下有十个请求打到后端虽然是小程序也照样会被限流。4.3 订单状态机从待支付到已完成的状态流转订单状态机是整份资源里最值得抄作业的部分。status 字段的数字定义、转移条件和谁有权限触发转移在后端统一管理。把它梳理成一张表当前状态触发动作下一状态触发方0 待支付用户支付成功回调1 待接单微信支付回调0 待支付用户手动取消-1 取消用户0 待支付超时 30 分钟未支付-1 取消定时任务1 待接单商家接单2 配送中商家后台2 配送中骑手完成配送3 已完成骑手/商家2 配送中用户申请退款并审核4 退款中用户商家这张表的价值在于它能让你一眼看出状态流转是单向的绝不是前端想改就改。资源里后端做了一个公共函数 updateOrderStatus(orderId, fromStatus, toStatus)每次更新都要求传入当前状态用 UPDATE ... WHERE status fromStatus 做乐观锁如果 affectedRows 为 0 说明状态已经被别人改过直接返回冲突错误。这样避免了用户同时点“取消”和“支付”导致状态被覆盖成新值的竞态。超时未支付自动取消这一条资源用了 setInterval 轮询数据库每 5 分钟查一次待支付且创建时间超过 30 分钟的订单批量置为取消。这种逻辑简单直观但生产环境更推荐配合微信支付回调来兜底。如果你只拿这套资源做演示轮询完全够用如果真要上线建议把订单超时任务换成定时队列或延时消息避免数据库轮询在高并发下把 CPU 打满。优先保证状态机本身的正确性超时策略可以后续再优化。4.4 支付回调与库存扣减并发场景下的数据一致性支付这块资源在 test 环境里内置了一个模拟支付接口本地调试不用真付钱输入一个假支付方式即可回调成功。真实环境替换成微信支付统一下单即可商户号和回调地址都在配置中心。关键在回调处理器微信服务器会对支付结果回调你的 notify 地址后端必须先校验签名再更新订单状态最后给微信返回成功标志。如果后端处理失败微信会重复回调所以回调函数必须实现幂等即同样的订单重复收到回调不会重复扣库存或重复加余额。库存扣减是最容易出并发 bug 的地方。我见过不少项目先查库存再判断是否足够最后 UPDATE 扣减看起来逻辑没问题但两个请求同时读到 stock1都会通过判断最后把库存扣成 -1。正确的做法是用一条 SQL 完成“条件扣减”UPDATE menu SET stock stock - 1 WHERE id ? AND stock 0;然后看 affectedRows 是否为 1如果为 0 说明库存不足下单失败。这份资源在订单创建时用的就是这种方式所以并发一致性有基本保障。但它在支付回调里又扣了一次库存需要仔细看资源里库存扣减是在创建订单时就扣减支付回调时不再扣减只更新状态如果超时未支付释放库存。这个设计是对的预占库存可以防止超卖释放逻辑在取消订单时实现。我做二次开发时还会把一个容易被漏掉的问题补上未支付订单保留的库存应该在用户取消或超时后立即释放而资源里超时释放依赖轮询任务最坏延迟 5 分钟。如果有爆款菜品用户下单后超时不付这 5 分钟内库存是虚低的。你可以把释放库存的逻辑也放进订单查询接口每次查询待支付订单时顺带把超时的订单取消掉并释放库存这样既不用额外任务又能及时释放。这个技巧在活动大促场景下特别有用。5. 常见问题与避坑从白屏到少扣库存的五个案例5.1 导入与启动阶段的踩坑记录第一坑导入项目后模拟器白屏Console 报 “app.json: not found”。现象是整个窗口只有空白文件树里看不到页面。一开始以为是项目没解压完后来发现是导入目录选错位了选到了仓库根目录而小程序的根目录是 miniprogram 子目录。原因就是资源包解压后包含了后端、数据库、文档只有 miniprogram 目录才是小程序工程根目录。解决方法是重新选择导入目录定位到包含 app.json 的目录重新编译后页面恢复。这个坑对不熟悉全套仓库结构的同学来说非常高发。避免办法也简单在导入前先看一眼项目的 README 或目录树找到小程序根目录再下手。第二坑后端依赖安装时报 ERESOLVE unable to resolve dependency tree。现象是 node_modules 装到一半中断控制台一大片红色。原因是本机 Node 版本过高或者 npm 版本带的依赖解析规则变了导致部分老依赖冲突。解决方法是升级依赖包或把 Node 版本降到 v14 LTS更快的临时方案是使用 npm install --legacy-peer-deps 跳过冲突校验。这个项目本身依赖简单用 legacy 方式几乎都能装上但要注意别一直依赖这个参数长期还是需要统一 Node 版本。我习惯在项目里维护一个 .nvmrc 文件指定 Node 版本换机器部署时直接 nvm use省得每次踩依赖冲突的雷。5.2 联调与真机阶段的踩坑记录第三坑接口请求全部返回 404开发者工具里 Response 是 HTML 而非 JSON。现象是菜单页能渲染但所有请求都报 404。原因是后端服务虽然启动了但请求路径里带了多余前缀或者端口不对。我那次是因为前端的 baseUrl 写成了 http://localhost:3000/api而后端路由本身已经挂载在 /api 下结果拼成了 /api/api/user/login。解决办法是把前端配置里的 baseUrl 改为 http://localhost:3000让后端路由自行拼 /api 前缀。排查思路是看 Request URL如果出现 /api/api 就能一眼发现问题。第四坑真机上点击定位按钮一直转圈最终弹“定位失败请确认已开启手机定位权限”。现象是开发工具里定位正常真机上失效。原因是 app.json 里没有声明位置相关 permission 弹窗提示导致 wx.getLocation 被微信拒绝调用另一个常见原因是 locationKey 用的是资源自带的示例 key没有换成本人的腾讯位置服务 key。解决方式分两步在 app.json 的 permission 字段里加上 scope.userLocation 的用途说明在 config 配置里替换成自己的 key并确认这个 key 在小程序后台的“位置服务”里和当前 AppID 已绑定。如果还不行检查手机微信的隐私权限有没有打开“位置信息”。这个问题我每做一个新小程序都会遇到一次所以现在导入项目后的第一件事就是检查 permission 声明。5.3 上线与并发阶段的踩坑记录第五坑并发下单后数据库里的库存变成负数。现象是运营在后台看某个菜品库存为 -2但下单量看起来不大。原因是创建订单接口用“先查 stock再判断再 update”的方式扣库存两个用户同时买最后一件商品时两个请求都读到了 stock1双双通过判断最终扣成了 -1。解决方法是改成条件更新 SQL并检查 affectedRows。这一点在章节 4.4 里已经给出写法建议直接在订单创建和库存释放两个函数里统一用这种模式并且给 menu 表的库存字段加数据库约束作为兜底。更稳妥的做法是在事务里先对菜单主键加行锁再扣减但这对一个小程序点餐系统来说有点重用条件更新已经足够。第六坑小程序审核被拒提示“涉及餐饮外卖需要补充商家资质”。现象是代码功能正常但提审后被打回。原因是点餐外卖属于餐饮类目个人主体的小程序或未添加该类目的企业主体会被拒。资源本身没能力替你处理资质但它预留了隐私协议页面和类目配置入口。解决办法是在小程序后台把服务类目加为“餐饮-点餐平台”或“外卖-外卖配送”并上传对应的营业执照如果是纯演示可以把支付和配送功能关掉改成一个菜单展示类目再提审。处理前先确认你的主体资质是否支持外卖闭环这一步决定上线成败不是代码问题却是项目卡最久的地方。我自己的习惯是在项目启动第一天就跟客户确认主体资质和类目而不是等代码写完了再补。6. 进阶改造与上线前自检多门店、接口加固和一张检查表6.1 把单店版改造成多门店版一张表加一个字段实际交付中客户几乎都会问“能不能开分店”。最经济的方式不是多一套小程序而是给 menu、orders、cart、address 四张表各加一个 shop_id 字段所有查询在 SQL 里强制带上当前门店 ID。下单时根据用户定位到的门店写入订单商家后台按门店维度过滤订单。只需要改后端若干条 SQL 和前端登录后调一次门店选择接口整个改造大概一天能完成。注意购物车要按门店隔离否则用户从 A 门店加了菜又切到 B 门店结算会出现跨店下单的脏数据。6.2 接口安全性加固与支付回调验签开箱即用资源适合跑通功能但直接上生产前要补三道加固否则容易被薅羊毛登录接口要加频率限制同一个 code 一分钟最多换一次写操作接口必须校验 token 对应的 user_id 和操作对象一致防止越权改他人订单支付回调必须用微信支付的密钥验签验签失败直接拒绝并打日志。资源里已经封装了验签函数但默认 dev 环境不启用要上线记得把验证开关打开。6.3 上线前最后一次自检清单检查项状态后端接口全部换成正式 HTTPS 域名并配置到后台合法域名必做appid 换成正式主体类目选餐饮/外卖必做支付商户号已开通回调地址为外网 HTTPS必做隐私协议、用户注销入口已配置必做数据库加了索引orders(user_id,status)建议库存扣减全部改为条件更新必须我把这套资源从导入到真机完整跑过当时最大的教训就是改配置时没有统一核对前后端端口导致排查浪费了一下午从那以后我每次部署前都会把 baseUrl、数据库连接、合法域名这几个字符串放在一起逐行对比。希望这篇拆解能帮你省掉我踩过的那一圈这套资源整体值得下祝你的点餐小程序早日上线。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑