卖家端模块实现 - xych5q/online-shop GitHub Wiki
卖家端模块实现
第 1 组 · 在线购物系统 | 完成人:王振涛 | 完成日期:2026-10-07 对应提交:
f4d8821| 代码位置:server/src/main/java/com/group1/onlineshop/
一、交付内容
| 文件 | 行数 | 职责 |
|---|---|---|
service/SellerService.java |
267 | 登录鉴权、修改密码、工作台总览、历史列表与意向流水 |
service/ProductService.java |
296 | 发布商品、冻结/解冻、交易流转、下架、失败意向处置、图片保存 |
controller/SellerController.java |
167 | 12 个卖家端 REST 接口 |
repository/ProductRepository.java |
— | 骨架缺失,按 IntentRepository 风格补建(未改动其他 repository) |
合计 730 行。
二、12 个接口与验证结果(curl 逐条实测,全部通过)
| # | 接口 | 关键验证 |
|---|---|---|
| 1 | POST /api/seller/login |
正确返回 token;错误密码 401;重新登录后旧 token 失效 |
| 2 | POST /api/seller/password |
原密码错拒绝;新密码 <8 位拒绝;成功后 BCrypt 重编码,旧密码无法登录 |
| 3 | GET /api/seller/overview |
空态返回 canPublish:true;队列带 position 1..n;currentDeal/pendingFailed 不返回口令码 |
| 4 | POST /api/seller/products |
名称必填 ≤100 字、描述 ≤2000 字、价格 >0 两位小数;重复发布拒绝;base64 图片解码落盘 |
| 5 | POST /api/seller/products/{id}/freeze |
在售→冻结(frozenBy=manual);已下架拒绝;非在售拒绝 |
| 6 | POST /api/seller/products/{id}/unfreeze |
手动冻结可恢复在售;交易冻结拒绝手动解冻 |
| 7 | POST /api/seller/products/{id}/deal |
队首进入交易、商品自动冻结(frozenBy=auto);空队列拒绝 |
| 8 | POST /api/seller/products/{id}/deal/result |
success→胜出+队列转失败+下架进历史;fail→转失败待处置+下位自动递补 |
| 9 | POST /api/seller/products/{id}/offshelf |
队列剩余置失败;交易中拒绝下架 |
| 10 | POST /api/seller/intents/{id}/dispose |
requeue 沿用原码排到队尾;void 作废;重复处置拒绝 |
| 11 | GET /api/seller/history |
只查已下架、closedAt 倒序、每页 10 条 |
| 12 | GET /api/seller/history/{id} |
详情+意向流水;JSON 全文检查无口令码泄漏 |
三、关键业务规则
- 商品四态:在售
on_sale→(手动冻结 / 交易冻结)→ 冻结frozen→ 回到在售或(下架)→ 已下架off_shelf。 - 进入交易即自动冻结:卖家不能挑人,只能与队首进入;商品自动置冻结且
frozenBy='auto',此时禁止手动解冻,必须先标记交易结果。 - 标记成功:胜出意向置成功,队列剩余全部转失败并已处置,商品下架进历史,全部口令码随之失效。
- 标记失败:当前转失败待处置;队列有人则下一位自动递补(商品保持冻结),无人则商品恢复在售。
- 口令码脱敏:卖家端任何接口都不返回买家口令码,历史流水亦然。
四、验证方式与组长复核
- 提交后由组长在本地执行
mvn -q package,编译通过并产出可执行 jar。 java -jar target/online-shop.jar启动成功(日志出现Started OnlineShopApplication)。- 接口行为抽样复核一致(未登录返回 401、空商品返回
{product:null})。
五、与其他模块的边界
- 交易流转的正式实现位于林初俊交付的
TradeService(见 买家端模块实现);本模块通过注入调用。 GET /api/product本模块曾临时实现,已按技术债 TD-3 移交BuyerController,避免重复映射。