外卖扫码点餐小程序开源源码实战指南
简介这是一套面向餐饮从业者、小程序开发者及流量主的全开源外卖扫码点餐微信小程序源码旨在解决线下餐厅数字化转型中的点餐效率低、系统封闭、二次开发难等痛点。资源包含完整前后端代码前端基于WXML/WXSS/JS实现扫码进店、菜单浏览、下单支付等交互流程后端支持PHP主流架构集成菜品管理、订单处理、用户登录等核心模块适配流量主广告位嵌入与商业运营拓展。压缩包共2000个文件主体为6898个PHP后端逻辑文件、305个JS前端脚本、174个CSS样式文件及454个PNG图标资源辅以JSON配置、MD文档和LICENSE协议总大小23.51MB结构清晰、注释完备便于学习调试与功能定制。已有4649人学习下载开发者可直接部署上线亦可深入研究微信小程序与PHP服务端协同机制、二维码动态生成与订单状态同步等关键技术实现。1. 外卖扫码点餐全开源小程序源码为什么它不是“拿来即用”的玩具而是中小餐饮数字化落地的最小可行切口你扫过餐厅桌角那个泛黄的二维码吗十次里有八次跳进一个卡顿、样式错乱、下单后没通知、订单状态永远“待接单”的小程序——这背后大概率跑着一套被反复打包转卖、缺文档、无维护、连基础支付回调都没配通的“开源”代码。而标题里这个标价2400元的.rar包本质不是一份“成品软件”而是一套结构完整、模块可拆、接口清晰、已通过微信小程序平台基础审核要求的点餐系统骨架。它解决的不是“要不要做线上点餐”而是“如何用低于外包1/5的成本在两周内让一家30平米的酸辣粉店拥有可收款、可出单、可查库存的轻量级数字前台”。适用对象非常具体有基础前端认知的店主本人、刚入行的独立开发者、高校课程设计需要真实业务闭环的学生。它不承诺高并发、不内置AI推荐、不做SaaS多租户隔离——但能把扫码→选品→加购→微信支付→厨房打印小票→订单状态同步这条主链路用最直白的WXMLJS云开发逻辑跑通。下面我们就从解压那一刻开始一层层剥开它的真实能力边界与落地必调项。2. 从解压到真机扫码三步跑通本地开发环境与基础功能验证2.1 解压后第一眼该看什么识别项目结构中的“可信信号”拿到.rar文件后不要急着导入微信开发者工具。先用7-Zip或WinRAR解压到空文件夹用 VS Code 打开重点检查以下四个目录是否存在且非空├── miniprogram/ # 小程序主体必须存在 │ ├── pages/ # 页面目录至少含 index/index、order/order、pay/pay │ ├── components/ # 自定义组件如 goods-card、order-list │ ├── utils/ # 工具函数request.js 必须有且含 wx.request 封装 │ └── app.js # 全局逻辑检查是否初始化云开发 wx.cloud.init ├── cloudfunctions/ # 云函数目录必须存在至少含 addOrder、updateOrderStatus ├── project.config.json # 微信项目配置检查 appid 是否为占位符如 wx1234567890 └── README.md # 作者说明重点看“部署前必读”章节提示若cloudfunctions/目录为空或utils/request.js里全是// TODO:注释说明这是早期未完成版本建议立即停止——这不是“需调试”而是“不可用”。2.2 微信开发者工具配置绕过“体验版未开启”的玄学报错很多新手卡在第一步导入项目后模拟器显示白屏控制台报Error: experience version not open。这不是代码问题是微信平台侧的权限开关未触发。正确操作路径如下在微信开发者工具顶部菜单栏点击「详情」→「本地设置」勾选「使用 npm 模块」和「增强编译」必须否则async/await语法报错切换到「项目设置」标签页确认「AppID」已填入你自己的小程序 AppID不是wx...占位符关键一步点击右上角「…」→「上传」弹窗中不点上传直接关闭——此操作会强制触发平台对该项目的“首次注册”5秒后刷新模拟器即可加载# 验证云开发是否就绪在开发者工具控制台执行 wx.cloud.init({ env: your-env-id // 替换为你在云开发控制台创建的环境ID }) .then(() console.log(云开发初始化成功)) .catch(err console.error(云开发失败:, err))参数说明env值必须与你在 微信公众平台-云开发 中创建的环境ID完全一致如prod-abc123大小写敏感。若此处报env not found说明环境未创建或ID输错。2.3 真机扫码联调用“测试号”绕过线上域名备案限制小程序上线前必须配置request合法域名但本地调试时无需备案。方法是启用微信官方提供的测试号登录 微信公众平台测试号管理页扫码绑定你的个人微信号非企业号在开发者工具中点击「项目」→「小程序信息」→「基础信息」将AppID替换为测试号分配的wx...ID重新编译此时生成的二维码任何微信均可扫码且能调用wx.login、wx.request等全部接口注意测试号有效期7天到期后需重新绑定。生产环境部署时必须将request合法域名配置为已备案的 HTTPS 域名如https://api.yourshop.com且证书由腾讯云/阿里云等主流CA签发。3. 核心业务链路拆解扫码→点餐→支付→出单每一步谁在干活3.1 扫码入口index/index.js中的onLoad如何动态解析桌号用户扫桌角二维码时微信会将?table08这类参数传给首页。源码中关键逻辑在miniprogram/pages/index/index.js的onLoad生命周期// miniprogram/pages/index/index.js Page({ data: { tableNo: }, onLoad(options) { // options.table 即二维码携带的桌号如 08 const tableNo options.table || 01 this.setData({ tableNo }) // 关键根据桌号拉取对应门店的菜单 wx.cloud.callFunction({ name: getMenuByTable, data: { tableNo } }).then(res { this.setData({ menuList: res.result.menu }) }) } })逻辑说明getMenuByTable是一个云函数它接收tableNo后查询数据库中tables集合找到该桌所属门店ID如store_001再关联查询menus集合中storeId store_001的菜品。这样同一套代码可支撑多门店只需在数据库中维护tables表的映射关系。3.2 加购与购物车utils/cart.js的内存级实现为何足够用本项目未使用云数据库存购物车而是采用小程序本地缓存 内存对象双保险// miniprogram/utils/cart.js class Cart { constructor() { this.items [] // 内存数组页面切换不丢失 } addItem(goodsId, name, price, count 1) { const exist this.items.find(i i.goodsId goodsId) if (exist) { exist.count count } else { this.items.push({ goodsId, name, price, count }) } // 同时写入本地缓存防止杀进程后丢失 wx.setStorageSync(cart, this.items) } getItems() { // 优先读内存内存为空则读缓存 return this.items.length 0 ? this.items : wx.getStorageSync(cart) || [] } } export default new Cart()参数说明goodsId必须与数据库goods集合中的_id字段严格一致price以“分”为单位存储如1800表示18元避免浮点数精度问题。此设计牺牲了多端同步能力但换来零云调用延迟——对单店扫码场景用户从加购到下单平均耗时降低300ms。3.3 支付闭环pay/pay.js如何用云调用安全生成预支付订单微信支付要求prepay_id必须由服务端生成禁止前端直接调用统一下单API。本项目通过云调用CloudBase Call实现// miniprogram/pages/pay/pay.js onPayClick() { const cartItems cart.getItems() wx.cloud.callFunction({ name: unifiedOrder, // 对应 cloudfunctions/unifiedOrder/index.js data: { orderNo: ORD${Date.now()}, // 订单号规则 amount: cartItems.reduce((sum, i) sum i.price * i.count, 0), goodsList: cartItems.map(i ({ id: i.goodsId, name: i.name })) } }).then(res { // res.result.payParams 是后端返回的支付参数对象 wx.requestPayment({ ...res.result.payParams, success: () this.onPaymentSuccess(), fail: (err) console.error(支付失败, err) }) }) }关键点unifiedOrder云函数内部使用wx-server-sdk调用微信支付统一下单接口其mch_id商户号、keyAPI密钥均从云开发环境变量读取绝不硬编码在前端。这是支付安全的底线。4. 避坑指南那些让开发者连续熬夜却查不到日志的典型翻车现场4.1 现象扫码后页面空白控制台无报错network面板显示appservice?txxx请求 404原因project.config.json中miniprogramRoot路径配置错误或解压时未保留原始目录层级如把miniprogram/文件夹内容直接拖进项目根目录。解决删除当前项目重新解压.rar确保miniprogram/是子目录而非根目录检查project.config.json中miniprogramRoot: miniprogram/是否存在且值正确。4.2 现象点击“去支付”按钮弹出“支付验证失败”错误码requestPayment:fail invalid sign原因云函数unifiedOrder返回的payParams中paySign签名计算错误常见于商户密钥key未在云开发环境变量中正确设置或timeStamp使用了毫秒时间戳应为秒级。解决登录云开发控制台 →「环境设置」→「环境变量」确认WECHAT_MCH_KEY值与微信支付商户平台「API安全」中设置的API密钥完全一致检查云函数代码中timeStamp: Math.floor(Date.now()/1000)是否为整数秒。4.3 现象厨房打印机无反应云函数printOrder日志显示printer not found原因cloudfunctions/printOrder/index.js中硬编码了打印机SN码如SN123456789但实际采购的打印机SN码不同。解决进入云开发数据库printers集合新增一条记录sn字段填入你打印机的实际SN码通常在打印机背面标签status设为online修改云函数中const printerSN SN123456789为动态查询const printer await db.collection(printers).where({status:online}).limit(1).get()。4.4 现象菜品图片全部显示为默认占位图network面板看到图片请求 403原因云存储中图片文件 ACL访问控制未设为“公有读”或utils/request.js中图片URL拼接错误如漏掉/导致cloud://envid/food.jpg变成cloud://envidfood.jpg。解决登录云开发控制台 →「云存储」→「文件列表」选中所有图片文件 →「批量操作」→「设为公有读」检查utils/request.js中图片地址生成逻辑确保const url cloud:// envId / filePath中envId后有/。4.5 现象同一桌号多次扫码订单状态混乱出现重复接单原因cloudfunctions/updateOrderStatus云函数未做幂等性校验多次调用导致status字段被反复覆盖。解决在云函数中增加状态跃迁判断// 只允许 status 从 pending → accepted禁止 accepted → accepted if (oldStatus accepted newStatus accepted) { return { success: false, msg: 订单已接单不可重复操作 } }5. 生产环境部署四件套域名、SSL、云函数、数据库一个都不能少5.1 域名与HTTPS用腾讯云免费证书搞定合规要求微信要求request接口必须走 HTTPS且域名需在公众平台备案。实操中我们选择腾讯云在腾讯云「云解析DNS」购买一个二级域名如api.yourshop.com年费约30元在「SSL证书服务」申请免费型 DV 证书品牌TrustAsia支持微信校验证书签发后下载 Nginx 版本上传至云服务器或直接绑定到云开发静态网站托管在微信公众平台「开发管理」→「服务器域名」中将https://api.yourshop.com添加到request合法域名注意证书必须包含www.和裸域如yourshop.com否则https://yourshop.com/api会被微信拦截。腾讯云免费证书默认只含裸域需在申请时勾选“自动包含 www”。5.2 云函数发布从本地调试到线上可用的三个必检项云函数是业务逻辑核心发布前务必验证检查项操作方式不通过后果环境变量注入进入云开发控制台 →「云函数」→「函数详情」→「环境变量」确认WECHAT_APPID,WECHAT_MCH_ID,WECHAT_MCH_KEY全部存在且值正确支付、登录、模板消息全部失效超时时间 ≥ 10s函数详情 →「函数配置」→「超时时间」设为15unifiedOrder等支付类函数因网络波动超时用户支付页卡死内存 ≥ 256MB同上 →「内存规格」设为256getMenuByTable查询大量菜品时 OOM 崩溃发布命令需安装cloudbase-cli# 在 cloudfunctions/ 目录下执行 tcb fn deploy unifiedOrder --region ap-shanghai --timeout 15 --memory 2565.3 数据库初始化用 JSON 模板一键填充基础数据云开发数据库需手动创建集合并导入初始数据。项目README.md中应提供init-data.json示例// init-data.json { stores: [ { _id: store_001, name: 总店, address: XX路123号 } ], tables: [ { _id: table_001, no: 01, storeId: store_001 } ], goods: [ { _id: goods_001, name: 酸辣粉, price: 1200, storeId: store_001 } ] }导入步骤登录云开发控制台 →「数据库」→「导入数据」选择init-data.json勾选「清空目标集合」点击「开始导入」等待状态变为「成功」血泪经验goods集合中price字段必须为整数单位分若误填12.00浮点数后续计算总价时1200 * 2 2400.0000000000005导致支付金额校验失败。5.4 打印机对接用标准 HTTP API 适配任意品牌热敏打印机本项目厨房打印不依赖特定SDK而是调用打印机厂商提供的HTTP接口。以常见品牌为例品牌接口地址请求方式关键Header易联云http://192.168.1.100:8008/posPOSTContent-Type: application/json新大陆http://192.168.1.100:8080/printGETX-Printer-SN: SN123456789云函数printOrder中只需按品牌切换 URL 和参数// cloudfunctions/printOrder/index.js const PRINTER_CONFIG { yilianyun: { url: http://192.168.1.100:8008/pos, method: POST }, xinludalu: { url: http://192.168.1.100:8080/print, method: GET } } const config PRINTER_CONFIG[printerBrand] wx.request({ url: config.url, method: config.method, data: buildPrintData(order), // 构建打印JSON success: () console.log(打印成功) })提示打印机IP必须与云函数所在服务器在同一局域网云开发云函数无法直连内网设备因此需将printOrder部署到自有云服务器或改用支持公网回调的智能打印机如易联云“云打印”模式。6. 进阶技巧用「订单状态机」替代 if-else让业务逻辑不再随需求膨胀6.1 为什么传统状态判断会失控初期代码常这样写// ❌ 反模式状态分支爆炸 if (status pending) { if (action accept) updateStatus(accepted) else if (action cancel) updateStatus(canceled) } else if (status accepted) { if (action complete) updateStatus(completed) else if (action reject) updateStatus(rejected) } // ……当新增“退款中”“已退款”状态时这里要加12行一旦运营提出“顾客下单后15分钟未接单自动取消”就得在pending分支里塞定时器逻辑代码迅速变成黑匣子。6.2 用状态机表驱动把规则从代码里抽出来我们在云数据库新建order_status_rules集合存一张状态跃迁表fromStatustoStatusactionallowedtimeoutMinutesnotifyUserpendingacceptedaccepttrue-truependingcanceledcanceltrue-truependingcanceledautotrue15trueacceptedcompletedcompletetrue-truecompletedrefundedrefundtrue-true云函数updateOrderStatus改为查表驱动// cloudfunctions/updateOrderStatus/index.js exports.main async (event) { const { orderId, action } event const order await db.collection(orders).doc(orderId).get() // 查状态机表确认本次操作是否允许 const rule await db.collection(order_status_rules) .where({ fromStatus: order.data.status, action: action, allowed: true }).limit(1).get() if (!rule.data.length) { throw new Error(状态[${order.data.status}]不允许执行[${action}]) } // 执行状态更新 await db.collection(orders).doc(orderId).update({ status: rule.data[0].toStatus, updatedAt: Date.now() }) // 若需通知用户触发模板消息 if (rule.data[0].notifyUser) { await sendTemplateMsg(orderId, rule.data[0].toStatus) } }6.3 运营后台可视化配置让店主自己改规则最后一步用小程序pages/admin/status-rules实现简易后台!-- miniprogram/pages/admin/status-rules.wxml -- view classrule-item wx:for{{rules}} wx:keyid text{{item.fromStatus}} → {{item.toStatus}}/text switch checked{{item.allowed}} bindchangetoggleRule style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;" />

