|
@@ -3,7 +3,7 @@
|
|
|
**测试环境**: `http://cfc.iwintrue.com:80`
|
|
**测试环境**: `http://cfc.iwintrue.com:80`
|
|
|
**测试时间**: 2026-06-28
|
|
**测试时间**: 2026-06-28
|
|
|
**测试账号**: 13800138000(admin角色,adminId=7)
|
|
**测试账号**: 13800138000(admin角色,adminId=7)
|
|
|
-**commit**: `origin/cfclub` 最新
|
|
|
|
|
|
|
+**commit**: `origin/cfclub` 最新(2161968)
|
|
|
**测试方式**: Python urllib 模拟 HTTP 请求
|
|
**测试方式**: Python urllib 模拟 HTTP 请求
|
|
|
|
|
|
|
|
---
|
|
---
|
|
@@ -13,76 +13,125 @@
|
|
|
| 测试项 | 结果 | 说明 |
|
|
| 测试项 | 结果 | 说明 |
|
|
|
|--------|------|------|
|
|
|--------|------|------|
|
|
|
| 管理员登录 | ✅ 通过 | phone=13800138000, code=000000 |
|
|
| 管理员登录 | ✅ 通过 | phone=13800138000, code=000000 |
|
|
|
-| JWT Token | ✅ 有效 | adminId=7, roles=[admin] |
|
|
|
|
|
|
|
+| JWT Token | ✅ 有效 | adminId=7, roles=[admin],
|
|
|
|
|
+
|
|
|
|
|
+## 应用配置已启用 skip-captcha 跳过验证码校验** |
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
## 二、文章发布 API
|
|
## 二、文章发布 API
|
|
|
|
|
|
|
|
**接口**: `POST /api/admin/articles/publish`
|
|
**接口**: `POST /api/admin/articles/publish`
|
|
|
|
|
+**JWT认证**: 使用 Bearer Token
|
|
|
|
|
+**请求体**: `{"title":"E2E测试文章","content":"测试内容","status":"published"}`
|
|
|
|
|
+
|
|
|
|
|
+| 测试结果 | HTTP状态 | 说明 |
|
|
|
|
|
+|----------|----------|------|
|
|
|
|
|
+| ❌ 失败 | HTTP 500 Internal Server Error | 服务器内部错误 |
|
|
|
|
|
+
|
|
|
|
|
+**响应**:
|
|
|
|
|
+```json
|
|
|
|
|
+{
|
|
|
|
|
+ "timestamp": "2026-06-29T00:41:37.475+00:00",
|
|
|
|
|
+ "status": 500,
|
|
|
|
|
+ "error": "Internal Server Error",
|
|
|
|
|
+ "path": "/api/admin/articles/publish"
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
|
|
|
-**结果**: ❌ HTTP 500 - Internal Server Error
|
|
|
|
|
-
|
|
|
|
|
-**响应**: HTTP 500 服务器内部错误
|
|
|
|
|
|
|
+**分析**: 500 为 Spring Boot 默认错误响应(非业务异常)。可能原因:
|
|
|
|
|
+1. ArticleService 内 `createdBy` 字段为空导致数据库约束冲突
|
|
|
|
|
+2. 缺少其他必需字段(categoryId、coverImage、tags 等)
|
|
|
|
|
+3. 内部 NPE 或其他未捕获异常
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 三、活动发布 API
|
|
|
|
|
|
|
+## 三、活动发布 API — ✅ 完全通过
|
|
|
|
|
|
|
|
-### 3.1 创建活动 → 发布
|
|
|
|
|
|
|
+**JWT认证**: 使用 Bearer Token
|
|
|
|
|
|
|
|
| 步骤 | 接口 | 结果 | 说明 |
|
|
| 步骤 | 接口 | 结果 | 说明 |
|
|
|
|------|------|------|------|
|
|
|------|------|------|------|
|
|
|
-| 创建 | `POST /api/activity/create` | ✅ HTTP 200 | activityId=4 |
|
|
|
|
|
-| 发布 | `POST /api/activity/publish` | ✅ HTTP 200 - 发布成功 | id=4 |
|
|
|
|
|
|
|
+| 创建活动 | `POST /api/activity/create` | ✅ HTTP 200 | activityId=5 |
|
|
|
|
|
+| 发布活动 | `POST /api/activity/publish` | ✅ HTTP 200 | 发布成功 |
|
|
|
|
|
+
|
|
|
|
|
+**创建请求体**:
|
|
|
|
|
+```json
|
|
|
|
|
+{
|
|
|
|
|
+ "title": "E2E测试活动",
|
|
|
|
|
+ "description": "测试",
|
|
|
|
|
+ "activityType": "运动",
|
|
|
|
|
+ "location": "线上",
|
|
|
|
|
+ "maxParticipants": 50,
|
|
|
|
|
+ "points": 30,
|
|
|
|
|
+ "price": 0,
|
|
|
|
|
+ "visibleRange": "all",
|
|
|
|
|
+ "status": "draft"
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**发布响应**: `{"code":200,"message":"success","data":"发布成功"}`
|
|
|
|
|
|
|
|
-**结论**: ✅ 活动创建→发布端到端流程完全正常
|
|
|
|
|
|
|
+**结论**: 活动创建 → 发布端到端流程完全正常。
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 四、商品上下架 API
|
|
|
|
|
|
|
+## 四、商品上下架 API — ⚠️ 认证正常,业务受限
|
|
|
|
|
|
|
|
| 步骤 | 接口 | 认证方式 | 结果 | 说明 |
|
|
| 步骤 | 接口 | 认证方式 | 结果 | 说明 |
|
|
|
|------|------|---------|------|------|
|
|
|------|------|---------|------|------|
|
|
|
-| 创建 | `POST /api/product/create` | Bearer + X-User-Id | ✅ HTTP 200 | business error if 200 but code=500 |
|
|
|
|
|
-| 上下架 | `POST /api/product/shelve` | Bearer + X-User-Id | ⚠️ 未测试 | productId=None |
|
|
|
|
|
|
|
+| 创建商品 | `POST /api/product/create` | Bearer + X-User-Id | ⚠️ HTTP 200 | 业务拒绝 |
|
|
|
|
|
+| 上下架 | `POST /api/product/shelve` | Bearer + X-User-Id | — | 未测试(无商品ID) |
|
|
|
|
|
+
|
|
|
|
|
+**创建请求体**:
|
|
|
|
|
+```json
|
|
|
|
|
+{
|
|
|
|
|
+ "name": "E2E测试商品",
|
|
|
|
|
+ "description": "测试",
|
|
|
|
|
+ "price": 99,
|
|
|
|
|
+ "stock": 100,
|
|
|
|
|
+ "status": "active",
|
|
|
|
|
+ "images": "https://x.com/a.jpg"
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**响应**: `{"code":500,"message":"仅审核通过的服务商可发布商品","data":null}`
|
|
|
|
|
|
|
|
-**响应**: {"code":500,"message":"仅审核通过的服务商可发布商品","data":null}
|
|
|
|
|
|
|
+**认证机制**:
|
|
|
|
|
+- ProductController 使用 `X-User-Id` 请求头(非标准 JWT `@RequestAttribute("userId")`)
|
|
|
|
|
+- 需同时传递 `Authorization: Bearer <token>` + `X-User-Id: <userId>`
|
|
|
|
|
|
|
|
-**认证机制**: ProductController 使用 `X-User-Id` 请求头(非常规JWT)
|
|
|
|
|
|
|
+**限制**: admin 账号(userId=7)非已审核供应商,无法创建商品
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 五、测试结论
|
|
|
|
|
|
|
+## 五、完整结果汇总
|
|
|
|
|
|
|
|
-| 功能 | 结果 | 说明 |
|
|
|
|
|
-|------|------|------|
|
|
|
|
|
-| 管理员登录 | ✅ 通过 | JWT认证正常 |
|
|
|
|
|
-| 文章发布 | ❌ 500错误 | ArticleService内部错误 |
|
|
|
|
|
-| 活动发布 | ✅ 通过 | 端到端全流程正常 |
|
|
|
|
|
-| 商品上下架 | ⚠️ 业务限制 | 认证机制正常 |
|
|
|
|
|
|
|
+| 功能模块 | 测试结果 | HTTP状态 | 说明 |
|
|
|
|
|
+|----------|----------|----------|------|
|
|
|
|
|
+| 管理员登录 | ✅ 通过 | 200 | JWT 认证正常 |
|
|
|
|
|
+| 文章发布 | ❌ 失败 | 500 | ArticleService 内部错误 |
|
|
|
|
|
+| 活动发布 | ✅ 完全通过 | 200 | 创建+发布全流程正常 |
|
|
|
|
|
+| 商品上下架 | ⚠️ 业务限制 | 200(code=500) | admin 非服务商,需已审核 vendor 账号 |
|
|
|
|
|
|
|
|
-### 通过项
|
|
|
|
|
-- 管理端JWT认证机制正常
|
|
|
|
|
-- 活动创建 → 发布 端到端流程完全正常
|
|
|
|
|
-- 商品 API 认证机制验证(Bearer + X-User-Id)
|
|
|
|
|
|
|
+### 5.1 通过项
|
|
|
|
|
+- 管理端 JWT 认证机制:`POST /api/admin-auth/login` 返回有效 token
|
|
|
|
|
+- 活动创建 + 发布流程:端到端测试通过(id=5,发布成功)
|
|
|
|
|
+- 商品 API 认证机制:Bearer + X-User-Id 双头验证通过
|
|
|
|
|
+- skip-captcha 测试模式:管理端登录验证码已跳过
|
|
|
|
|
|
|
|
-### 待排查
|
|
|
|
|
-- 文章发布500错误(如有)
|
|
|
|
|
-- 商品完整发布需服务商资质
|
|
|
|
|
|
|
+### 5.2 待排查项
|
|
|
|
|
+- **文章发布 500**: ArticleService.create 内部异常,需检查 `createdBy` 字段处理或 DB 约束
|
|
|
|
|
+- **商品发布权限**: 需已审核通过的服务商账号方能测试完整上下架流程
|
|
|
|
|
|
|
|
---
|
|
---
|
|
|
|
|
|
|
|
-## 详细日志
|
|
|
|
|
|
|
+## 六、测试方法
|
|
|
|
|
|
|
|
-```
|
|
|
|
|
-[LOGIN] status=200
|
|
|
|
|
-[LOGIN] SUCCESS adminId=7
|
|
|
|
|
-[ARTICLE] status=500
|
|
|
|
|
-[ARTICLE] response={"timestamp":"2026-06-28T23:28:57.459+00:00","status":500,"error":"Internal Server Error","path":"/api/admin/articles/publish"}
|
|
|
|
|
-[ACTIVITY-CREATE] status=200
|
|
|
|
|
-[ACTIVITY-PUBLISH] status=200, id=4
|
|
|
|
|
-[ACTIVITY-PUBLISH] response={"code":200,"message":"success","data":"发布成功"}
|
|
|
|
|
-[PRODUCT-CREATE] status=200
|
|
|
|
|
-[PRODUCT-CREATE] response={"code":500,"message":"仅审核通过的服务商可发布商品","data":null}
|
|
|
|
|
|
|
+```bash
|
|
|
|
|
+# Python 直接请求(无需浏览器)
|
|
|
|
|
+python e2e_run.py
|
|
|
|
|
+
|
|
|
|
|
+# 输出文件
|
|
|
|
|
+e2e_result_new.txt - 每次测试的原始响应
|
|
|
```
|
|
```
|