|
|
3 months ago | |
|---|---|---|
| .. | ||
| .gitkeep | 3 months ago | |
| ISSUE-001-vendor-shelve.md | 3 months ago | |
| ISSUE-002-article-publish.md | 3 months ago | |
| ISSUE-003-admin-create-user.md | 3 months ago | |
| README.md | 3 months ago | |
测试环境: http://cfc.iwintrue.com:80
测试脚本: e2e_multi_role.py
测试commit: e24e1b3 (cfclub branch)
测试时间: 2026-06-29 14:40 UTC+8
测试账号: admin (13800138000, adminId=7), vendor (13800138001, userId=81069), parent (13800138002)
| # | 问题ID | 模块 | 严重度 | 状态 | 发现日期 | 解决日期 |
|---|---|---|---|---|---|---|
| 1 | ISSUE-001 | 商品上下架 | 中 | 待解决 | 2026-06-29 | — |
| 2 | ✅ 已解决 | 2026-06-29 | 2026-06-29 | |||
| 3 | ISSUE-003 | 创建用户 | 中 | 待解决 | 2026-06-29 | — |
严重度: 中
状态: 待解决
发现日期: 2026-06-29
模块: 商品管理 / 供应商权限
测试用例: VENDOR-PRODUCT-SHELVE
管理员对商品执行「上架」操作成功后,供应商侧再次对同一商品执行「上架」操作失败。
[VENDOR-PRODUCT-SHELVE] FAIL code=200 resp={'code': 500, 'message': '商品未通过审核,无法上下架', 'data': None}
POST /api/product/create → 状态=pendingPOST /api/admin/product/review (action=approve) → 状态=approvedPOST /api/admin/product/shelve (shelve=true) → 状态=on_shelfPOST /api/product/shelve (productId=7, action=shelve) → 失败文件: cfc-backend/src/main/java/com/etotem/cfc/service/ProductService.java
// line 122-143
public Result<String> shelve(Long productId, Long vendorId, String action) {
Product product = productMapper.selectById(productId);
// ...
if (!"approved".equals(product.getStatus())) { // ← BUG
return Result.error("商品未通过审核,无法上下架");
}
// ...
}
供应商调用 shelve 时,商品状态已为 on_shelf(管理员已上架),而非 approved。
ProductService.shelve() 仅允许状态为 approved 时操作,但管理员上架后状态变为 on_shelf,导致供应商无法再次上下架。
正确逻辑:供应商侧上下架应允许状态为 approved(待上架)或 off_shelf(已下架)。
// ProductService.shelve() 中 line 130 修改为:
if (!"approved".equals(product.getStatus()) && !"off_shelf".equals(product.getStatus())) {
return Result.error("商品未通过审核,无法上下架");
}
严重度: 高
状态: 待解决
发现日期: 2026-06-29
模块: 文章管理
测试用例: ADMIN-ARTICLE-CREATE → ADMIN-ARTICLE-PUBLISH
文章创建成功后,获取到的 articleId 为字符串 "创建成功" 而非数字 ID,导致发布时类型转换失败。
[ADMIN-ARTICLE-CREATE] OK articleId=创建成功 // ← articleId 应该是数字
[ADMIN-ARTICLE-PUBLISH] FAIL code=200 resp={'code': 400, 'message': 'For input string: "创建成功"', 'data': None}
POST /api/admin-auth/loginPOST /api/admin/articles/create → 返回 {"code":200,"message":"success","data":"创建成功"}POST /api/admin/articles/publish → 失败(尝试将 "创建成功" 解析为 Long)分析:根据代码 AdminArticleController.create() 应返回 {"id": <articleId>},但实际返回了字符串。
可能原因:
AdminArticleController.java 的 create 方法返回逻辑articleService.create() 正确设置 article.id 后再返回- AdminArticleController.java: 49 行修改
- AdminController.java: 14 行修改
- ProductController.java: 10 行修改
- VendorController.java: 8 行修改
严重度: 中
状态: 待解决
发现日期: 2026-06-29
模块: 用户管理
测试用例: ADMIN-CREATE-PARENT
管理员通过 POST /api/admin/users/create 创建新用户(phone=13800138002)时返回 HTTP 500。
[ADMIN-CREATE-PARENT] FAIL code=500 resp={'timestamp': '2026-06-29T06:40:45.577+00:00', 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
POST /api/admin-auth/loginPOST /api/admin/users/create (phone=13800138002, role=parent, nickname="E2E测试家长")Result.error)分析:AdminController.createUser() 逻辑清晰——检查手机号是否已存在 → 新建 User → userMapper.insert(user)。
500 错误(Spring 默认错误页面,非 Result.error)表明是数据库写入异常,可能原因:
family_id、role 等字段引用不存在的记录password="" 可能违反 DB 约束users 表结构:SHOW CREATE TABLE users;password 字段约束(空字符串是否允许)phone 为空或 null 测试边界情况| 日期 | 操作人 | 内容 |
|---|---|---|
| 2026-06-29 | Sisyphus | 创建问题追踪文档,录入 ISSUE-001/002/003 |