本地化外卖平台设计方案:用户端、商户端、骑手端三端协同开发
县域、社区级的本地化外卖平台,核心难点在于用户端、商户端、骑手端三端业务协同。订单数据、履约状态、消息通知需要多端实时同步,任何一端数据不同步,都会造成漏单、配送异常等问题。搭建本地化外卖平台,不能只单独开发每个端,要重点打通三端之间的业务链路,实现下单‑接单‑派单‑配送完整闭环。
本文将从三端协同整体架构、各端核心功能、数据表、关键代码、订单流转、地图能力、支付处理、统计、技术选型、扩展方向讲解本地化外卖三端协同开发思路。
一、本地化外卖平台整体架构设计
采用前后端分离架构,用户端、商户端、骑手端共用同一套API服务层,通过消息队列+websocket实现多端消息实时推送,保证订单状态变更三端同步更新;平台管理后台负责全局配置与监控。
1. 用户端小程序
面向点餐消费者,主要能力:
- 周边商家浏览、商品筛选搜索
- 商品查看、规格选择、购物车管理
- 收货地址维护、下单与在线支付
- 订单查询,实时查看商家接单、骑手配送进度
- 订单评价、售后退款申请
2. 商户端(小程序+PC后台)
面向本地餐饮商家,主要能力:
- 店铺信息、营业时间、配送范围维护
- 商品分类管理、商品上下架、库存管控
- 新订单实时提醒、接单/拒单、确认出餐
- 店铺营销配置,查看门店营收与订单流水
3. 骑手配送端(小程序)
面向配送人员,主要能力:
- 上线/下线切换在线接单状态
- 接收系统派单或者参与抢单
- 更新取餐、送达履约状态
- 骑手导航,收益明细、提现申请
4. 平台管理后台
平台统一管控:
- 用户、商户、骑手账号审核管理
- 全局订单监控,异常订单人工干预
- 佣金比例配置、财务结算、数据统计
整体架构示意:
用户小程序
|
商户端 ---- API服务层 + 消息推送 ---- 管理后台
|
骑手端
|
MySQL + Redis + MQ消息队列
二、三端协同核心功能设计
1. 商家商品模块(商户端维护,用户端展示)
商户在商户端维护商品信息,用户端小程序读取展示,商品数据统一由后端管控。
商品数据表:
CREATE TABLE goods (
id INT PRIMARY KEY AUTO_INCREMENT,
shop_id INT COMMENT '所属商户ID',
name VARCHAR(100) COMMENT '商品名称',
image VARCHAR(255) COMMENT '商品图片',
price DECIMAL(10,2) COMMENT '售价',
stock INT COMMENT '库存',
status TINYINT DEFAULT 1 COMMENT '1上架 0下架'
);
商品查询接口(Node.js)
router.get('/goods/list', async(req,res)=>{
const goods = await Goods.findAll({
where:{
shop_id:req.query.shopId,
status:1
}
})
res.json({
code:200,
data:goods
})
})
协同说明:商户端修改商品库存、上下架,直接修改数据库,用户端刷新即可获取最新商品数据。
三、购物车、订单生成与三端消息联动
用户端加入购物车提交订单,支付成功之后,后端发送消息通知商户端新订单提醒;商户接单后,订单流入调度模块推送给骑手端。
购物车金额计算函数:
function calculateCartAmount(cart){
let total = 0;
cart.forEach(item=>{
total += item.price * item.number;
})
return total;
}
创建订单并且推送消息示例:
async function createOrder(userId,cart,shopId,deliveryFee){
const goodsAmount = calculateCartAmount(cart);
const payAmount = goodsAmount + deliveryFee;
const order = await Order.create({
user_id:userId,
shop_id:shopId,
goods_amount:goodsAmount,
delivery_fee:deliveryFee,
pay_amount:payAmount,
status:'待支付'
})
//支付成功后推送消息给商户端,提醒有新订单
await mqProducer.send("order-new-topic",JSON.stringify(order));
return order;
}
三端协同订单完整状态流转:
【用户端】提交订单→待支付
↓用户完成支付
【用户端】状态:已支付 →【商户端】收到新订单提醒
↓商户端接单
【商户端】状态:已接单 →【调度服务】分配骑手 →【骑手端】收到订单推送
↓骑手端取餐
【骑手端】状态:配送中 →【用户端】同步看到配送中
↓骑手端确认送达
【骑手端】状态:已完成 →【用户端、商户端】同步更新订单完成
四、骑手端履约状态管理
骑手端修改订单履约状态,后端更新数据库,同时推送事件,把最新状态同步给用户端和商户端,实现三端数据协同。
订单状态常量:
const orderStatus={
WAIT_PAY:1, //待支付
PAID:2, //已支付
SHOP_ACCEPT:3, //商户已接单
DELIVERING:4, //配送中
FINISH:5 //订单完成
}
骑手更新配送状态接口:
router.post('/rider/updateOrderStatus',async(req,res)=>{
const {
orderId,status,riderId}=req.body;
const orderInfo = await Order.findByPk(orderId);
//校验订单属于当前骑手
if(orderInfo.rider_id !== riderId){
return res.json({
code:500,message:"无权操作该订单"})
}
await Order.update({
status:status},{
where:{
id:orderId}});
//推送状态变更事件,同步更新用户端、商户端页面
await mqProducer.send("order-status-change",JSON.stringify({
orderId,status}));
res.json({
message:"状态更新成功"})
})
协同关键点:不要依靠前端各自修改状态;所有状态变更必须经过后端,后端统一推送事件,三端接收事件刷新UI,避免多端状态不一致。
五、地图LBS位置协同能力
- 用户端:上报收货地址经纬度,校验商家配送范围
- 骑手端:定时上报实时位置存入Redis
- 用户端:订阅骑手位置,展示骑手实时位置轨迹
- 骑手端:获取商家到收货地址路线规划
地图路线接口示例:
function getDeliveryRoute(start,end){
return axios.get(
"[https://api.map.com/direction](https://api.map.com/direction)",
{
params:{
origin:start,
destination:end
}
}
)
}
六、微信支付三端联动处理
用户端完成支付,后端回调更新订单状态,推送消息通知商户端有新待接单订单。
支付业务流程:
【用户端】提交订单
↓
生成业务订单记录
↓
用户端调起微信支付
↓
微信异步回调后端
↓
后端更新订单状态为已支付
↓
MQ推送事件,【商户端】收到新订单提醒
支付回调示例代码:
router.post('/pay/notify', async(req,res)=>{
let orderNo=req.body.out_trade_no;
const order = await Order.findOne({
where:{
order_no:orderNo}})
await Order.update({
status:"已支付"
},{
where:{
id:order.id
}
});
//推送新订单消息给到商户端
await mqProducer.send("order-new-topic",JSON.stringify(order));
res.send("success");
})
七、后台数据统计功能
平台统计订单、商户营收、骑手接单数据,评估三端业务运行情况。
统计每日订单数量SQL:
SELECT
DATE(create_time) AS day, COUNT(*) AS order_count
FROM orders
GROUP BY day;
统计商户营收:
SELECT shop_id,sum(pay_amount) AS shop_income
FROM orders
WHERE status=5
GROUP BY shop_id;
统计骑手完成订单:
SELECT rider_id,COUNT(id) AS finish_num
FROM orders
WHERE status=5
GROUP BY rider_id;
通过统计数据,运营可以发现订单流转卡点,例如商户接单慢、骑手接单量不足等三端协同问题。
八、开发技术选型
小程序端
- 微信小程序原生开发
- UniApp
- Taro
后端
- Java Spring Boot
- Node.js
- PHP Laravel
数据库&缓存&消息组件
- MySQL:存储订单、商户、骑手、商品业务数据
- Redis:缓存商品、骑手地理位置
- MQ(RocketMQ/RabbitMQ):订单事件,实现三端消息推送
- WebSocket:前端实时接收订单状态变更
服务部署
- Linux服务器
- Nginx
- Docker
SpringBoot项目目录参考
local‑takeout‑system
├── user 用户端业务模块
├── merchant 商户端业务模块
├── rider 骑手端业务模块
├── order 订单核心模块
├── dispatch 订单调度模块
├── message‑push 多端消息推送模块
├── payment 支付模块
└── admin 平台后台
九、后期扩展方向
基础三端协同能力完成后,可迭代更多业务能力。
用户端扩展
- 优惠券、会员、收藏店铺
- 预订单、到店自提
商户端扩展
- 商户营销工具:满减、折扣活动
- 订单小票打印、门店多账号子账号
骑手端扩展
- 接单限制设置、小休暂停接单
- 异常上报,遇到问题提交工单给平台
平台协同增强
- 消息多渠道兜底:websocket+小程序订阅消息,防止消息丢失
- 三端状态不一致的补偿校验定时任务
- 多商家入驻、平台抽佣结算
数据运营
- 用户消费统计
- 商户接单超时统计
- 骑手履约、超时统计

总结
本地化外卖平台,重点不在于分别实现用户、商户、骑手三个端,而在于三端业务协同。所有订单状态变更统一由后端处理,通过消息队列、WebSocket把事件同步分发到三端,避免前端各自维护状态造成数据错乱。
开发时要完整跑通从用户下单支付、商户接单、骑手配送直到订单完成的完整业务闭环。基于这套三端协同底座,还可以继续叠加会员营销、自提、多商家结算等功能,适配县城、社区等不同本地化外卖业务场景。