第5组 · 周到 · 第1次评审详情 - sebestp/coursewise GitHub Wiki

周到 · 第1次评审详情(第5组 · 组员)

基本信息

  • 报告期次:第1次 | 报告日期:2026-10-08 | 项目组号:第5组 | 项目名称:在线购物系统(挑战升级)

工作任务与成果物

成果物 · 第 5 组 · 需求澄清访谈结论(MVP)

第 5 组 · 需求澄清访谈结论(MVP)

项目:在线购物系统(挑战升级)|版本:MVP 基线
访谈对象:课程助教(需求方)|主问:周到(PM)
记录日期:2026-10-04 | 来源:访谈逐条回答
性质:这是本组开发与验收的依据文档,与课程 Wiki「需求澄清记录」页内容一致


一、商品与上架规则
  • 同一时间在售商品只有一件。卖完、或卖家手动下架之后,才能发布下一件。
  • 下一件不自动上架。系统没有自动补位逻辑,必须由卖家手动进后台重新发布。
  • 基线里"卖掉一个再制作一个"的含义:卖家自己做一件挂上去,卖掉后再手动发下一件;"制作/发布"全程是卖家手动动作。
  • 系统只负责状态流转(冻结、撤下等),不负责补货。

二、商品字段与边界

商品字段共 4 项:名称、描述、图片、价格。

字段 必填 限制
名称 ✅ 必填 不卡字数
描述 ❌ 选填 不卡字数,可留空
图片 ❌ 选填 缺省放占位图;最多 1 张主图;JPG / PNG;单张 ≤ 5MB,超出给提示
价格 ✅ 必填 必须 > 0(不能标 0 元);人民币;保留两位小数(如 9.90)
  • 名称、描述不设字数上限。
  • 描述留空、图片不传都允许。

三、卖家账号
  • 只有一个卖家账号,是系统里唯一的,不是买家那种临时注册出来的。
  • 形式:用户名 + 密码。
  • 账号初始化方式由实现方自定(助教不约束统一给还是自己建),唯一要求:有一个卖家账号、能凭用户名密码登录。
  • 必须登录才能进后台。发布、冻结、查看意向购买人等操作都需先登录。
  • 改密码:需先验证原密码;新密码至少 8 位。
  • 「退出登录」本版本不做。

四、买家信息
  • 仅 2 项:姓名、联系电话,都必填。
  • 不做格式校验(填什么系统都收)。
  • 同一号码可反复购买:不注册、不建账号,每次提交都是独立意向,各有各的口令码,系统不按号码去重/拦截。

五、意向、排队与撤销
  • 规则:严格先到先得,按意向提交时间排序。
  • 只有有效意向才进队列。
  • 队列可挂多人(不是只能一个)。
  • 同一时间真正进入交易(线下谈)的只有排最前面的那一个(因为只有一件商品)。
  • 前面那个交易失败后,后面的人依次递补上来。
  • 买家可撤销自己的意向:凭提交时系统给的口令码操作。
  • 撤销后该买家从队列移出,后面的人位次自动往前顶。

六、商品冻结与恢复

冻结有两条路径,走的是同一个状态:

路径 触发方式
自动冻结 商品一进入交易(卖家选定跟某人线下谈时)系统自动把「在售」→「已冻结」
手动冻结 卖家在后台手动冻结
  • 手动冻结与自动冻结是同一个"已冻结"状态,不区分。
  • 冻结期间:
    • 不再接受新的购买意向,买家点「我要买」看到「商品交易中」提示;
    • 商品买家仍可见,但买不了、也提不了意向。
  • 恢复上线:
    • 交易成败由卖家线下谈完后到后台手动标记「成功」/「失败」;
    • 标记「失败」→ 商品恢复在售、重新上线;若队列还有排队的人,按顺序递补进来。
    • 系统不自行判定交易结果。
  • 交易进行中卖家也可手动解冻:后台有冻结/解冻开关。

七、交易结果与历史记录
  • 成交/失败只能由卖家在后台标记,买家侧无此入口。
  • 没有超时自动判失败的机制。成败由卖家线下谈完后自行判断、自行标记(一手交钱一手交货)。
  • 系统不参与判定,也不会自动超时判定。
  • 成交后商品撤下,但历史记录保留。

历史记录至少保留:

层级 保留字段
商品级 商品名称、描述、图片、价格、发布时间、最终交易结果(成功/失败)、交易时间
意向人级 每个商品可点进去看意向购买人列表:姓名、联系电话、意向提交时间、每人对应的交易结果
  • 历史记录按时间倒序排列,支持翻页。

八、范围与验收
  • 终端范围:仅 Web 网页端。Android / iOS / 微信小程序不在本版本范围内。
  • 评价功能:不做。
  • 「必做/选做如何划分、验收标准谁定」——助教答复:超出需求讨论范围,需求方只负责聊产品需求。
    → 因此这两项由课程文档(系统验收标准.md)与本组自行定义,不在本澄清结论内。