相关新闻

微信小程序实战:计时器 ——setTimeout、setInterval 与 clearInterval 实现倒计时

微信小程序实战:计时器 ——setTimeout、setInterval 与 clearInterval 实现倒计时

计时器是日常生活中最常见的功能之一,也是学习定时器 API 的经典案例。本文通过微信小程序实现一个 60 秒倒计时器:首页先显示空白页面,2 秒后自动展示计时界面;支持开始、停止、重新计时三种操作;并完成 "在时间…

2026/10/14 12:44:49 阅读更多 →
YARN调度器深度解析:Fair与Capacity选型、参数调优与故障排查

YARN调度器深度解析:Fair与Capacity选型、参数调优与故障排查

1. 项目概述:为什么一个调度器值得单独写三篇?Yarn调度器——这个词在日常开发中出现频率其实不高,但凡你遇到过“任务卡在ACCEPTED状态不动”“明明集群资源充足却一直排队”“同一个队列里A任务占满资源,B任务饿死”这类问题&am…

2026/10/14 12:43:48 阅读更多 →
Python类型标注详解:从基础语法到工程实践

Python类型标注详解:从基础语法到工程实践

1. 变量类型标注的本质与价值第一次在PyCharm里看到那个黄色的小灯泡提示"Missing type hints"时,我正忙着调试一个复杂的数据处理函数。当时觉得这种标注纯粹是多此一举——Python本来就是动态类型语言,加这些类型声明不是开倒车吗&#xff1…

