测试环境: http://cfc.iwintrue.com:80
测试时间: 2026-06-28 ~ 2026-06-29
测试账号: 13800138000(admin角色,adminId=7)
commit: origin/cfclub 最新(5538c88 fix: ambiguous mapping冲突)
测试时间(第二次验证): 2026-06-29 02:55 UTC+8
测试方式: Python urllib 模拟 HTTP 请求
| 测试项 | 结果 | 说明 |
|---|---|---|
| 管理员登录 | ✅ 通过 | phone=13800138000, code=000000 |
| JWT Token | ✅ 有效 | adminId=7, roles=[admin], |
接口: POST /api/admin/articles/publish
JWT认证: 使用 Bearer Token
请求体: {"title":"E2E测试文章","content":"测试内容","status":"published"}
| 测试结果 | HTTP状态 | 说明 |
|---|---|---|
| ❌ 失败 | HTTP 500 Internal Server Error | 服务器内部错误 |
响应:
{
"timestamp": "2026-06-29T00:41:37.475+00:00",
"status": 500,
"error": "Internal Server Error",
"path": "/api/admin/articles/publish"
}
分析: 500 为 Spring Boot 默认错误响应(非业务异常)。可能原因:
createdBy 字段为空导致数据库约束冲突JWT认证: 使用 Bearer Token
| 步骤 | 接口 | 结果 | 说明 |
|---|---|---|---|
| 创建活动 | POST /api/activity/create |
✅ HTTP 200 | activityId=6(累计已验证5次创建+发布成功:id=1,2,3,4,5,6) |
| 发布活动 | POST /api/activity/publish |
✅ HTTP 200 | 发布成功 |
创建请求体:
{
"title": "E2E测试活动",
"description": "测试",
"activityType": "运动",
"location": "线上",
"maxParticipants": 50,
"points": 30,
"price": 0,
"visibleRange": "all",
"status": "draft"
}
发布响应: {"code":200,"message":"success","data":"发布成功"}
结论: 活动创建 → 发布端到端流程完全正常。
| 步骤 | 接口 | 认证方式 | 结果 | 说明 |
|---|---|---|---|---|
| 创建商品 | POST /api/product/create |
Bearer + X-User-Id | ⚠️ HTTP 200 | 业务拒绝 |
| 上下架 | POST /api/product/shelve |
Bearer + X-User-Id | — | 未测试(无商品ID) |
创建请求体:
{
"name": "E2E测试商品",
"description": "测试",
"price": 99,
"stock": 100,
"status": "active",
"images": "https://x.com/a.jpg"
}
响应: {"code":500,"message":"仅审核通过的服务商可发布商品","data":null}
认证机制:
X-User-Id 请求头(非标准 JWT @RequestAttribute("userId"))Authorization: Bearer <token> + X-User-Id: <userId>限制: admin 账号(userId=7)非已审核供应商,无法创建商品
| 功能模块 | 测试结果 | HTTP状态 | 说明 |
|---|---|---|---|
| 管理员登录 | ✅ 通过 | 200 | JWT 认证正常 |
| 文章发布 | ❌ 失败 | 500 | ArticleService 内部错误 |
| 活动发布 | ✅ 完全通过 | 200 | 创建+发布全流程正常 |
| 商品上下架 | ⚠️ 业务限制 | 200(code=500) | admin 非服务商,需已审核 vendor 账号 |
POST /api/admin-auth/login 返回有效 tokencreatedBy 字段处理或 DB 约束# Python 直接请求(无需浏览器)
python e2e_run.py
# 输出文件
e2e_result_new.txt - 每次测试的原始响应