九、待办与影响
# 事项 说明
1 核对课程 Wiki 去「需求澄清记录」页确认第5组条目已记上、且与本文件一致
2 回填需求规格说明书 本文件结论 → 正式需求条目
3 回填 Product Backlog 每条需求配验收标准
4 验收标准自行定义 助教不提供,需本组对照 系统验收标准.md 自拟
5 口令码机制待细化 「提交时生成口令码、凭码撤销」的生成与校验规则需在设计阶段定
6 递补逻辑需覆盖 撤销、交易失败两种触发都要能正确重排队列

本文件由产品经理(周到)整理,作为本组需求基线。后续变更在此追加「变更记录」。

成果物 · 在线购物系统 需求规格说明书

在线购物系统 需求规格说明书
项目 内容
项目名称 在线购物系统(挑战升级)
版本 MVP(第 1 次迭代基线版本)
项目组号 第 5 组
组长 胡成溯
编制人 周到(产品经理)
编制日期 2026-10-04
文档状态 已依据需求澄清访谈结论定稿(v1.1 按第 1 次评审助教点评补强)

文档说明:本文件描述 MVP 版本的功能需求,作为本组开发、测试与验收的依据。 需求条目中的规则均来自 2026-10-04 的需求澄清访谈结论,未经澄清的假设一律标注为「待确认」。


1 引言
1.1 编写目的

明确 MVP 版本的功能范围、业务规则与验收依据,供开发、测试、评审三方使用。

1.2 项目背景

本课程项目采用「挑战升级」组织方式:所有项目组在统一基线需求之上,于 7 次迭代中逐步增加功能。本次为第 1 次迭代,目标是交付可运行的基线 MVP 原型。

1.3 范围界定
属于本版本范围 不属于本版本范围(后续迭代)
单商品在线售卖(同一时间仅一件在售) 多商品 / 多卖家 / 商品分类
卖家后台(发布、历史、意向人、冻结、改密) 用户注册与登录体系
买家填写信息提交购买意向 在线支付(本版本为线下交易)
意向排队、口令码撤销、顺位递补 库存管理、订单系统、物流配送
商品冻结/解冻与交易结果标记 评价、营销、权限、消息通知
Web 网页端 Android / iOS / 微信小程序
1.4 术语与缩写
术语 含义
在售 商品可被买家浏览并提交意向的状态
已冻结 商品处于交易中或卖家主动冻结,不再接收新意向的状态
意向 买家提交的购买申请,包含姓名、联系电话,并绑定一个口令码
口令码 买家提交意向时系统生成并当场显示的凭证,用于撤销该意向
队列 按意向提交时间正序排列的购买意向列表
递补 队首交易失败或撤销后,后一位自动顶上的机制
历史商品 已完成(成交或失败)或被下架的商品记录
1.5 参考资料
  • 《课程导论》——项目主题与基线需求来源
  • 课程 Wiki《系统验收标准》——五方面验收要求
  • 课程 Wiki《阶段性评审 (I)》——报告与提交规范
  • 《需求澄清结论-第5组》——本组需求澄清访谈结果(2026-10-04)

2 用户角色与用例
2.1 用户角色识别
角色 说明 是否需要登录
卖家 系统内唯一的运营者。负责发布商品、处理意向、标记交易结果 ✅ 需登录(用户名 + 密码)
买家 任意访问者。无需注册,浏览商品并提交购买意向 ❌ 无需登录(填写姓名与电话即可)
系统 自动执行状态流转(进入交易时自动冻结、撤销后自动递补) —

⚠️ 本版本无买家账号体系,买家身份不具备持久性,每次提交意向都是独立记录。

2.2 角色职责对比
能力 卖家 买家
发布商品 ✅ ❌
浏览在售商品 ✅ ✅
提交购买意向 ❌ ✅
查看意向购买人列表 ✅ ❌
标记交易结果(成功/失败) ✅(唯一入口) ❌
冻结 / 解冻商品 ✅(手动) ❌
撤销自己的意向 ❌ ✅(凭口令码)
修改密码 ✅ ❌

3 业务流程
3.1 主流程:商品从发布到成交
① 卖家登录后台
      ↓
② 卖家发布商品(名称·描述·图片·价格)
      ↓
③ 商品进入「在售」状态,买家可见
      ↓
④ 买家浏览商品 → 填写姓名、电话 → 提交购买意向
      ↓
⑤ 系统生成口令码并显示给买家;意向按提交时间进入队列
      ↓
⑥ 卖家查看意向购买人列表,选定一位进行线下交易
      ↓
⑦ 商品自动转为「已冻结」;队列后位者仍排队但不可进入交易
      ↓
⑧ 卖家线下谈完后回后台标记结果
      ↓
   ┌────────────┴────────────┐
 标记「成功」               标记「失败」
   ↓                          ↓
商品撤下,进入历史         商品恢复「在售」,重新上线
(保留完整记录)                 ↓
                          队列后一位自动递补进入交易
3.2 分支流程:买家撤销意向
买家凭口令码发起撤销
      ↓
该意向从队列中移出
      ↓
队列中后于它的意向位次自动前移(顺位递补)
      ↓
商品状态不变(仍为「在售」或「已冻结」,取决于撤销发生在何时)
3.3 商品状态流转

商品状态值共 3 个,语义状态显式列为 4 个——「已恢复在售」为语义标签,库中复用 on_sale 状态值:

状态 含义 买家可否浏览 可否提交新意向
在售 上架可售 ✅ ✅
已冻结 交易中 / 卖家主动冻结 ✅(显示「商品交易中」) ❌
已下架 成交撤下或手动下架,转入历史 仅历史记录中可见 ❌
已恢复在售 经历「冻结 → 解冻」或「标记失败恢复」路径后重新在售;语义标签:库中复用 on_sale 状态值,不新增状态值(第 1 次评审助教建议显式化) ✅ ✅

状态流转图:

              卖家发布
                 ↓
              ┌──────┐
              │ 在售 │ ←────────────┐
              └──────┘              │
                 │ ↑                │ 标记「失败」
    进入交易(系统自动)              │ 或手动解冻
      或卖家手动冻结                  │
                 ↓ │                │
              ┌──────┐              │
              │已冻结│──────────────┘
              └──────┘
                 │
                 │ 标记「成功」
                 │ 或卖家手动下架
                 ↓
              ┌──────┐
              │已下架│(终态)
              └──────┘

关键规则:自动冻结(进入交易时)与手动冻结是同一个状态,不做区分。 恢复路径显式化:流转图中「标记失败 / 手动解冻 → 在售」的回路即**「已恢复在售」**语义态——库中复用 on_sale,仅语义上区分「经历过冻结的商品重新在售」。


4 功能需求
FR-01 卖家登录与账号管理

描述:系统内仅有一个卖家账号,卖家须登录后才能进入后台执行任何操作。

编号 需求条目
FR-01-1 系统内有且仅有一个卖家账号,采用「用户名 + 密码」方式认证
FR-01-2 账号的初始化方式(预置数据 / 自行建表)由开发方决定,实现即可
FR-01-3 未登录状态下无法访问后台;发布、冻结、查看意向人、标记结果等操作均须先登录
FR-01-4 修改密码时必须校验原密码,校验通过方可设置新密码
FR-01-5 新密码长度不少于 8 位
FR-01-6 本版本**不提供「退出登录」**功能

优先级:高(阻塞后续全部后台功能)


FR-02 商品发布

描述:卖家在后台发布商品,填写 4 项商品信息。

商品字段规格:

字段 必填 类型 / 限制
名称 ✅ 文本,不设字数上限
描述 ❌ 文本,不设字数上限,允许留空
图片 ❌ 最多 1 张主图;格式 JPG / PNG;单张 ≤ 5MB;未上传时使用占位图
价格 ✅ 数值,必须 > 0;人民币;保留两位小数(如 9.90)
编号 需求条目
FR-02-1 同一时间在售商品有且仅有一件
FR-02-2 已有一件在售时,不允许再发布新商品
FR-02-3 名称、价格为必填项,缺失时给出提示并阻止提交
FR-02-4 描述可留空,图片可不上传(自动使用占位图)
FR-02-5 价格必须大于 0,格式非法(0、负数、非数字)时给出提示并阻止提交
FR-02-6 图片超出 5MB 或格式非 JPG/PNG 时,给出提示并阻止上传
FR-02-7 商品发布后即进入「在售」状态,买家可见
FR-02-8 发布后商品信息不可修改(澄清结论未提及修改能力,按不可改处理;如需修改需重新发布)

优先级:高

⚠️ 待确认:FR-02-8「发布后不可修改」是基于澄清结论「未提及修改」的推断,建议在第 2 次评审前与助教复核。


FR-03 商品浏览与意向提交

描述:买家浏览在售商品,填写信息提交购买意向。

编号 需求条目
FR-03-1 买家无需登录即可浏览「在售」状态的商品
FR-03-2 商品在「已冻结」状态下仍可被浏览,但页面显示**「商品交易中」**提示
FR-03-3 「已冻结」状态下不接收新的购买意向,买家无法提交
FR-03-4 提交意向需填写 姓名、联系电话,两项均必填
FR-03-5 联系电话不做格式校验,任意输入均接收
FR-03-6 联系电话不做唯一性校验与去重,同一号码可重复提交意向
FR-03-7 每次提交都是独立的一次意向记录,各自拥有独立口令码
FR-03-8 提交成功后,系统生成口令码并当场显示给买家
FR-03-9 意向按提交时间正序进入队列,规则为严格先到先得
FR-03-10 系统内无在售商品时,买家页显示**「暂无商品在售」**空态提示,不渲染商品卡片与提交表单(v1.1 补录,页面已实现)

优先级:高


FR-04 意向队列与排队规则

描述:多名买家同时有意向时,按队列规则管理。

编号 需求条目
FR-04-1 队列可容纳多个意向,不限制为一人
FR-04-2 队列排序规则:按意向提交时间正序(先到先得)
FR-04-3 同一时间仅队列首位可进入线下交易环节
FR-04-4 买家可凭口令码撤销自己的意向
FR-04-5 撤销后该意向从队列中移出
FR-04-6 撤销后,其后所有意向的位次自动前移(顺位递补)
FR-04-7 队首交易失败时,后一位自动递补成为新的队首
FR-04-8 口令码失效规则(v1.1 正式化):口令码不设时间有效期,随意向生命周期——意向为 pending 时有效(冻结期仍然有效);意向进入 trading 或到达终态(success / failed / cancelled)后即失效,不可再凭码操作
FR-04-9 凭口令码查询意向状态:本版本不提供(v1.1 显式划为范围外)。口令码仅提交成功时当场展示一次,不支持后续凭码查询,防止口令码被他人拾获后刺探队列信息;列入第 2 次迭代候选
FR-04-10 凭口令码修改意向信息:本版本不提供(v1.1 显式划为范围外)。姓名/电话提交后不可修改,如填写有误可凭口令码撤销后重新提交(FR-04-4 已覆盖该场景);列入第 2 次迭代候选

优先级:高(逻辑复杂度最高,需重点测试)

✅ 已于 v1.1 定义:口令码的生成算法、存储方式、校验规则与失效规则见 FR-04-8 ~ FR-04-10,设计细节见 Wiki《口令码与队列规则说明》(设计定义与代码实现一一对应)。


FR-05 卖家后台 · 意向购买人管理

描述:卖家登录后可查看当前商品的意向购买人列表。

编号 需求条目
FR-05-1 卖家可查看当前在售/冻结商品的意向购买人列表
FR-05-2 列表展示字段:姓名、联系电话、意向提交时间
FR-05-3 列表按提交时间顺序展示,便于卖家识别队首
FR-05-4 卖家从列表中选择一位买家进入线下交易

优先级:高


FR-06 商品冻结与解冻

描述:商品进入交易或卖家主动操作时冻结,冻结期间不接收新意向。

编号 需求条目
FR-06-1 自动冻结:卖家选定买家进入交易时,系统自动将商品由「在售」转为「已冻结」
FR-06-2 手动冻结:卖家可在后台手动冻结商品
FR-06-3 自动冻结与手动冻结是同一个状态,不做区分
FR-06-4 冻结期间不再接收新的购买意向,买家点「我要买」显示**「商品交易中」**
FR-06-5 冻结期间商品对买家仍然可见,但无法购买、无法提交意向
FR-06-6 后台提供冻结 / 解冻开关,卖家在交易进行中亦可手动解冻
FR-06-7 解冻后商品恢复「在售」,重新接收新意向

优先级:高


FR-07 交易结果标记

描述:线下交易完成后,卖家回后台标记结果。

编号 需求条目
FR-07-1 交易结果只能由卖家在后台标记,买家侧无此入口
FR-07-2 结果分两档:成功 / 失败
FR-07-3 系统不参与结果判定,也不自动判定
FR-07-4 本版本无超时机制,不存在超时自动判失败
FR-07-5 标记「成功」:商品撤下,转入历史记录
FR-07-6 标记「失败」:商品恢复「在售」并重新上线
FR-07-7 标记「失败」后,若队列中仍有排队的意向,按顺序递补进入交易

优先级:高


FR-08 历史商品记录

描述:商品成交或下架后,保留可查询的历史记录。

编号 需求条目
FR-08-1 卖家可在后台查看历史商品列表
FR-08-2 历史列表按时间倒序排列,支持翻页
FR-08-3 商品级保留字段:商品名称、描述、图片、价格、发布时间、最终交易结果(成功/失败)、交易时间
FR-08-4 每条历史商品可点进详情,查看该商品的意向购买人列表
FR-08-5 意向人级保留字段:姓名、联系电话、意向提交时间、每人对应的交易结果
FR-08-6 历史记录为只读,不提供修改与删除

优先级:中(不影响主流程,但属于基线要求)

⚠️ 待确认:FR-08-2「按时间倒序」中的"时间"指发布时间还是交易时间,澄清未明确。默认采用交易时间,如需调整请确认。


5 非功能需求
编号 类别 需求
NFR-01 终端范围 仅 Web 网页端;Android / iOS / 微信小程序不在本版本范围
NFR-02 数据一致性 同一时间在售商品唯一;队列位次在撤销/递补后必须正确重排
NFR-03 并发处理 多人同时提交意向时,入库顺序必须严格反映提交时间先后
NFR-04 数据持久化 商品、意向、历史记录、口令码须持久化存储,服务重启不丢失
NFR-05 安全性 后台功能须登录后访问,未登录访问后台一律重定向至登录页(后台入口清晰);卖家密码以 sha256 + salt 哈希存储,数据库不落明文;口令码不可被他人猜测或枚举
NFR-06 可用性 关键操作(提交、冻结、标记结果)需有明确的成功/失败反馈;边界空态(无在售商品、队列无有效意向)需有明确提示,不出现空白页
NFR-07 操作留痕 关键操作记录时间戳:意向提交(created_at)、商品发布(published_at)、交易结果(traded_at)本版本已实现;冻结与改密操作的专属时间戳第 2 次迭代补齐(当前库表无对应字段,如实标注)(v1.1 新增)
NFR-08 历史可检索 历史商品列表除倒序 + 分页外,支持按商品名称检索定位——第 2 次迭代实现(当前版本为倒序 + 翻页浏览)(v1.1 新增)

6 验收标准(MVP)

对照课程《系统验收标准》五方面:

# 方面 本版本验收要求 成果物
1 需求 本文件(需求规格说明书)+ 角色用例 本文件
2 代码 完整源代码,规范目录结构与版本命名,可从 Git 平台下载 项目简写-版本号.zip
3 构建 提供构建配置(如 pom.xml)、构建工具及版本、构建过程手册 构建文件 + 手册
4 部署 提供运行环境说明、安装部署过程、部署脚本 部署脚本 + 手册
5 运行 每个功能点的测试用例设计及清单、自动化执行脚本、运行演示录屏 测试用例文档 + 脚本 + 录屏视频

MVP 功能验收清单(逐条核对):

序 验收项 通过标准
1 卖家登录 正确账号密码可进入后台;错误密码被拒绝
2 商品发布 4 项字段按规则校验;发布后进入在售状态
3 商品浏览 买家可见在售商品完整信息;无在售商品时显示「暂无商品在售」空态
4 提交意向 姓名电话必填校验生效;口令码正确生成并显示
5 排队规则 多意向按提交时间正序排列;仅队首可进入交易
6 撤销意向 凭口令码可撤销;队列自动顺位前移;口令码失效后凭码操作被拒
7 查看意向人 后台可见姓名、电话、提交时间
8 冻结 自动/手动冻结均生效;冻结期不收新意向并显示「商品交易中」;商品仍可见
9 解冻 手动解冻后恢复在售并可收新意向
10 标记成功 商品撤下并进入历史记录
11 标记失败 商品恢复在售;排队者自动递补
12 历史记录 商品级 + 意向人级字段完整;倒序排列;可翻页
13 修改密码 需验原密码;新密码 ≥8 位
14 范围核对 无评价功能;仅 Web 端

7 需求追溯矩阵
需求编号 需求名称 优先级 负责人 对应验收项
FR-01 卖家登录与账号管理 高 胡成溯 1、13
FR-02 商品发布 高 黄程宇 2
FR-03 商品浏览与意向提交 高 黄程宇 3、4
FR-04 意向队列与排队规则 高 周到 5、6
FR-05 卖家后台 · 意向购买人管理 高 胡成溯 7
FR-06 商品冻结与解冻 高 周到 8、9
FR-07 交易结果标记 高 胡成溯 10、11
FR-08 历史商品记录 中 胡成溯 12
NFR-01 终端范围 — 全员 14

8 待确认事项
# 事项 影响 处理方式
1 口令码的生成、存储、校验规则与有效期 FR-04 撤销功能 ✅ 已定义关闭(v1.1):见 FR-04-8 ~ FR-04-10 与《口令码与队列规则说明》;有效期规则为「不设时间有效期,随意向生命周期」
2 商品发布后是否允许修改 FR-02-8 第 2 次评审前与助教复核
3 历史记录"倒序"依据的时间字段 FR-08-2 暂定交易时间,确认后修订
4 同一买家重复提交时,是否合并显示 FR-03-6 澄清已明确「不合并」,各自独立
5 必做/选做划分与验收标准归属 项目考核 助教答复超出澄清范围,由本组对照课程验收标准自定

9 变更记录
版本 日期 变更内容 修订人
v1.0 2026-10-04 首版创建,依据需求澄清访谈结论编制 周到
v1.1 2026-10-07 依据第 1 次评审助教点评补强:①口令码失效规则正式化(FR-04-8),凭码查询/修改显式划为范围外(FR-04-9/10),关闭待确认事项 1;②商品状态显式化「已恢复在售」语义态(复用 on_sale);③NFR-05 扩写密码哈希存储与后台入口,新增 NFR-07 操作留痕、NFR-08 历史检索;④补 FR-03-10 空态提示,验收清单第 3/6 条补充通过标准 周到

本文件为第 5 组 MVP 版本需求基线,后续迭代在此文件基础上增补需求章节。

成果物 · 在线购物系统 产品订单(Product Backlog)

在线购物系统 产品订单(Product Backlog)
项目 内容
项目名称 在线购物系统(挑战升级)
版本范围 MVP(第 1 次迭代)
项目组号 第 5 组
产品负责人 周到(Product Owner)
编制日期 2026-10-04
依据文档 《需求规格说明书-第5组》v1.0、《需求澄清结论-第5组》

文档说明:产品订单(Product Backlog)是项目的概要文档,包含所有特性的粗略描述与估算。
本文件覆盖 MVP 迭代的完整需求池;后续迭代的新增特性在此表末尾追加,不删除历史条目。


一、优先级定义
等级 代号 含义 处理原则
高 P0 阻塞级。缺失则主流程走不通,评审演示无法进行 本次迭代必须全部完成
中 P1 完整级。主流程可跑但功能不完整,验收会扣分 本次迭代应完成
低 P2 增强级。体验优化、非基线要求 有余力再做,可延后

故事点估算:采用斐波那契数列(1 / 2 / 3 / 5 / 8),表示相对工作量,非工时。


二、MVP 产品订单(Sprint 1 范围)
EPIC-A 卖家账号与后台(对应 FR-01)
ID 用户故事 优先级 故事点 验收标准 认领人
A-1 作为卖家,我希望用用户名和密码登录,以便进入后台管理商品 P0 3 正确凭据可进入后台;错误密码被拒绝并提示;未登录访问后台被拦截 胡成溯
A-2 作为卖家,我希望修改密码时需先验证原密码,以便保障账号安全 P1 2 原密码错误时拒绝修改;新密码少于 8 位时拒绝并提示 胡成溯

