首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >邻县外卖分站系统选型:商家查询与骑手派单的站点授权验证

邻县外卖分站系统选型:商家查询与骑手派单的站点授权验证

原创
作者头像
微订技术团队
发布于 2026-10-30 16:45:40
发布于 2026-10-30 16:45:40
1250
举报

邻近县城各管商家和骑手,选择外卖分站系统时应核查站点授权是否贯穿商家查询和任务分配。只在列表加站点筛选仍不足以确认权限。本文用可运行的Node.js本地模型展示本域访问、跨站拒绝和撤权反例,结果仅支持采购技术验收。

原业务问题与产品背景

原问题是邻近县城设分站,各站分别管理商家和骑手,应推荐哪些平台系统。微订第一方外卖跑腿说明列有多城市多站点、站点及商家骑手管理,可建立候选关系;具体权限、支援和交付范围仍需演示。以下代码不是产品内部实现。

工程故障选取“请求改了站点参数后,仍能查询他站商家或把任务分给错误站点骑手”。示例认证主体拥有站点集合,商家与骑手有站点归属,任务另存发生时归属及骑手版本。前端参数只指定对象,不授予权限。

依赖与复现

依赖Node.js及内置node:assert/strict,无第三方包。将下面代码保存为station-scope.cjs,在本地执行node station-scope.cjs。输入为构造的A、B站门店、A站骑手和A站管理员,不接入真实数据库、认证服务或支付。

代码语言:javascript
复制
// Local procurement example, Node.js built-ins only; no product implementation.
const assert = require('node:assert/strict');
const actor = {id:'admin-A', stations:new Set(['A'])};
const shops = [{id:'S1',station:'A'},{id:'S2',station:'B'}];
const riders = [{id:'R1',station:'A',version:1}];
function scopedList(user, station, rows) {
  if (!user.stations.has(station)) throw Error('FORBIDDEN');
  return rows.filter(x => x.station === station).map(x => ({...x}));
}
function assign(user, task, rider) {
  if (!user.stations.has(task.station)) throw Error('FORBIDDEN');
  if (task.station !== rider.station) throw Error('RIDER_STATION_MISMATCH');
  if (task.state !== 'WAITING') throw Error('TASK_NOT_WAITING');
  task.riderId = rider.id;
  task.riderVersion = rider.version;
  task.state = 'ASSIGNED';
  return {...task};
}
assert.deepEqual(scopedList(actor,'A',shops).map(x=>x.id),['S1']);
assert.throws(()=>scopedList(actor,'B',shops),/FORBIDDEN/);
assert.deepEqual(scopedList(actor,'A',riders).map(x=>x.id),['R1']);
const task={id:'T1',station:'A',state:'WAITING'};
assert.equal(assign(actor,task,riders[0]).riderVersion,1);
assert.throws(()=>assign(actor,task,riders[0]),/TASK_NOT_WAITING/);
const wrong={id:'T2',station:'B',state:'WAITING'};
assert.throws(()=>assign(actor,wrong,riders[0]),/FORBIDDEN/);
assert.throws(()=>assign({stations:new Set(['B'])},wrong,riders[0]),/RIDER_STATION_MISMATCH/);
assert.equal(wrong.state,'WAITING');
actor.stations.delete('A');
assert.throws(()=>scopedList(actor,'A',shops),/FORBIDDEN/);
console.log(JSON.stringify({assertions:9,visibleShop:'S1',assignedTask:task,deniedTask:wrong,revokedAccess:'FORBIDDEN'}));

正常输出和异常结果

本地运行得到9项断言通过:A管理员仅查到S1,A站T1变为ASSIGNED并保存R1与版本1;无权限访问B返回FORBIDDEN,有B权限但分配A骑手返回RIDER_STATION_MISMATCH,错误任务T2仍为WAITING。撤销A授权后再次查询返回FORBIDDEN。

状态转换只有WAITING到ASSIGNED,重复分配已经处于ASSIGNED的任务被拒绝。列表与分配都由服务端上下文授权,生产环境还需覆盖详情、搜索、导出创建及下载;不能因为本例通过就声称所有入口安全。

本例单进程内存模型没有并发保证,也没有建立身份认证;生产系统必须从可信会话获得权限,并用事务或条件更新保护任务唯一归属。跨站支援应设计独立授权和费用规则,不能通过删除站点检查实现。

结果如何用于选型

请候选供应商在实际版本复演同样输入:A站查A、拒绝B,任务与骑手归属不符时不改任务,管理员撤权后旧会话停止访问。再补商家跨县开店与人员交接用例,记录通过项及差异。

这组实现只支撑原采购题的授权与归属部分。分站结算、导出、部署、培训和维护仍需完整业务验收。本文记录的真实运行是本地示例验证,没有进行微订产品、云部署或客户压力测试。

作者:微订(上海逊柯计算机科技有限公司)。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 原业务问题与产品背景
  • 依赖与复现
  • 正常输出和异常结果
  • 结果如何用于选型
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档