尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用uniapp开发面包店订餐App:从选型到上架的全流程实战分享

用uniapp开发面包店订餐App:从选型到上架的全流程实战分享 简介基于Uniapp开发的面包店订餐App项目源码覆盖iOS、Android和微信小程序等多端运行面向跨平台前端开发者、小程序学习者以及餐饮行业信息化人员可用于快速搭建线上订餐门户也能作为二次开发的基础工程有效解决多端重复开发和维护成本高的问题。压缩包共404个文件包含75个vue页面组件、50个js逻辑脚本、91个json配置文件、90个md说明文档以及scss样式、地图文件和图片素材等整体大小39.25MB目录按功能模块组织可快速定位商品、订单、支付等业务代码。资源实现了商品展示、分类浏览、购物车管理、在线支付、订单跟踪等完整点餐流程并支持自定义甜度与尺寸规格同时提供到店自取和外卖配送两种履约方式。在营销侧内置会员积分和优惠券模块可供学习如何在跨端业务中落地积分累计、抵扣与核销逻辑帮助商家提升复购率。目前已有91人学习可作为毕业设计或全栈实战项目帮助开发者理解Uniapp的组件通信、API封装及多端适配。 说到面包店订餐App很多人第一反应是“这不就是电商小程序换个皮嘛”实际上做过一轮之后你会发现烘焙行业的订单逻辑比想象中要碎得多半成品要不要控库存、蛋糕需要提前预约取货时间、吐司这类刚出炉的产品要按时间段上架、会员储值和生日蛋糕券怎么核销……这些业务细节堆在一起如果从一开始选错技术栈后面每个需求都会变成加班通知。我手头这个项目就是用uniapp做的一款面包店订餐App面向中小连锁烘焙门店支持自提和同城配送整体业务模型并不复杂但覆盖了商品管理、购物车、订单状态流转、会员积分、支付回调、门店营业时间配置等核心链条。最关键的是客户拿到手之后还希望后续能自己加功能——也就是所谓的“可二次开发”。所以这篇文章我不打算只讲怎么做一个App而是把整个项目从选型、模块设计到打包上架、遇到的那些坑全部拆开说清楚给准备用uniapp做同类项目的人一份可以直接抄的作业。1. 这个面包店订餐App到底做什么以及为什么用uniapp1.1 先聊清楚需求边界很多外包或自研项目一开始就死在需求太泛上。这个面包店订餐App的需求其实可以收敛成几句话顾客进入App后看到当日面包和蛋糕加入购物车选择自提门店或者填写配送地址支付订单之后门店收到订单并开始制作顾客到店或等骑手配送。后台需要管理商品上下架、库存预警、门店信息、订单状态和营销活动。听起来和外卖App一样但有几个烘焙行业的特有问题要处理。第一面包不是标品门店一天可能出好几批早上的牛角包和下午的法棍不是同一个生产批次所以商品必须支持按日期和时段上下架。第二蛋糕一般需要提前几个小时甚至一天预订所以预约时间字段是订单里必不可少的。第三门店库存和线上库存需要同步否则会出现用户下单成功到店却发现没货的情况。第四会员体系不是简单积分很多面包店有“充值送”“生日券”“面包卡”等玩法二次开发时这块通常改动最大。把这些边界想清楚后技术选型才有依据。如果你只是粗暴套一个通用商城源码后面改业务逻辑会非常痛苦。用uniapp做至少能保证前端代码在App、小程序、H5三端复用二次开发时不用重新写三套界面。1.2 为什么uniapp是这里最合适的选型如果项目只做单一平台比如只做微信小程序或者只做iOS那我可能会直接推荐原生或者Taro。但这个面包店订餐App的客户明确要求既要安卓App也要iOS App后续还打算上微信小程序做私域流量甚至可能做一个H5版本方便在公众号里嵌入。这种情况下uniapp的跨端编译能力就是一个很现实的优势。uniapp的核心价值在于一套Vue语法可以编译到多个平台开发效率比原生高很多尤其是页面结构、交互逻辑、接口请求这部分代码可以完全复用。和Flutter相比uniapp对国内开发者的友好程度更高原因很直接微信小程序和各家安卓应用市场的适配经验更丰富插件市场里的原生SDK封装也比较全比如支付、地图、推送这类常用能力基本都有现成插件。另外uniapp的生态里有大量“小程序转App”或“App转小程序”的案例遇到问题搜索一下基本都能找到方案。选型时还要考虑团队的技术储备。如果团队只熟悉Vue那uniapp几乎不需要额外学习成本如果团队是React背景可能更倾向Taro。但对于面包店这种业务中台不强、二开需求灵活的项目uniapp的学习曲线和调试环境已经足够友好后端只需要提供一个标准的RESTful API就可以跑起来。2. 核心功能拆解从点餐到履约哪些模块绕不开2.1 商品展示与库存联动商品模块听起来最简单其实就是一张商品表配几张图片但烘焙场景有几个细节必须处理好。第一个是商品维度同一种面包可能有“单只装”和“家庭装”两个SKU价格不同库存也可能分开同一个蛋糕也有6寸、10寸的规格差异。所以商品设计要遵循“SPU SKU”的标准结构只不过在面包店这个场景下SKU的粒度不用太大能区分规格和价格就够了。第二个是库存联动问题。线上库存和门店库存最好共用一套库存模型后台每卖出一单就扣减库存线下收银POS卖出后也要反向同步。如果做不到实时同步至少要设计一个定时任务每5分钟把门店库存同步到线上。库存预警阈值按商品类型分开设置比如爆款吐司因为每天产量高低于50就预警手工蛋糕因为单价高、备货少低于5就要提醒。这个预警要能在App后台醒目显示否则运营人员根本不会去主动看。第三个是商品上下架的时间维度。对于面包这类短保商品我建议在商品表中增加“上架日期”和“上架时段”例如早上7点到10点可售“早餐可颂”下午2点到6点可售“下午茶套餐”。这样设计的好处是门店不需要每天手动改状态到点自动生效后厨也能根据线上实时销量调整生产计划。2.2 购物车与订单状态机购物车模块在处理烘焙商品时有一个要注意的点运费规则和起送价。很多面包店客单价集中在20到50元如果设置满30元起送购物车必须实时计算差额并提示用户还差多少钱。这个交互看起来小但非常影响转化率。另外蛋糕这类商品因为需要预约不建议直接塞进普通购物车我会单独做一个“预约购”入口用户选择需要的日期和时段后再下单和普通购物车隔离开。订单状态机是整个项目里最需要理清楚的部分我一般会在设计文档里画一张状态流转表避免开发到一半逻辑混乱。面包店订餐App的订单状态至少包含待支付、已支付门店待接单、门店已接单制作中、待自提/待配送、已完成、已取消、售后中。需要注意支付回调成功和门店接单之间必须有一个中间状态否则用户刚付款门店还没看到用户打电话催单时很尴尬。门店接单这个动作可以做成自动接单也可以做成门店App/POS上的手动确认前期版本建议手动接单因为面包店线上单量不大人工确认能保证不会漏看备注。为了防止订单超卖支付成功后必须立刻“锁单减库存”而不是等门店确认后再扣。实现上可以在生成订单时就把库存预占超过15分钟未支付自动释放。这个15分钟是经验值太短用户来不及付款太长会导致库存被无效占用。如果碰到蛋糕预约订单还要额外校验预约时段的可订数量同一时段蛋糕产能有限超过容量就要提示用户换时间。2.3 自提/配送时段与门店营业配置面包店和一般餐饮外卖有一点不同面包是分时段出炉的。所以自提时间不能只精确到“今天或明天”最好直接提供一个时间选择器例如“今天 16:30-17:00 自提”这样门店才能按批次备货。从技术上说这个时间选择器要在前端控制可选范围比如当前时间是14:00最早只能选16:00之后的时间避免出现用户下单后半小时就到店但商品还没做出来的情况。配送则要对接第三方配送API或者简单地按距离计算预计送达时间。前期建议先接同城配送平台比如达达、闪送这类而不是自建骑手团队。uniapp端只需要调用地理位置授权然后把起终点坐标传到后端后端再请求三方配送接口拿运费和预计时间。需要特别提醒的是运费模板不要做成全店统一蛋糕类需要冷链配送和特殊包装运费价格要单独配置。门店营业配置是整个系统里容易被忽略但影响很大的模块。每个门店要有独立的营业时间、自提时间段、配送范围、起送价、暂停营业状态。尤其碰到台风、节假日这类特殊情况门店要能一键闭店。在uniapp前端闭店状态必须直接在首页和门店详情页显示不能让用户选完商品最后才在结算页发现不能下单。2.4 支付、优惠券与会员体系支付模块在uniapp里优先选择uni-payment这类封装好的插件接入微信支付和支付宝支付会省很多事。需要注意回调处理不能只在前端判断支付结果一定要以后端拿到的异步通知为准。我见过有人写完第一版只做了前端回调iOS支付偶尔因为网络延迟导致订单状态一直没更新后来统一改成后端轮询异步通知双保险才稳定。优惠券的设计要克制。面包店利润本来不高满减和折扣券如果叠加规则不清很容易亏本。建议第一版只做两种全场满减券和单品折扣券并且设置互斥不能同时使用。每个订单最多用一张券这个规则简单明了用户不会困惑后台对账也方便。如果后期要加“充值送”这类营销工具我会单独做一套储值账户体系和普通优惠券解耦否则优惠计算逻辑会越来越乱。会员体系这块面包店的复购属性非常强所以积分不能只是摆设。基础版本可以这样设计消费1元积1分100积分抵1元积分有效期为一年。再往后可以扩展生日券、会员日双倍积分等玩法。但这些都依赖一个灵活的会员标签系统否则每次新玩法都要改表结构二次开发成本很高。我的建议是在用户表之外单独建一张member_profile表用JSON字段存扩展属性临时活动加字段不用频繁改表。3. 二次开发的正确打开方式哪些地方最值得改3.1 装修引擎与页面配置化客户说要“可二次开发”很多时候不是指改代码而是指运营人员能在后台自己调整首页布局。所以我建议在第一次交付时就做一个简单的装修引擎首页的轮播图、金刚区图标、推荐商品位、热门活动位全部后台可配置前端通过接口拉取JSON渲染。uniapp里可以用scroll-view加flex布局把这些组件串起来配置项放到后台这样不懂代码的运营也能自主调整首页。这个设计对二开的收益非常大。因为很多后续需求其实不是功能新增而是“这个位置我想换成活动入口”“这个商品我想置顶三天”。如果这些都要开发介入项目会陷入无休止的小迭代。配置化改造虽然开发初期会多花一点时间但长期来看是性价比最高的投资。我甚至会把商品详情页的模块也做一部分配置化比如页面里显示不显示“配料表”“热量表”后台都能控制。3.2 对接外卖平台与第三方配送面包店除了自己的App大概率还挂在美团、饿了么上或者后续想通过抖音团购引流。所以二次开发时一定要预留“第三方平台订单”的数据结构订单表中至少要有platform字段和thirdOrderId字段。否则每一家外卖平台接入时都要重新设计订单表老数据还得迁移非常被动。对接第三方配送也一样。我建议在后端抽象出一个DeliveryService接口定义requestDelivery、cancelDelivery、queryStatus三个方法不同配送平台只需要实现这个接口就行。uniapp前端不需要感知配送平台的区别后端返回什么前端就显示什么。如果未来要接新的配送服务商后端加一个实现类就能搞定不需要动App代码。3.3 多门店与分单逻辑面包店从单店模型升级到连锁模型时分单逻辑是最容易出问题的。我的经验是把“用户归属门店”和“订单履约门店”分开。用户可以选择默认门店用于自提也可以让系统根据GPS定位推荐最近门店但配送订单则要严格按照收货地址所属的配送范围来分配门店。这个逻辑必须在后端做不能只靠前端传门店ID否则用户只要切换门店就能绕过配送范围限制。多门店还会带来一个问题库存按门店独立计算后台管理端要支持切换门店查看数据。uniapp做的管理后台如果是内嵌H5那接口设计上就要每个请求都带上storeId参数后端通过token自动解析当前用户可管理的门店列表避免越权操作。3.4 插件市场与原生扩展的取舍uniapp插件市场提供了大量现成模块比如地图、支付、推送、蓝牙打印等。但使用插件前一定要看维护记录和兼容性特别是有原生代码的插件插件作者如果长期不更新很容易在新版本Xcode或Android Studio上编译失败。我在这个面包店项目里就换过一次原生打印插件原因是旧插件在新系统上无法读取蓝牙打印机信息折腾了两天才解决。基本原则是常用功能优先用uni官方或大厂维护的插件偏门业务才自己写原生扩展。比如需要对接门店后厨的标签打印机官方插件没有现成方案我选择在uniapp中通过plus.android和plus.ios调用原生API只封装一个打印类避免为了一个小功能引入整个原生项目工程。这样既保住了跨端代码的纯净性也方便后续二开人员理解。4. 开发与打包过程中的坑能少踩就少踩4.1 uniapp的路由参数确实容易翻车网址参数在小程序里还好到了App端就可能遇到编码问题。比如商品名称里带了个“#”或者“”通过uni.navigateTo的url传递参数时参数直接被截断页面跳过去后怎么都拿不到完整值。后来我养成了一个很简单的习惯所有敏感或复杂的参数不用url传先存到globalData或者本地storage然后跳转页面后再读取。如果一定要用url传也务必用encodeURIComponent包一层接收时再用decodeURIComponent解析。另一个常见的坑是页面刷新后globalData里的数据会丢失导致商品详情页拿不到上一步选好的门店ID。所以在设置globalData时必须同时考虑持久化方案。我会把用户当前选择的默认门店写入storage每次启动App的时候重新读取并缓存到globalData这样即使页面被回收也能快速恢复状态。4.2 iOS隐私协议弹窗与退出逻辑苹果对用户隐私保护的要求很高App首次启动时如果需要获取位置、相机、蓝牙等权限必须先弹隐私政策弹窗并取得用户同意。uniapp中可以在MainActivity或App.vue里检测是否首次启动然后弹出一个自定义的隐私协议弹窗。这里有一个容易被忽略的点用户如果点击“不同意”App应该退出而且最好退出得很干净不能直接调用uni.exitApp因为iOS上系统不允许App自行退出。我的处理方式是用户不同意时跳转到一个固定的“不同意”提示页页面里说明“必须同意隐私政策才能使用”并提供“重新选择”按钮。这样既符合审核要求也不会因为强退App被苹果拒绝。不要问我为什么知道这个坑确实是审核被驳回后改出来的。4.3 软键盘遮挡结算栏别只调adjust-position在App端做结算页面时如果用户要填配送地址或备注弹出软键盘会遮挡底部的提交订单按钮。很多人第一反应是设置adjust-positiontrue这在微信小程序里有效但在App端经常不起作用。我试过比较靠谱的方案是用uni.onKeyboardHeightChange监听键盘高度然后动态给底栏加一个padding-bottom键盘收起时再恢复为0。具体写法也不复杂在页面onLoad里监听onUnload时取消监听即可。另外还要注意iphone的safe-area底部按钮栏要预留iPhone Home Indicator的高度否则在全面屏机型上按钮会顶到最下面看起来非常不舒服。uniapp里可以用env(safe-area-inset-bottom)处理或者在uni.scss里定义一个全局的安全区变量。4.4 扫码枪和蓝牙扫描器扫出来的一串数字怎么处理面包店门店在核销自提订单时常用的方式是用户展示取货码店员用扫码枪或手机摄像头扫。但扫码枪在某些蓝牙连接模式下扫出来的不是完整字符串而是一串数字加回车符比如“123456\r\n”如果直接拿这个数字去匹配订单会因为多了回车符而失败。处理这个问题的思路很简单但很多人想不到扫描完成后不要立刻提交先把扫描结果做一次trim处理去掉首尾的空白字符和换行符同时兼容纯数字和带前缀的取货码。uniapp的uni.scanCode扫出来的结果也要检查是否存在url编码如果是二维码里存了一串加密串后端要约定好解码规范前端不做多余解析原样提交给后端即可。我在项目里就是后端对取货码做了base62解码和校验位检查才彻底解决误识别问题。5. 从代码到上架安卓应用市场与后续维护5.1 打包签名与加固细节uniapp在HBuilderX里打包安卓App时必须先配置好证书和签名否则上架各个应用市场时会遇到识别问题。很多新手犯的错是使用HBuilderX默认的公共测试证书打出来的包这种包自己测试没问题但无法在应用市场正式发布。正确的做法是在后台生成自己的证书文件记住alias和密码打包时填进去。证书一旦丢了没法找回之前发出的App也没法覆盖升级所以一定要备份到公司的密码管理工具里。上架安卓市场还要做好应用加固。常见的是使用腾讯乐固、360加固等工具在上传市场前先对APK做加固和签名。如果不加固APK很容易被第三方直接反编译修改包名和图标变成带广告的盗版App。另外不同渠道要求不同比如华为、小米、OPPO、vivo都需要各自的隐私政策网址和应用截图这些材料最好在项目交付时就帮客户准备好否则最后卡在审核环节很难受。5.2 数据统计与远程更新App上线不等于项目结束对二次开发项目来说运维监测能力更重要。uniapp可以接入uni统计来查看新增用户、活跃用户、页面访问Top榜等基础数据如果客户有更细的需求再接入友盟或者神策。我会在关键操作节点埋点比如加购、提交订单、支付成功、自提核销这样能直观看到用户在哪个环节流失最多。远程更新主要分两种整包更新和热更新。uniapp的App端支持wgt资源包热更新但只更新前端资源不涉及原生代码。如果只是改页面文案、调整样式这种更新方式非常方便用户无感知也不需要重新走应用市场审核。但如果改了原生SDK或者涉及权限那就必须发整包走市场上架流程。这里要提醒的是很多安卓应用市场不允许App内部提示“发现新版本”去下载APK合规做法是跳转到应用市场详情页更新否则会被审核驳回。这个版块我建议在交付时做一个简单的运营手册告诉客户哪些修改可以用热更新哪些必须发版。很多客户不理解“我就改了个按钮颜色为什么要上架审核”其实原因不是改代码本身而是审核机制。提前把这些边界讲清楚后续合作会顺畅很多。回头再看这个面包店订餐App项目它不算那种技术难度很高的项目但细节密度确实不小。从商品时段库存到预约自提再到扫码核销和分门店履约每一环都和后端业务规则强绑定。uniapp在这里的角色更像是一个称职的“搬运工”把跨端开发成本压下来让团队能更专注地打磨业务逻辑。而我个人的经验是做这类可二次开发的项目最重要的不是在App端炫技而是把数据模型、订单状态、权限边界这些底层东西理清楚。底层扎实了后面不管客户要加拼团、砍价还是新的配送平台都只是在已有的骨架上长肉而已。本文还有配套的精品资源点击获取
返回列表