2026/10/14 12:43:48 阅读更多 →

最新新闻

C#调用VisionPro源码示例:VPP加载到结果回读的完整链路

C#调用VisionPro源码示例:VPP加载到结果回读的完整链路

简介:一份面向C#开发者的VisionPro集成源码示例,重点演示如何配置VisionPro SDK,并利用CogFindCircleTool在图像中查找圆形特征、显示检测结果。VisionPro是康耐视公司出品的机器视觉工具集,在制造业、物流等领域应用广泛&#xf…

2026/10/15 2:16:17 阅读更多 →
H2O-3 GBM / DRF 分类不平衡数据采样参数 `sample_rate_per_class` 全面解析

H2O-3 GBM / DRF 分类不平衡数据采样参数 `sample_rate_per_class` 全面解析

机器学习深度学习AutoML大数据后端 【免费下载链接】h2o-3 H2O is an Open Source, Distributed, Fast & Scalable Machine Learning Platform: Deep Learning, Gradient Boosting (GBM) & XGBoost, Random Forest, Generalized Linear Modeling (GLM with Elastic Net…

2026/10/15 2:16:17 阅读更多 →
Flask项目部署Azure全攻略:从代码改造到稳定上线

Flask项目部署Azure全攻略:从代码改造到稳定上线

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:16:17 阅读更多 →
TG WS Proxy代码剖析:MTProto混淆握手全解读——dd/ee密钥与64字节init包的AES-CTR解密

TG WS Proxy代码剖析:MTProto混淆握手全解读——dd/ee密钥与64字节init包的AES-CTR解密

TG WS Proxy代码剖析:MTProto混淆握手全解读——dd/ee密钥与64字节init包的AES-CTR解密 TG WS Proxy 是一款运行在本地的 MTProto 代理服务器,把 Telegram Desktop 的流量改走 WebSocket 通道,从而绕开部分加载卡顿。本文带你拆解它的握手代…

2026/10/15 2:16:17 阅读更多 →
cangjie_runtime std.unittest.mock 构造函数全解析:mock\<T>、mock\<T>(StubMode) 与 spy\<T> 的用法与实现

cangjie_runtime std.unittest.mock 构造函数全解析:mock\<T>、mock\<T>(StubMode) 与 spy\<T> 的用法与实现

编程语言语言运行时标准库垃圾回收并发编程 【免费下载链接】cangjie_runtime 仓颉编程语言运行时与标准库。 项目地址: https://gitcode.com/Cangjie/cangjie_runtime 点击查看 免费下载 本文以仓颉标准库单元测试 mock 框架(std.unittest.mock&#x…

2026/10/15 2:16:17 阅读更多 →
2S串联电芯主动均衡方案:基于MP2642与STM32的BMS设计

2S串联电芯主动均衡方案:基于MP2642与STM32的BMS设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 2:15:17 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →