口令码与队列规则说明 - xiaochu-dev/online-shopping-group5 GitHub Wiki

口令码与队列规则说明

项目 内容
项目名称 在线购物系统(挑战升级)· MVP 基线版本 · 第 5 组
文档名称 口令码与队列规则说明(设计补充文档)
编制人 周到(产品经理)
编制日期 2026-10-07
版本 v1.1
编制依据 需求规格说明书 FR-04 待细化项(第 8 节待确认事项 1「口令码的生成、存储、校验规则与有效期」的落地);需求澄清结论第五节(排队撤销)、第六节(冻结恢复)
覆盖模块 队列与冻结模块(FR-04 / FR-06,Backlog D/F)

文档说明:本文档是 FR-04 需求条目中标注「待细化」内容的正式设计定义, 与 services_state.py 现有实现一一对应,供评审老师对照代码查验。


一、口令码规则

# 规则项 设计定义 对应依据
1 生成算法 secrets.token_hex(4),生成 8 位十六进制字符串(如 a3f9c2e1) FR-04 待细化项
2 随机性保证 secrets 模块基于操作系统密码学安全随机源(CSPRNG),不可预测、不可枚举,满足 NFR-05「口令码不可被他人猜测或枚举」 NFR-05
3 唯一性保证 生成后先查 intent 表 token_code 字段去重,撞码则循环重新生成,入库码全局唯一 FR-03-7
4 绑定关系 口令码与单条意向一一唯一绑定:每次提交都是独立意向记录,各配独立口令码;不按买家电话号码复用或合并 FR-03-6 / FR-03-7
5 存储方式 随 intent 表持久化存储(sqlite),服务重启不丢失 NFR-04
6 展示时机 提交成功后当场显示给买家,仅展示一次,系统不留买家侧查询入口 FR-03-8
7 使用场景 仅用于买家凭码撤销自己的意向(FR-04-4,对应自测 D-3)。「凭码查询意向状态」「凭码修改意向信息」经第 1 次评审助教点评后,已在需求规格说明书 v1.1 显式划为本版本范围外(FR-04-9/10),列入第 2 次迭代候选 FR-04-4 / FR-04-9/10
8 校验规则 撤销时按 token_code 精确匹配 + 意向状态 pending 双重校验;任一不满足即返回「口令码无效,或该意向不可撤销」 FR-04-4 / FR-04-5
9 失效时机 口令码不设时间有效期,随意向生命周期;意向到达终态 success / failed / cancelled 后即失效(进入 trading 亦失效,见第三节对照表),不可再凭码操作 FR-04-5 / FR-04-8
10 冻结期有效性 冻结期口令码仍然有效——冻结不是交易结束,排队中的意向还「活着」,买家仍可凭码撤销(撤销后队列实时前移) 澄清结论第五、六节
11 下架后失效 商品下架(标记「成功」转入历史)时,队首意向转 success、其余 pending 意向全部转 failed,所有口令码随之到达终态失效 FR-07-5

二、队列规则

# 规则项 设计定义 对应依据
1 排序键 created_at(毫秒精度时间文本,字典序 = 时间序)+ 自增 id 兜底:同毫秒并发提交时按入库顺序稳定排序 FR-04-2 / NFR-03
2 队列容量 不限制人数,可挂多个有效意向 FR-04-1 / 澄清结论第五节
3 有效意向 仅 pending 状态进入队列展示与排序;trading 为队首交易位,success/failed/cancelled 均出队 澄清结论第五节
4 位次设计 位次不落库、实时计算(查询时 ORDER BY created_at ASC, id ASC),避免撤销/递补时批量 UPDATE 位次字段,消除多字段状态不同步的一致性风险 NFR-02
5 交易入口 同一时间仅队首可进入线下交易;进入交易接口做队首校验,非队首直接拒绝(自测 D-2/D-4 验证) FR-04-3
6 递补触发点 ①:撤销 买家凭码撤销 → 意向转 cancelled 出队 → 因位次实时计算,其后所有意向位次自动前移,无需额外处理 FR-04-5 / FR-04-6
7 递补触发点 ②:交易失败 队首被标记「失败」→ 转 failed 出队 → 队列下一位 pending 自动转 trading,商品保持冻结(自测 D-5 验证) FR-04-7 / FR-07-7
8 队列为空 · 失败路径 队首失败且队列已无 pending → 商品恢复「在售」,重新接收新意向 FR-07-6
9 队列为空 · 展示路径 无交易进行且无 pending 意向 → 后台显示「暂无有效意向」,不渲染队列表格 FR-05-1
10 冻结与队列的关系 冻结只拦截新意向(FR-06-4),不终止已有意向——排队意向的口令码在冻结期仍有效(见口令码规则 #10) FR-06-4 / 澄清结论第六节
11 交易中保护 存在 trading 意向时不允许手动解冻,防止破坏「仅队首进入交易」的队列语义 FR-04-3

三、口令码状态与意向状态对照

意向状态 口令码是否有效 说明
pending(排队中) ✅ 有效 可凭码撤销;冻结期亦有效
trading(交易中) ❌ 失效 队首已进入线下交易,不可凭码撤销
success(成交) ❌ 失效 终态
failed(失败) ❌ 失效 终态(含商品下架时的批量转失败)
cancelled(已撤销) ❌ 失效 终态,撤销动作本身已完成

四、自测验证

以上规则的自动化验证见 卖家后台/test_d_module.py(D-1D-5、F-1F-5 共 10 项边界用例), 运行方式:python test_d_module.py,期望输出 周到模块自测:10 通过 / 0 失败。


五、变更记录

版本 日期 变更内容 修订人
v1.0 2026-10-07 首版创建:定义口令码生成/绑定/失效规则与队列排序/递补规则 周到
v1.1 2026-10-07 依据第 1 次评审助教点评对齐:#7 使用场景补「凭码查询/修改已显式划为范围外(规格书 FR-04-9/10)」;#9 失效时机补「不设时间有效期」表述,与规格书 FR-04-8 一致 周到