|
|
3 месяцев назад | |
|---|---|---|
| .. | ||
| .gitkeep | 3 месяцев назад | |
| ISSUE-001-vendor-shelve.md | 3 месяцев назад | |
| ISSUE-002-article-publish.md | 3 месяцев назад | |
| ISSUE-003-admin-create-user.md | 3 месяцев назад | |
| README.md | 3 месяцев назад | |
测试环境: http://cfc.iwintrue.com:80
测试脚本: e2e_complete_test.py
测试commit: 2a1ac7d (cfclub branch)
测试时间: 2026-07-01 09:00 UTC+8
测试账号: admin (13800138000, adminId=7), vendor (13800138001, userId=81069), parent (userId=8)
| # | 问题ID | 模块 | 严重度 | 状态 | 发现日期 | 根因确认日期 | 解决日期 | 验证日期 |
|---|---|---|---|---|---|---|---|---|
| 1 | ⏳ 待验证 | 2026-06-29 | 2026-06-30 | 2026-06-30 | — | |||
| 2 | ✅ 已验证 | 2026-06-29 | 2026-06-29 | 2026-06-29 | 2026-07-01 | |||
| 3 | ✅ 已验证 | 2026-06-29 | 2026-06-30 | 2026-06-30 | 2026-07-01 | |||
| 4 | ISSUE-004 | 打卡统计400错误 | 低 | 🔍 待分析 | 2026-07-01 | — | — | — |
| 5 | ISSUE-005 | 财商打卡500错误 | 中 | 🔍 待分析 | 2026-07-01 | — | — | — |
| 6 | ISSUE-006 | 能量总览400错误 | 低 | 🔍 待分析 | 2026-07-01 | — | — | — |
严重度: 中
状态: ⏳ 待验证(供应商 81069 仍为 pending 状态,无法完成完整流程测试)
发现日期: 2026-06-29
解决日期: 2026-06-30(代码已修复)
验证日期: 2026-07-01
模块: 商品管理 / 供应商权限
测试用例: 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
// 修复前:统一检查 status=="approved"
if (!"approved".equals(product.getStatus())) { // ← BUG
return Result.error("商品未通过审核,无法上下架");
}
供应商调用 shelve 时,商品状态已为 on_shelf(管理员已上架),而非 approved。
原代码仅允许状态为 approved 时操作,但管理员上架后状态变为 on_shelf,导致供应商无法再次上下架。
按动作区分状态检查:
approved(待上架)或 off_shelf(已下架)→ 变为 on_shelf下架(action=unshelve):允许 on_shelf(已上架)→ 变为 off_shelf
if ("shelve".equals(action)) {
if (!"approved".equals(product.getStatus()) && !"off_shelf".equals(product.getStatus())) {
return Result.error("商品未通过审核,无法上架");
}
product.setStatus("on_shelf");
} else if ("unshelve".equals(action)) {
if (!"on_shelf".equals(product.getStatus())) {
return Result.error("商品未上架,无法下架");
}
product.setStatus("off_shelf");
}
严重度: 高
状态: ✅ 已验证(2026-07-01回归测试通过)
发现日期: 2026-06-29
解决日期: 2026-06-29
验证日期: 2026-07-01
模块: 文章管理
测试用例: ARTICLE-ADMIN-001 → ARTICLE-ADMIN-002
文章创建成功后,获取到的 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-07-01回归测试通过)
发现日期: 2026-06-29
解决日期: 2026-06-30
验证日期: 2026-07-01
模块: 用户管理
测试用例: USER-ADMIN-001
管理员通过 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)根因确认:users 表 DDL 中 openid VARCHAR(64) NOT NULL 和 family_id BIGINT NOT NULL 两个字段不可为空,但 AdminController.createUser() 未设置这两个字段的值,导致 MyBatis-Plus 插入时写入 NULL 触发 MySQL 字段约束异常,Spring Boot 返回默认 500 错误页面。
文件: cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java
// 修复前:未设置 openid 和 family_id
User user = new User();
user.setPhone(phone);
// ... 缺少 openid 和 family_id 默认值
userMapper.insert(user); // → MySQL 报错: Field 'openid'/'family_id' has no default value
在创建用户时补充 NOT NULL 字段的默认值:
user.setOpenid(""); // 非微信用户,默认空值
user.setFamilyId(0L); // 尚未加入家庭,默认 0
[USER-ADMIN-001] OK userId=81178
测试通过:创建用户成功返回 userId。修复已部署并验证有效。
严重度: 低
状态: 🔍 待分析
发现日期: 2026-07-01
模块: 打卡统计
测试用例: HEALTH-003, FINANCE-003
健康打卡和财商打卡的 stats 端点返回 400 Bad Request:
POST /api/health/checkin/stats → 400POST /api/wealth/checkin/stats → 400[HEALTH-003] FAIL resp={'status': 400, 'error': 'Bad Request', 'path': '/api/health/checkin/stats'}
[FINANCE-003] FAIL resp={'status': 400, 'error': 'Bad Request', 'path': '/api/wealth/checkin/stats'}
端点存在(非404),但请求被Spring拒绝。可能是:
@RequestBody 解析问题严重度: 中
状态: 🔍 待分析
发现日期: 2026-07-01
模块: 财商打卡
测试用例: FINANCE-001
POST /api/wealth/checkin/create 返回 500 Internal Server Error。
[FINANCE-001] FAIL resp={'status': 500, 'error': 'Internal Server Error', 'path': '/api/wealth/checkin/create'}
测试body包含 childId, checkinDate, amount, note 字段,但 FinanceCheckin 实体可能含有其他 NOT NULL 字段未被设置。
严重度: 低
状态: 🔍 待分析
发现日期: 2026-07-01
模块: 能量系统
测试用例: ENERGY-001
POST /api/energy/overview 返回 400 Bad Request。
[ENERGY-001] FAIL resp={'status': 400, 'error': 'Bad Request', 'path': '/api/energy/overview'}
端点存在但请求被拒绝。可能原因是 @RequestBody 需要特定格式或参数。
| 日期 | 操作人 | 内容 |
|---|---|---|
| 2026-06-29 | Sisyphus | 创建问题追踪文档,录入 ISSUE-001/002/003 |
| 2026-06-30 | Sisyphus | ✅ 修复 ISSUE-001:ProductService.shelve() 状态检查按动作区分(上架允许 approved/off_shelf,下架允许 on_shelf) |
| 2026-06-30 | Sisyphus | ✅ 修复 ISSUE-003:AdminController.createUser() 补充 openid="" / familyId=0L 默认值 |
| 2026-06-30 | Sisyphus | 后端 jar 重新部署到 251(commit d7a1c29) |
| 2026-07-01 | Sisyphus | 第三轮完整测试:✅ 验证 ISSUE-002/003 修复有效;录入 ISSUE-004/005/006 新问题;ISSUE-001 → ⏳ 待验证(供应商pending) |