说明:A-2 为 P1——不影响主流程演示,但属于基线明确要求,应完成。本版本不做退出登录。


EPIC-B 商品发布与浏览(对应 FR-02、FR-03)
ID 用户故事 优先级 故事点 验收标准 认领人
B-1 作为卖家,我希望发布商品时填写名称、描述、图片、价格,以便把商品挂上货架 P0 5 名称/价格必填校验生效;描述可空;价格 >0 且两位小数;发布后状态为「在售」 黄程宇
B-2 作为卖家,我希望同一时间只能有一件在售商品,以便符合单商品售卖的规则 P0 2 已有一件在售时发布新商品被拒绝并提示 黄程宇
B-3 作为卖家,我希望上传图片时校验格式和大小,以便避免无效文件 P1 2 非 JPG/PNG 或 >5MB 时拒绝并提示;未上传时使用占位图 黄程宇
B-4 作为买家,我希望无需注册就能浏览在售商品,以便快速了解商品信息 P0 2 未登录可访问商品页;商品字段完整展示 黄程宇

EPIC-C 购买意向提交(对应 FR-03)
ID 用户故事 优先级 故事点 验收标准 认领人
C-1 作为买家,我希望填写姓名和电话提交购买意向,以便参与购买 P0 3 两项均必填,缺一不可提交;电话不做格式校验 黄程宇
C-2 作为买家,我希望提交后拿到一个口令码,以便后续撤销我的意向 P0 3 提交成功即生成并当场显示口令码;口令码与该次意向唯一绑定 周到
C-3 作为系统,我希望同一号码可重复提交且互不干扰,以便符合"不注册不建号"的规则 P1 1 同号码多次提交生成多条独立意向,各有独立口令码,互不覆盖 黄程宇

EPIC-D 意向队列与排队规则(对应 FR-04)★ 核心难点
ID 用户故事 优先级 故事点 验收标准 认领人
D-1 作为系统,我希望多个意向按提交时间正序排队,以便实现先到先得 P0 5 3 人以上连续提交后,队列顺序与提交时间严格一致 周到
D-2 作为卖家,我希望同一时间只有队首能进入交易,以便避免重复成交 P0 2 非队首买家不可被选定进入交易 周到
D-3 作为买家,我希望凭口令码撤销自己的意向,以便临时改变主意 P0 3 正确口令码可撤销;错误口令码被拒绝;撤销后该意向从队列消失 周到
D-4 作为系统,我希望撤销后队列自动顺位前移,以便后续买家不受影响 P0 3 撤销第 2 位后,原第 3 位变为第 2 位,依次前移 周到
D-5 作为系统,我希望队首交易失败后自动递补下一位,以便交易机会不中断 P0 3 标记失败后,原第 2 位自动成为队首并可进入交易 周到

⚠️ 设计前置:D-2~D-5 依赖口令码机制与队列位次算法,须先出设计说明再编码。此项为本迭代技术风险最高的模块。


EPIC-E 卖家后台 · 意向购买人管理(对应 FR-05)
ID 用户故事 优先级 故事点 验收标准 认领人
E-1 作为卖家,我希望查看意向购买人列表,以便选择交易对象 P0 3 列表展示姓名、联系电话、意向提交时间;按提交顺序排列 胡成溯
E-2 作为卖家,我希望从列表中选择一位买家进入交易,以便开始线下洽谈 P0 2 选定后商品自动转为「已冻结」 胡成溯

EPIC-F 商品冻结与解冻(对应 FR-06)★ 状态机核心
ID 用户故事 优先级 故事点 验收标准 认领人
F-1 作为系统,我希望商品进入交易时自动冻结,以便锁定当前交易 P0 3 选定买家后状态自动由「在售」→「已冻结」 周到
F-2 作为卖家,我希望能在后台手动冻结商品,以便暂停售卖 P0 2 手动冻结后状态为「已冻结」,与自动冻结同一状态 周到
F-3 作为买家,我希望冻结期间仍能看到商品但无法购买,以便了解商品动态 P0 3 商品仍可见;显示「商品交易中」;点购买被拒绝 周到
F-4 作为系统,我希望冻结期间不接收新意向,以便避免交易冲突 P0 2 冻结期提交意向被拒绝并提示 周到
F-5 作为卖家,我希望交易中也能手动解冻,以便应对谈崩等情况 P1 2 后台有冻结/解冻开关;解冻后恢复「在售」并可收新意向 周到

EPIC-G 交易结果标记(对应 FR-07)
ID 用户故事 优先级 故事点 验收标准 认领人
G-1 作为卖家,我希望标记交易成功,以便结束交易并撤下商品 P0 2 标记成功后商品撤下,转入历史记录 胡成溯
G-2 作为卖家,我希望标记交易失败,以便商品重新上线 P0 3 标记失败后商品恢复「在售」;若队列有他人则自动递补 胡成溯
G-3 作为系统,我希望只有卖家能标记结果、且无超时机制,以便符合线下交易的规则 P0 1 买家侧无标记入口;系统不自动判定结果 胡成溯

