县域、社区级的本地化外卖平台,核心难点在于用户端、商户端、骑手端三端业务协同。订单数据、履约状态、消息通知需要多端实时同步,任何一端数据不同步,都会造成漏单、配送异常等问题。搭建本地化外卖平台,不能只单独开发每个端,要重点打通三端之间的业务链路,实现下单‑接单‑派单‑配送完整闭环。
本文将从三端协同整体架构、各端核心功能、数据表、关键代码、订单流转、地图能力、支付处理、统计、技术选型、扩展方向讲解本地化外卖三端协同开发思路。

采用前后端分离架构,用户端、商户端、骑手端共用同一套API服务层,通过消息队列+websocket实现多端消息实时推送,保证订单状态变更三端同步更新;平台管理后台负责全局配置与监控。
面向点餐消费者,主要能力:
面向本地餐饮商家,主要能力:
面向配送人员,主要能力:
平台统一管控:
整体架构示意:
用户小程序
|
商户端 ---- API服务层 + 消息推送 ---- 管理后台
|
骑手端
|
MySQL + Redis + MQ消息队列商户在商户端维护商品信息,用户端小程序读取展示,商品数据统一由后端管控。
商品数据表:
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,避免多端状态不一致。
地图路线接口示例:
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;通过统计数据,运营可以发现订单流转卡点,例如商户接单慢、骑手接单量不足等三端协同问题。
SpringBoot项目目录参考
local‑takeout‑system
├── user 用户端业务模块
├── merchant 商户端业务模块
├── rider 骑手端业务模块
├── order 订单核心模块
├── dispatch 订单调度模块
├── message‑push 多端消息推送模块
├── payment 支付模块
└── admin 平台后台基础三端协同能力完成后,可迭代更多业务能力。
本地化外卖平台,重点不在于分别实现用户、商户、骑手三个端,而在于三端业务协同。所有订单状态变更统一由后端处理,通过消息队列、WebSocket把事件同步分发到三端,避免前端各自维护状态造成数据错乱。
开发时要完整跑通从用户下单支付、商户接单、骑手配送直到订单完成的完整业务闭环。基于这套三端协同底座,还可以继续叠加会员营销、自提、多商家结算等功能,适配县城、社区等不同本地化外卖业务场景。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。