在线购物系统需求规格说明书 - casf73/Software-Engineering-Practice GitHub Wiki
在线购物系统需求规格说明书
- 文档版本:V3.0
- 修订日期:2026-11-05
- 项目名称:在线购物系统
- 项目组号:第8组
- 本版范围:基础功能、第二轮完善功能及第三轮挑战需求A.1、A.2
术语表
| 术语 | 定义 |
|---|---|
| 访客 | 无需注册即可浏览商品,填写姓名电话提交意向,并凭口令码操作。 |
| 注册客户 | 注册后可登录、提交客户意向,并查看本人购买历史。 |
| 卖家 | 唯一后台账号,管理商品、分类、库存、交易和客户资料。 |
| 选中商品 | 页面当前查看或操作的商品,不代表系统只能存在一个有效商品。 |
| 购买意向 | 针对指定商品的一件购买申请。 |
| FIFO | 按服务端queue_at升序排列,相同时间按意向编号升序。 |
| 队首 | 某件商品等待队列中的第一条有效意向。 |
| 口令码 | 与单条意向绑定的持有者凭据,结束后按规则失效。 |
| 在售 | 商品可公开展示,并可接收新的购买意向。 |
| 手动冻结 | 卖家暂停该商品新意向,保留队列,可手动解除。 |
| 交易冻结 | 该商品已进入队首交易,必须先登记结果。 |
| 库存 | 商品可售数量,成功交易减1,归零下架。 |
| 两级分类 | 一级与二级父子分类结构。 |
| 商品快照 | 下单时保存的商品名称和价格,商品编辑不回写。 |
| 默认交易地点 | 客户注册时保存的常用交易地点。 |
| 本次交易地点 | 客户提交某条意向时确认的地点,可与默认地点不同。 |
| 富媒体描述 | 允许的格式化文字及本地描述图片。 |
| 购买历史 | 客户账号下保留的意向记录及状态,不因口令码失效而删除。 |
1 项目概述
本系统支持单卖家在线展示多个商品、管理购买意向及登记线下交易结果。
访客可以免登录浏览和搜索商品,提交姓名电话后领取口令码。注册客户可以保存电话和默认交易地点,并在登录后查看本人购买历史。
每件商品具有独立的库存、状态和FIFO队列。卖家开始交易时,系统自动选择该商品队首买家;交易结果由卖家登记。
系统不提供线上支付,交易在线下完成。
2 迭代范围
| 轮次 | 主要内容 |
|---|---|
| 第一次 | 基础商品展示、访客意向、口令码、FIFO、交易结果、主动下架及图片上传。 |
| 第二次 | 等待联系信息修改、手动冻结解冻、卖家密码修改及旧会话撤销。 |
| 第三次 | A.1多商品、两级分类、库存、搜索、多图富媒体;A.2客户注册、本人历史和卖家客户查询。 |
第三轮迭代日期为2026-10-22至2026-11-05。第四轮于2026-11-05开始,结束日期暂定。
3 用户角色与权限
| 角色 | 允许操作 |
|---|---|
| 访客 | 浏览、搜索、筛选商品;提交指定商品意向;凭码查询、修改等待联系信息或撤销。 |
| 注册客户 | 保留访客浏览能力;注册登录;确认本次交易地点;查看本人购买历史。 |
| 卖家 | 管理商品、分类、库存、媒体、队列、交易、账号和注册客户资料。 |
3.1 权限规则
- 商品公开浏览不要求登录或口令码。
- 卖家管理接口必须验证卖家身份。
- 本人历史和客户意向接口必须验证客户身份。
- 客户身份不能替代卖家身份。
- 本人历史使用服务端会话客户编号。
- 不允许客户端传入其他客户编号查看他人历史。
- 卖家查询客户资料不返回密码或密码哈希。
- 卖家查询客户历史不返回可操作的客户口令码。
- 客户和卖家会话身份分开维护。
4 挑战需求A.1 商品管理升级
4.1 多商品同时发布
- 系统允许多个商品同时有效。
- 每件商品使用独立编号。
- 商品状态、库存、等待队列和当前交易对象分别维护。
- 操作一个商品不改变其他商品状态、库存和排位。
- 当前页面通过商品编号确定操作对象。
- 旧唯一商品接口仅在上下文唯一时使用,多商品无法确定目标时返回冲突。
4.2 商品信息
| 字段 | 规则 |
|---|---|
| 名称 | 必填,最多80字符。 |
| 价格 | 必填,大于0,最多2位小数,整数部分最多10位。 |
| 库存 | 0~1000000整数。 |
| 分类 | 可关联一个一级或二级分类,也可未分类。 |
| 相册 | 0~9张JPG/PNG图片,单张不超过5MB。 |
| 描述 | 选填,最多20000字符;清理后的内容也受长度限制。 |
编辑交易中的商品应被拒绝,避免交易过程中改变库存或商品资料。
4.3 两级类别管理
- 卖家可新增、编辑和删除分类。
- parent_id为空表示一级分类。
- 二级分类只能关联一级父类。
- 禁止三级分类。
- 禁止父子循环和关联自身。
- 同一父类下名称不能重复,大小写不区分重复。
- 不同父类允许同名子类。
- 存在子类或商品引用时不能直接删除。
- 包含子类的一级分类不能直接降为二级。
- 一级分类筛选应包含其二级分类商品。
4.4 库存及售罄下架
- 每条购买意向对应1件商品。
- 成功交易扣减1件库存。
- 交易失败不扣减库存。
- 库存大于0时,成功交易后商品恢复在售。
- 库存归零时,商品自动下架。
- 售罄后,该商品其余等待意向结束,口令码失效。
- 库存0发布的商品直接为下架状态。
- 下架商品补货后,需要执行重新上架。
- 重新上架不自动恢复已结束的意向。
- 重复登记同一笔结果不能再次扣库存。
4.5 商品浏览、搜索和分页
- 买家可以浏览多个有效商品。
- 下架商品不出现在公开列表。
- 手动冻结和交易中商品仍可展示,但不能接受新意向。
- 搜索范围为商品名称及描述可见文字。
- 搜索忽略大小写。
- 支持一级或二级分类筛选。
- 支持分页,页码从0开始,每页1~100条。
- 无匹配结果时显示空状态。
- 重置筛选后恢复相应商品列表。
4.6 多图相册与富媒体描述
- 每商品最多9张相册图片。
- 图片格式支持JPG和PNG,单张不超过5MB。
- 未上传图片时显示占位内容。
- 保存并展示图片顺序。
- 买家可通过缩略图切换图片。
- 描述支持标题、段落、加粗、斜体、列表及本地图片。
- 服务端清理危险标签及属性。
- 相册地址必须来自允许的本地上传路径。
- 描述再次保存不应破坏已允许的内容和图片。
5 挑战需求A.2 客户升级
5.1 客户注册
注册字段:
| 字段 | 规则 |
|---|---|
| 用户名 | 必填,3~32位文字、数字、下划线或短横线。 |
| 密码 | 必填,8~128位,不允许空白密码。 |
| 电话 | 必填,符合电话格式和长度规则。 |
| 默认交易地点 | 必填,最多200字符。 |
业务规则:
- 用户名大小写归一后唯一。
- 重复注册应拒绝。
- 注册成功自动登录。
- 密码只保存派生结果,不保存明文。
- 对外返回客户资料时不返回密码字段。
5.2 客户登录和退出
- 客户使用用户名和密码登录。
- 错误账号或密码拒绝登录。
- 登录后建立客户身份并轮换会话编号。
- 退出只移除客户身份。
- 未登录时访问本人购买历史应要求登录。
- 客户退出不应清除同一浏览器的卖家身份。
5.3 默认与本次交易地点
- 注册时保存默认交易地点。
- 提交客户意向时,前端默认填入该地点。
- 客户可以修改本次交易地点。
- 本次地点必填,最多200字符。
- 修改本次地点不修改账号默认地点。
- 本次地点随意向保存,供客户历史及卖家查看。
5.4 客户购买历史
- 客户只能查看本人账号提交的购买记录。
- 记录按提交时间及编号倒序分页。
- 展示等待、交易、成功、失败、撤销、作废和下架结束状态。
- 展示商品名称价格快照、本次联系人、电话、地点、时间和有效排位。
- 商品后续改名或改价不改变历史快照。
- 口令码失效不删除历史记录。
- 访客意向不按相同姓名或电话自动认领。
- 客户不能通过修改查询参数访问他人历史。
5.5 卖家客户信息与历史
- 卖家可查询全部注册客户。
- 展示用户名、电话、默认地点和注册时间。
- 支持用户名或电话搜索。
- 支持分页。
- 可查看指定客户购买历史。
- 客户资料不返回密码或密码哈希。
- 卖家历史查询不提供客户口令码。
- 访客和仅客户身份不能访问卖家客户接口。
6 购买意向与FIFO队列
6.1 提交意向
- 意向必须关联指定商品。
- 仅在售且有库存时允许提交。
- 姓名必填,最多80字符。
- 电话必填,长度6~30字符,必须含数字。
- 电话允许数字、加号、括号、空格及短横线。
- 每条意向生成唯一口令码。
- 客户意向额外保存客户归属、交易地点和商品快照。
6.2 队列顺序
- 每件商品独立排队。
- 按queue_at升序排序,同时间按id升序。
- 开始交易自动选择队首。
- 卖家不能跳过队首指定其他买家。
- 重新排队保留同一意向和原口令码,刷新排队时间到队尾。
6.3 修改与撤销
- 等待中的买家可凭码修改姓名和电话。
- 修改保留编号、口令码、提交时间和排位。
- 手动冻结或其他买家交易时,等待者仍可修改或撤销。
- 当前交易中的买家不能修改或撤销。
- 撤销后退出队列并使原码失效。
- 后续买家的等待排位相应前移。
7 交易、冻结与商品状态
7.1 商品状态
| 状态 | 含义 | 后续处理 |
|---|---|---|
| ON_SALE | 在售 | 接收意向,可开始交易、手动冻结或下架。 |
| MANUALLY_FROZEN | 手动冻结 | 保留队列,拒绝新意向,可手动解冻。 |
| IN_TRADE | 交易中 | 拒绝新意向,须先登记交易结果。 |
| DELISTED | 下架 | 不公开接单,有库存后可重新上架。 |
7.2 意向状态
| 状态 | 含义 |
|---|---|
| WAITING | 等待排队。 |
| IN_TRADE | 当前交易对象。 |
| TRADE_SUCCESS | 交易成功。 |
| TRADE_FAILED | 交易失败作废,或商品售罄导致等待意向结束。 |
| VOIDED | 卖家作废等待意向。 |
| CANCELLED | 买家撤销。 |
| PRODUCT_DELISTED | 主动下架导致结束。 |
7.3 交易结果
| 结果 | 库存 | 商品 | 当前意向及原码 |
|---|---|---|---|
| 成功且有余量 | 减1 | 恢复在售 | 成功,原码失效。 |
| 成功后售罄 | 减1至0 | 下架 | 成功,原码失效;其他等待意向结束。 |
| 失败并作废 | 不变 | 恢复在售 | 失败,原码失效。 |
| 失败并重排 | 不变 | 恢复在售 | 返回等待,原码有效,移动队尾。 |
系统不自动开始下一笔交易,也没有超时自动成交。
7.4 手动冻结与主动下架
- 在售商品可手动冻结。
- 手动冻结保留队列和有效口令码。
- 手动冻结须先解冻才能开始交易或主动下架。
- 交易冻结不能通过手动解冻绕过。
- 主动下架只允许在售状态。
- 下架结束该商品等待意向,不影响其他商品。
8 卖家账号和密码
- 系统保留唯一卖家账号。
- 初始账号admin、密码123456仅用于首次建库。
- 卖家可修改密码,必须验证原密码。
- 新密码8~128位。
- 改密增加会话版本,使旧卖家身份失效。
- 重启不恢复初始密码。
- 卖家退出或改密不清除独立客户身份。
密码使用PBKDF2-HMAC-SHA256,600000次迭代、16字节随机盐及32字节派生结果。
9 数据保存
| 表 | 主要内容 |
|---|---|
| products | 商品资料、库存、分类、图片、描述及状态。 |
| categories | 两级分类。 |
| purchase_intents | 商品意向、排队、状态、口令码、客户归属、地点及快照。 |
| customer_accounts | 客户账号、电话、默认地点、密码哈希及注册时间。 |
| seller_accounts | 卖家密码哈希和会话版本。 |
日常运行使用H2文件数据库,重启需保留启动目录下的data。
客户历史基于意向记录和下单快照。系统当前没有独立保存每次重排、每次交易尝试的完整事件审计表。
10 业务流程与状态图
10.1 商品与交易主流程
flowchart TD
A[卖家发布多个商品] --> B[买家浏览搜索并选择商品]
B --> C{是否为登录客户}
C -->|否| D[填写姓名电话]
C -->|是| E[确认联系信息及本次地点]
D --> F[进入指定商品FIFO队列]
E --> F
E --> G[保存客户归属及商品快照]
F --> H[卖家开始队首交易]
H --> I{登记结果}
I -->|失败| J[作废或重新排队 库存不变]
I -->|成功| K[库存减1]
K --> L{库存为0}
L -->|否| M[恢复在售 保留等待队列]
L -->|是| N[下架并结束剩余等待]
J --> M
G --> O[客户本人及卖家查询历史]
10.2 买家浏览与意向操作
flowchart TD
A[浏览 搜索 分类筛选] --> B[选择指定商品]
B --> C[提交访客或客户意向]
C --> D[获得口令码]
D --> E{意向状态}
E -->|等待| F[可查询 修改姓名电话或撤销]
E -->|交易中| G[可查询 不能修改或撤销]
E -->|已结束| H[口令失效 客户历史继续保留]
10.3 卖家后台与客户历史
flowchart TD
A[卖家登录] --> B[管理多商品 分类 库存和媒体]
A --> C[处理指定商品队列及交易]
A --> D[客户管理]
D --> E[用户名或电话搜索]
E --> F[客户资料及购买历史]
F --> G[展示快照和地点 不返回密码及客户口令]
10.4 商品发布与媒体处理
flowchart TD
A[输入名称价格库存和分类] --> B[选择0至9张相册图]
B --> C[编辑富文本及本地描述图片]
C --> D[服务端校验并清理]
D --> E{库存大于0}
E -->|是| F[发布为在售]
E -->|否| G[发布为下架]
10.5 商品状态
stateDiagram-v2
[*] --> ON_SALE: 有库存发布
[*] --> DELISTED: 零库存发布
ON_SALE --> MANUALLY_FROZEN: 手动冻结
MANUALLY_FROZEN --> ON_SALE: 手动解冻
ON_SALE --> IN_TRADE: 开始队首交易
IN_TRADE --> ON_SALE: 失败或成功后仍有库存
IN_TRADE --> DELISTED: 成功售罄
ON_SALE --> DELISTED: 主动下架或库存调整为0
DELISTED --> ON_SALE: 补货后重新上架
10.6 购买意向状态
stateDiagram-v2
[*] --> WAITING: 提交意向
WAITING --> WAITING: 修改联系信息或重新排队
WAITING --> IN_TRADE: 队首开始交易
IN_TRADE --> TRADE_SUCCESS: 成交
IN_TRADE --> TRADE_FAILED: 失败作废
IN_TRADE --> WAITING: 失败重新排队
WAITING --> VOIDED: 卖家作废
WAITING --> CANCELLED: 买家撤销
WAITING --> TRADE_FAILED: 商品售罄
WAITING --> PRODUCT_DELISTED: 主动下架
10.7 口令码有效性
stateDiagram-v2
[*] --> 有效: 提交意向
有效 --> 有效: 等待 冻结 交易或失败重排
有效 --> 失效: 撤销 作废 成交 售罄或下架
失效 --> [*]: 原码不可操作 历史保留
11 第三轮需求测验Demo
需求人员编写独立网页Demo,提前展示第三轮新增功能。
- 技术:Vue3、Element Plus。
- 打开方式:双击index.html。
- 依赖:本地vendor和assets,离线可用。
- 数据:页面内模拟数据,刷新恢复。
- 内容:商品、分类、库存、相册、富文本、客户账号及购买历史。
- 边界:不连接真实接口和数据库,不模拟完整交易,不作为正式系统测试通过证明。
Demo目录:
https://github.com/casf73/Software-Engineering-Practice/tree/main/requirement/第三轮/功能测验Demo
12 验收与测试
12.1 功能验收
- 多个商品可同时发布,并独立维护队列。
- 分类最多两级,关联和筛选结果一致。
- 成功扣库存,失败不扣,售罄自动下架。
- 名称、描述搜索及分页正常。
- 多图和富文本能够保存并再次展示。
- 客户可以注册登录,并保存电话和默认地点。
- 客户只查看本人历史,商品编辑不改变快照。
- 卖家可查询注册客户及对应历史。
- 不泄露密码、密码哈希及客户可操作口令。
12.2 测试组织
- 总用例R301~R308。
- 每总用例8个功能实例及8个接口实例。
- 第三轮共64个功能实例、64个接口实例。
- 功能和接口测试分别放置在对应目录。
- 实例包含详细输入、步骤、预期及设计方法。
- Excel最右侧或说明位置记录测试方法,末行解释方法原理。
12.3 设计方法
| 方法 | 应用 |
|---|---|
| 等价类划分 | 合法与非法输入、匹配与不匹配搜索。 |
| 边界值分析 | 用户名、密码、地点、库存、图片数量及文件大小。 |
| 状态转换 | 在售、冻结、交易、下架及意向结束。 |
| 场景法 | 发布到购买历史的业务操作过程。 |
| 权限隔离 | 不同客户、访客与卖家之间的数据访问。 |
现有记录中第三轮64个接口实例通过,64个页面功能实例待人工执行。接口通过不代表页面功能已人工验收。
13 当前实现范围之外的内容
以下内容保留为后续需求,不计入第三轮已完成成果:
-
商品视频上传及视频自动清理。
-
商品多标签管理。
-
完整的交易与队列事件审计。
-
客户自助修改账号默认交易地点。
-
线上支付。
-
并发压力、性能极限和长时间稳定性测试。# 在线购物系统需求规格说明书
-
文档版本:V3.0
-
修订日期:2026-11-05
-
项目名称:在线购物系统
-
项目组号:第8组
-
本版范围:基础功能、第二轮完善功能及第三轮挑战需求A.1、A.2
术语表
| 术语 | 定义 |
|---|---|
| 访客 | 无需注册即可浏览商品,填写姓名电话提交意向,并凭口令码操作。 |
| 注册客户 | 注册后可登录、提交客户意向,并查看本人购买历史。 |
| 卖家 | 唯一后台账号,管理商品、分类、库存、交易和客户资料。 |
| 选中商品 | 页面当前查看或操作的商品,不代表系统只能存在一个有效商品。 |
| 购买意向 | 针对指定商品的一件购买申请。 |
| FIFO | 按服务端queue_at升序排列,相同时间按意向编号升序。 |
| 队首 | 某件商品等待队列中的第一条有效意向。 |
| 口令码 | 与单条意向绑定的持有者凭据,结束后按规则失效。 |
| 在售 | 商品可公开展示,并可接收新的购买意向。 |
| 手动冻结 | 卖家暂停该商品新意向,保留队列,可手动解除。 |
| 交易冻结 | 该商品已进入队首交易,必须先登记结果。 |
| 库存 | 商品可售数量,成功交易减1,归零下架。 |
| 两级分类 | 一级与二级父子分类结构。 |
| 商品快照 | 下单时保存的商品名称和价格,商品编辑不回写。 |
| 默认交易地点 | 客户注册时保存的常用交易地点。 |
| 本次交易地点 | 客户提交某条意向时确认的地点,可与默认地点不同。 |
| 富媒体描述 | 允许的格式化文字及本地描述图片。 |
| 购买历史 | 客户账号下保留的意向记录及状态,不因口令码失效而删除。 |
1 项目概述
本系统支持单卖家在线展示多个商品、管理购买意向及登记线下交易结果。
访客可以免登录浏览和搜索商品,提交姓名电话后领取口令码。注册客户可以保存电话和默认交易地点,并在登录后查看本人购买历史。
每件商品具有独立的库存、状态和FIFO队列。卖家开始交易时,系统自动选择该商品队首买家;交易结果由卖家登记。
系统不提供线上支付,交易在线下完成。
2 迭代范围
| 轮次 | 主要内容 |
|---|---|
| 第一次 | 基础商品展示、访客意向、口令码、FIFO、交易结果、主动下架及图片上传。 |
| 第二次 | 等待联系信息修改、手动冻结解冻、卖家密码修改及旧会话撤销。 |
| 第三次 | A.1多商品、两级分类、库存、搜索、多图富媒体;A.2客户注册、本人历史和卖家客户查询。 |
第三轮迭代日期为2026-10-22至2026-11-05。第四轮于2026-11-05开始,结束日期暂定。
3 用户角色与权限
| 角色 | 允许操作 |
|---|---|
| 访客 | 浏览、搜索、筛选商品;提交指定商品意向;凭码查询、修改等待联系信息或撤销。 |
| 注册客户 | 保留访客浏览能力;注册登录;确认本次交易地点;查看本人购买历史。 |
| 卖家 | 管理商品、分类、库存、媒体、队列、交易、账号和注册客户资料。 |
3.1 权限规则
- 商品公开浏览不要求登录或口令码。
- 卖家管理接口必须验证卖家身份。
- 本人历史和客户意向接口必须验证客户身份。
- 客户身份不能替代卖家身份。
- 本人历史使用服务端会话客户编号。
- 不允许客户端传入其他客户编号查看他人历史。
- 卖家查询客户资料不返回密码或密码哈希。
- 卖家查询客户历史不返回可操作的客户口令码。
- 客户和卖家会话身份分开维护。
4 挑战需求A.1 商品管理升级
4.1 多商品同时发布
- 系统允许多个商品同时有效。
- 每件商品使用独立编号。
- 商品状态、库存、等待队列和当前交易对象分别维护。
- 操作一个商品不改变其他商品状态、库存和排位。
- 当前页面通过商品编号确定操作对象。
- 旧唯一商品接口仅在上下文唯一时使用,多商品无法确定目标时返回冲突。
4.2 商品信息
| 字段 | 规则 |
|---|---|
| 名称 | 必填,最多80字符。 |
| 价格 | 必填,大于0,最多2位小数,整数部分最多10位。 |
| 库存 | 0~1000000整数。 |
| 分类 | 可关联一个一级或二级分类,也可未分类。 |
| 相册 | 0~9张JPG/PNG图片,单张不超过5MB。 |
| 描述 | 选填,最多20000字符;清理后的内容也受长度限制。 |
编辑交易中的商品应被拒绝,避免交易过程中改变库存或商品资料。
4.3 两级类别管理
- 卖家可新增、编辑和删除分类。
- parent_id为空表示一级分类。
- 二级分类只能关联一级父类。
- 禁止三级分类。
- 禁止父子循环和关联自身。
- 同一父类下名称不能重复,大小写不区分重复。
- 不同父类允许同名子类。
- 存在子类或商品引用时不能直接删除。
- 包含子类的一级分类不能直接降为二级。
- 一级分类筛选应包含其二级分类商品。
4.4 库存及售罄下架
- 每条购买意向对应1件商品。
- 成功交易扣减1件库存。
- 交易失败不扣减库存。
- 库存大于0时,成功交易后商品恢复在售。
- 库存归零时,商品自动下架。
- 售罄后,该商品其余等待意向结束,口令码失效。
- 库存0发布的商品直接为下架状态。
- 下架商品补货后,需要执行重新上架。
- 重新上架不自动恢复已结束的意向。
- 重复登记同一笔结果不能再次扣库存。
4.5 商品浏览、搜索和分页
- 买家可以浏览多个有效商品。
- 下架商品不出现在公开列表。
- 手动冻结和交易中商品仍可展示,但不能接受新意向。
- 搜索范围为商品名称及描述可见文字。
- 搜索忽略大小写。
- 支持一级或二级分类筛选。
- 支持分页,页码从0开始,每页1~100条。
- 无匹配结果时显示空状态。
- 重置筛选后恢复相应商品列表。
4.6 多图相册与富媒体描述
- 每商品最多9张相册图片。
- 图片格式支持JPG和PNG,单张不超过5MB。
- 未上传图片时显示占位内容。
- 保存并展示图片顺序。
- 买家可通过缩略图切换图片。
- 描述支持标题、段落、加粗、斜体、列表及本地图片。
- 服务端清理危险标签及属性。
- 相册地址必须来自允许的本地上传路径。
- 描述再次保存不应破坏已允许的内容和图片。
5 挑战需求A.2 客户升级
5.1 客户注册
注册字段:
| 字段 | 规则 |
|---|---|
| 用户名 | 必填,3~32位文字、数字、下划线或短横线。 |
| 密码 | 必填,8~128位,不允许空白密码。 |
| 电话 | 必填,符合电话格式和长度规则。 |
| 默认交易地点 | 必填,最多200字符。 |
业务规则:
- 用户名大小写归一后唯一。
- 重复注册应拒绝。
- 注册成功自动登录。
- 密码只保存派生结果,不保存明文。
- 对外返回客户资料时不返回密码字段。
5.2 客户登录和退出
- 客户使用用户名和密码登录。
- 错误账号或密码拒绝登录。
- 登录后建立客户身份并轮换会话编号。
- 退出只移除客户身份。
- 未登录时访问本人购买历史应要求登录。
- 客户退出不应清除同一浏览器的卖家身份。
5.3 默认与本次交易地点
- 注册时保存默认交易地点。
- 提交客户意向时,前端默认填入该地点。
- 客户可以修改本次交易地点。
- 本次地点必填,最多200字符。
- 修改本次地点不修改账号默认地点。
- 本次地点随意向保存,供客户历史及卖家查看。
5.4 客户购买历史
- 客户只能查看本人账号提交的购买记录。
- 记录按提交时间及编号倒序分页。
- 展示等待、交易、成功、失败、撤销、作废和下架结束状态。
- 展示商品名称价格快照、本次联系人、电话、地点、时间和有效排位。
- 商品后续改名或改价不改变历史快照。
- 口令码失效不删除历史记录。
- 访客意向不按相同姓名或电话自动认领。
- 客户不能通过修改查询参数访问他人历史。
5.5 卖家客户信息与历史
- 卖家可查询全部注册客户。
- 展示用户名、电话、默认地点和注册时间。
- 支持用户名或电话搜索。
- 支持分页。
- 可查看指定客户购买历史。
- 客户资料不返回密码或密码哈希。
- 卖家历史查询不提供客户口令码。
- 访客和仅客户身份不能访问卖家客户接口。
6 购买意向与FIFO队列
6.1 提交意向
- 意向必须关联指定商品。
- 仅在售且有库存时允许提交。
- 姓名必填,最多80字符。
- 电话必填,长度6~30字符,必须含数字。
- 电话允许数字、加号、括号、空格及短横线。
- 每条意向生成唯一口令码。
- 客户意向额外保存客户归属、交易地点和商品快照。
6.2 队列顺序
- 每件商品独立排队。
- 按queue_at升序排序,同时间按id升序。
- 开始交易自动选择队首。
- 卖家不能跳过队首指定其他买家。
- 重新排队保留同一意向和原口令码,刷新排队时间到队尾。
6.3 修改与撤销
- 等待中的买家可凭码修改姓名和电话。
- 修改保留编号、口令码、提交时间和排位。
- 手动冻结或其他买家交易时,等待者仍可修改或撤销。
- 当前交易中的买家不能修改或撤销。
- 撤销后退出队列并使原码失效。
- 后续买家的等待排位相应前移。
7 交易、冻结与商品状态
7.1 商品状态
| 状态 | 含义 | 后续处理 |
|---|---|---|
| ON_SALE | 在售 | 接收意向,可开始交易、手动冻结或下架。 |
| MANUALLY_FROZEN | 手动冻结 | 保留队列,拒绝新意向,可手动解冻。 |
| IN_TRADE | 交易中 | 拒绝新意向,须先登记交易结果。 |
| DELISTED | 下架 | 不公开接单,有库存后可重新上架。 |
7.2 意向状态
| 状态 | 含义 |
|---|---|
| WAITING | 等待排队。 |
| IN_TRADE | 当前交易对象。 |
| TRADE_SUCCESS | 交易成功。 |
| TRADE_FAILED | 交易失败作废,或商品售罄导致等待意向结束。 |
| VOIDED | 卖家作废等待意向。 |
| CANCELLED | 买家撤销。 |
| PRODUCT_DELISTED | 主动下架导致结束。 |
7.3 交易结果
| 结果 | 库存 | 商品 | 当前意向及原码 |
|---|---|---|---|
| 成功且有余量 | 减1 | 恢复在售 | 成功,原码失效。 |
| 成功后售罄 | 减1至0 | 下架 | 成功,原码失效;其他等待意向结束。 |
| 失败并作废 | 不变 | 恢复在售 | 失败,原码失效。 |
| 失败并重排 | 不变 | 恢复在售 | 返回等待,原码有效,移动队尾。 |
系统不自动开始下一笔交易,也没有超时自动成交。
7.4 手动冻结与主动下架
- 在售商品可手动冻结。
- 手动冻结保留队列和有效口令码。
- 手动冻结须先解冻才能开始交易或主动下架。
- 交易冻结不能通过手动解冻绕过。
- 主动下架只允许在售状态。
- 下架结束该商品等待意向,不影响其他商品。
8 卖家账号和密码
- 系统保留唯一卖家账号。
- 初始账号admin、密码123456仅用于首次建库。
- 卖家可修改密码,必须验证原密码。
- 新密码8~128位。
- 改密增加会话版本,使旧卖家身份失效。
- 重启不恢复初始密码。
- 卖家退出或改密不清除独立客户身份。
密码使用PBKDF2-HMAC-SHA256,600000次迭代、16字节随机盐及32字节派生结果。
9 数据保存
| 表 | 主要内容 |
|---|---|
| products | 商品资料、库存、分类、图片、描述及状态。 |
| categories | 两级分类。 |
| purchase_intents | 商品意向、排队、状态、口令码、客户归属、地点及快照。 |
| customer_accounts | 客户账号、电话、默认地点、密码哈希及注册时间。 |
| seller_accounts | 卖家密码哈希和会话版本。 |
日常运行使用H2文件数据库,重启需保留启动目录下的data。
客户历史基于意向记录和下单快照。系统当前没有独立保存每次重排、每次交易尝试的完整事件审计表。
10 业务流程与状态图
10.1 商品与交易主流程
flowchart TD
A[卖家发布多个商品] --> B[买家浏览搜索并选择商品]
B --> C{是否为登录客户}
C -->|否| D[填写姓名电话]
C -->|是| E[确认联系信息及本次地点]
D --> F[进入指定商品FIFO队列]
E --> F
E --> G[保存客户归属及商品快照]
F --> H[卖家开始队首交易]
H --> I{登记结果}
I -->|失败| J[作废或重新排队 库存不变]
I -->|成功| K[库存减1]
K --> L{库存为0}
L -->|否| M[恢复在售 保留等待队列]
L -->|是| N[下架并结束剩余等待]
J --> M
G --> O[客户本人及卖家查询历史]
10.2 买家浏览与意向操作
flowchart TD
A[浏览 搜索 分类筛选] --> B[选择指定商品]
B --> C[提交访客或客户意向]
C --> D[获得口令码]
D --> E{意向状态}
E -->|等待| F[可查询 修改姓名电话或撤销]
E -->|交易中| G[可查询 不能修改或撤销]
E -->|已结束| H[口令失效 客户历史继续保留]
10.3 卖家后台与客户历史
flowchart TD
A[卖家登录] --> B[管理多商品 分类 库存和媒体]
A --> C[处理指定商品队列及交易]
A --> D[客户管理]
D --> E[用户名或电话搜索]
E --> F[客户资料及购买历史]
F --> G[展示快照和地点 不返回密码及客户口令]
10.4 商品发布与媒体处理
flowchart TD
A[输入名称价格库存和分类] --> B[选择0至9张相册图]
B --> C[编辑富文本及本地描述图片]
C --> D[服务端校验并清理]
D --> E{库存大于0}
E -->|是| F[发布为在售]
E -->|否| G[发布为下架]
10.5 商品状态
stateDiagram-v2
[*] --> ON_SALE: 有库存发布
[*] --> DELISTED: 零库存发布
ON_SALE --> MANUALLY_FROZEN: 手动冻结
MANUALLY_FROZEN --> ON_SALE: 手动解冻
ON_SALE --> IN_TRADE: 开始队首交易
IN_TRADE --> ON_SALE: 失败或成功后仍有库存
IN_TRADE --> DELISTED: 成功售罄
ON_SALE --> DELISTED: 主动下架或库存调整为0
DELISTED --> ON_SALE: 补货后重新上架
10.6 购买意向状态
stateDiagram-v2
[*] --> WAITING: 提交意向
WAITING --> WAITING: 修改联系信息或重新排队
WAITING --> IN_TRADE: 队首开始交易
IN_TRADE --> TRADE_SUCCESS: 成交
IN_TRADE --> TRADE_FAILED: 失败作废
IN_TRADE --> WAITING: 失败重新排队
WAITING --> VOIDED: 卖家作废
WAITING --> CANCELLED: 买家撤销
WAITING --> TRADE_FAILED: 商品售罄
WAITING --> PRODUCT_DELISTED: 主动下架
10.7 口令码有效性
stateDiagram-v2
[*] --> 有效: 提交意向
有效 --> 有效: 等待 冻结 交易或失败重排
有效 --> 失效: 撤销 作废 成交 售罄或下架
失效 --> [*]: 原码不可操作 历史保留
11 第三轮需求测验Demo
需求人员编写独立网页Demo,提前展示第三轮新增功能。
- 技术:Vue3、Element Plus。
- 打开方式:双击index.html。
- 依赖:本地vendor和assets,离线可用。
- 数据:页面内模拟数据,刷新恢复。
- 内容:商品、分类、库存、相册、富文本、客户账号及购买历史。
- 边界:不连接真实接口和数据库,不模拟完整交易,不作为正式系统测试通过证明。
Demo目录:
https://github.com/casf73/Software-Engineering-Practice/tree/main/requirement/第三轮/功能测验Demo
12 验收与测试
12.1 功能验收
- 多个商品可同时发布,并独立维护队列。
- 分类最多两级,关联和筛选结果一致。
- 成功扣库存,失败不扣,售罄自动下架。
- 名称、描述搜索及分页正常。
- 多图和富文本能够保存并再次展示。
- 客户可以注册登录,并保存电话和默认地点。
- 客户只查看本人历史,商品编辑不改变快照。
- 卖家可查询注册客户及对应历史。
- 不泄露密码、密码哈希及客户可操作口令。
12.2 测试组织
- 总用例R301~R308。
- 每总用例8个功能实例及8个接口实例。
- 第三轮共64个功能实例、64个接口实例。
- 功能和接口测试分别放置在对应目录。
- 实例包含详细输入、步骤、预期及设计方法。
- Excel最右侧或说明位置记录测试方法,末行解释方法原理。
12.3 设计方法
| 方法 | 应用 |
|---|---|
| 等价类划分 | 合法与非法输入、匹配与不匹配搜索。 |
| 边界值分析 | 用户名、密码、地点、库存、图片数量及文件大小。 |
| 状态转换 | 在售、冻结、交易、下架及意向结束。 |
| 场景法 | 发布到购买历史的业务操作过程。 |
| 权限隔离 | 不同客户、访客与卖家之间的数据访问。 |
现有记录中第三轮64个接口实例通过,64个页面功能实例待人工执行。接口通过不代表页面功能已人工验收。
13 当前实现范围之外的内容
以下内容保留为后续需求,不计入第三轮已完成成果:
- 商品视频上传及视频自动清理。
- 商品多标签管理。
- 完整的交易与队列事件审计。
- 客户自助修改账号默认交易地点。
- 线上支付。
- 并发压力、性能极限和长时间稳定性测试。