EPIC-H 历史商品记录(对应 FR-08)
ID 用户故事 优先级 故事点 验收标准 认领人
H-1 作为卖家,我希望查看历史商品列表,以便回顾已完成的交易 P1 3 按时间倒序排列;支持翻页 胡成溯
H-2 作为卖家,我希望历史商品保留完整信息,以便有据可查 P1 3 保留名称、描述、图片、价格、发布时间、最终结果、交易时间 胡成溯
H-3 作为卖家,我希望点进历史商品能看意向人列表,以便追溯交易对象 P1 3 展示姓名、电话、提交时间、每人对应交易结果 胡成溯

三、汇总统计
3.1 按优先级
优先级 条目数 故事点小计
P0 20 55
P1 7 16
合计 27 71
3.2 按认领人
认领人 条目数 故事点 主要模块
胡成溯 10 25 账号、后台意向人、结果标记、历史记录
黄程宇 6 15 商品发布、浏览、意向提交
周到(PM) 11 31 口令码、队列排队、撤销递补、冻结解冻

⚠️ PM 的故事点偏高(31/71 ≈ 44%)。原因:认领的队列与冻结是逻辑最复杂的两个模块,本身故事点虚高,且属首次实现。
建议:编码阶段若进度吃紧,优先保 D-1/D-3/D-4(队列基础能力),D-5(失败递补)可与 G-2 合并调试。
若仍需平衡,可将 B-3(图片校验)或 H-3(历史意向人)从黄程宇处划转给组长。

3.3 迭代容量判断

三人组、两周迭代(10/4 – 10/8 为首次交付窗口,之后每两周一次)。

本次交付窗口的冲刺订单(Sprint Backlog)应只圈 P0 条目:

范围 条目 说明
本次必交(P0) 20 条 / 55 点 全部 P0,构成可运行 MVP
本次应做(P1) 7 条 / 16 点 时间允许则做,不做不阻塞演示

决策建议:以「主流程能完整演示一遍」为交付底线。即:卖家登录 → 发布商品 → 买家提交意向 → 查看意向人 → 进入交易冻结 → 标记成功/失败 → 历史记录。这条链路上的 P0 条目一条都不能缺。


四、本次迭代目标(对应报告 3.4 节)

迭代目标:交付在线购物系统 MVP 基线版本,实现「单商品售卖」的完整业务闭环。

具体到功能需求点,本次迭代需达成以下 8 项:

  1. 卖家可凭账号密码登录后台(FR-01)
  2. 卖家可发布商品,同一时间仅一件在售(FR-02)
  3. 买家无需注册即可浏览商品并提交意向,获得口令码(FR-03)
  4. 意向按提交时间先到先得排队,仅队首可进入交易(FR-04)
  5. 卖家可查看意向购买人列表并选定交易对象(FR-05)
  6. 商品进入交易自动冻结,冻结期不收新意向(FR-06)
  7. 卖家可标记交易成功/失败,失败后商品恢复并递补(FR-07)
  8. 历史商品记录完整保留并可翻页查询(FR-08)

可度量的验收依据:见《需求规格说明书-第5组》第 6 章「MVP 功能验收清单」14 条。


五、后续迭代待办池(Backlog Pool)

以下为基线之外、留待后续迭代排入的候选特性(本次不做):

候选方向 示例特性
多商品 / 多卖家 商品列表、分类、搜索、多卖家入驻
用户体系 买家注册登录、个人中心、订单历史
在线支付 支付接口、订单状态机、退款
营销 优惠券、满减、限时折扣
评价 买家评价、卖家评分(澄清已明确本版本不做)
库存 库存计数、自动补货
终端扩展 Android / iOS / 微信小程序(澄清已明确本版本仅 Web)

六、变更记录
版本 日期 变更内容 修订人
v1.0 2026-10-04 首版创建,覆盖 MVP 全部 27 条特性 周到
v1.1 2026-10-07 修正汇总统计:P0 20 条 55 点、P1 7 条 16 点、合计 27 条 71 点(原 48/19/67 与分 EPIC 明细不符);按认领人统计同步更正 周到(AI 协助核算)

本文件由产品负责人周到维护(Product Backlog、需求规格说明书、验收标准均由其负责)。每次迭代评审后,在此表追加新增特性并重新排序优先级,不删除历史条目。

成果物 · 口令码与队列规则说明

口令码与队列规则说明
项目 内容
项目名称 在线购物系统(挑战升级)· 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 一致 周到

成果物 · 第1次测试记录(交叉测试)

第1次测试记录(交叉测试)
项目 内容
测试人 周到(产品经理)
被测人 胡成溯(组长)—— 卖家后台模块(FR-01 / FR-05 / FR-07 / FR-08)
测试日期 2026-10-07
测试方式 自动化(fastapi.testclient TestClient)+ 代码走查
测试依据 《需求规格说明书-第5组》第 6 章「MVP 功能验收清单」14 条
被测代码 main.py(后台路由)、auth.py(登录/会话/改密)
测试脚本 卖家后台/test_cross_review.py(本次新增,独立视角编写,非重复已有用例)

闭环互测规则:周到测胡成溯。此前 test_smoke 30/30、test_b_module 18/18、test_d_module 10/10 均已通过; 本次交叉测试为独立视角,按 14 条验收清单重新逐条对照,不重复已有测试。


一、验收清单对照表
序号 验收项 测试结果 测试要点说明
1 卖家登录 ✅ 通过 正确凭据(admin)登录返回 303 并签发 seller_session 签名 cookie,可进入后台;错误密码返回「用户名或密码错误」;未登录访问 /admin 被 303 重定向到 /login
2 商品发布 ✅ 通过 接口契约简测:POST /admin/product 发布后提示「商品发布成功」,商品进入 on_sale 在售状态(字段级校验由黄程宇模块测试覆盖,此处不重复)
3 商品浏览 ✅ 通过 买家无需登录访问 /product,可见商品名称、描述、价格(¥12.50 两位小数格式正确)
4 提交意向 ✅ 通过 缺姓名 / 缺电话均被「姓名与联系电话均为必填项」拦截且不入库;合法提交成功,8 位十六进制口令码当场显示,且与库中 token_code 一致
5 排队规则 ✅ 通过 3 个意向在后台按提交时间正序排列(甲→乙→丙);非队首请求进入交易被「仅队首」拒绝;后台仅队首「进入交易」按钮可点,其余禁用
6 撤销意向 ✅ 通过 凭口令码撤销中间意向成功,状态转 cancelled 并移出队列;后续意向位次自动前移,剩余队列保持正序
7 查看意向人 ✅ 通过 后台列表含「姓名 / 联系电话 / 提交时间」表头与对应数据,提交时间与库中 created_at 一致
8 冻结 ✅ 通过 手动冻结与进入交易自动冻结均生效(同一 frozen 状态);冻结期商品对买家仍可见并显示「商品交易中」;冻结期提交新意向被拒且不入库
9 解冻 ✅ 通过 手动解冻提示「商品已解冻,恢复在售」,状态恢复 on_sale,随后新意向提交成功
10 标记成功 ✅ 通过 标记成功后商品撤下转 delisted,写入 traded_at 与 final_result='成功';队首意向转 success;买家页显示「暂无商品在售」
11 标记失败 ✅ 通过 两个分支均验证:队列非空时队首转 failed、下一位自动递补为 trading、商品保持冻结;队列清空时商品恢复 on_sale
12 历史记录 ✅ 通过 造 6 条历史(1 条真实成交 + 5 条构造):列表按交易时间倒序,商品级字段(名称/价格/最终结果/发布时间/交易时间)完整;每页 5 条,第 2 页显示最早 1 条,页码「第 1/2 页(共 6 条)」正确;详情页商品级(名称/描述/价格/时间/结果)+ 意向人级(姓名/电话/提交时间/每人交易结果:成功/失败/已撤销)完整
13 修改密码 ✅ 通过 原密码错误被拒;7 位新密码被「不得少于 8 位」拒绝;合法修改成功后新密码可登录、旧密码失效;测完已改回 admin12345
14 范围核对 ✅ 通过 买家页、后台页、历史页 HTML 均无「评价」字样;对 main.py 路由表全量比对:15 个路由(13 个业务路由 + /static 挂载 + FastAPI 默认 /openapi.json,docs/redoc 已关闭)与预期完全一致,无 App/小程序/评价相关路由

汇总:14 通过 / 0 失败(共 14 项)。


二、bug 记录表
编号 发现问题 严重度 根因 处理
— 本轮未发现缺陷,14 条全部一次通过 — — —

测试说明:本次交叉测试按 14 条验收清单逐条独立设计场景(含撤销顺位前移、递补两分支、6 条历史翻页、改密回滚等此前用例未覆盖的组合路径),被测代码 main.py / auth.py 未做任何修改,全部一次通过。


三、结论

本次交叉测试(周到 → 胡成溯,卖家后台 FR-01/05/07/08)全部 14 条验收项一次通过,未发现缺陷。被测模块的登录鉴权、意向人管理、交易结果标记(含递补两分支)、历史记录(含分页与两级字段)均符合《需求规格说明书》第 6 章验收标准。测试后回归运行 test_smoke.py,结果 30/30 无回归。

残留风险与建议
  1. FR-06-6 与实现口径不一致(建议需求侧确认):SRS FR-06-6 字面为「卖家在交易进行中亦可手动解冻」,而实现约定交易进行中禁止解冻(services_state.py 的 unfreeze_product 主动拦截,代码中有设计说明:防止破坏「仅队首进入交易」的队列语义),本次交叉测试按实现口径验证通过。该行为更稳妥,但属于对需求条目字面的偏离,建议在第 2 次评审前与助教确认,并在 SRS 中补一条修订记录。
  2. 历史记录「倒序」时间字段:当前按交易时间(traded_at)倒序,与 SRS 第 8 章「待确认事项 #3」的暂定方案一致,待需求方正式确认。
  3. 建议下轮迭代补齐交易中禁止解冻这一约束在后台界面上的前置提示(当前为操作后报错提示,体验上可提前 disabled 置灰——后台已有 disabled 处理,属锦上添花项)。

尾注:测试脚本 test_cross_review.py 已入库(卖家后台目录),执行 python test_cross_review.py 可复跑复现;测试库写入系统临时目录,不污染交付数据;改密用例测完自动改回 admin12345。

教师点评

(评审后填写)

⚠️ **GitHub.com Fallback** ⚠️