# 测试执行结果报告

## 执行时间：2026-03-24

---

## 一、测试发现的问题及修复

### 共发现 4 个 Bug，全部已修复

| 编号 | 严重度 | 问题描述 | 根因 | 修复方式 |
|------|--------|---------|------|---------|
| BUG-01 | **致命** | 创建活动时 visibility/targetCities/ageMin/ageMax 字段未写入数据库，创建后全是默认值 `designated` | `contests.service.ts` 的 create 方法中遗漏了新增字段的赋值 | 在 create data 中添加 `visibility`, `targetCities`, `ageMin`, `ageMax` 字段赋值 |
| BUG-02 | **致命** | 创建 `targeted` 类型活动时 DTO 校验报错 "visibility must be one of the following values: public, designated, internal" | `Visibility` 枚举中缺少 `TARGETED = 'targeted'` | 在 `create-contest.dto.ts` 的 Visibility 枚举中添加 `TARGETED` |
| BUG-03 | **高** | 公众端登录用户访问活动列表时，targeted 活动不根据用户画像过滤（返回 0 条） | `@Public()` 装饰器让 JwtAuthGuard 完全跳过 JWT 解析，导致 `req.user` 始终为空 | 重写 `JwtAuthGuard`：`@Public()` 接口有 Bearer token 时仍解析 JWT（但不强制要求） |
| BUG-04 | **高** | 报名 targeted 活动返回 404 "活动不存在或未公开" | `registerActivity` 方法中活动查询条件硬编码 `visibility: 'public'`，未包含 `targeted` | 改为 `visibility: { in: ['public', 'targeted'] }` |

### 同步修复：update 接口

| 问题 | 修复 |
|------|------|
| 编辑活动时 visibility/targetCities/ageMin/ageMax 不会更新 | 在 update 方法中添加这 4 个字段的处理逻辑 |

---

## 二、数据库测试结果

| 编号范围 | 测试项数 | 通过 | 失败 | 说明 |
|---------|---------|------|------|------|
| DB-01 ~ DB-12 | 12 | 12 | 0 | 表结构、约束、默认值全部正确 |
| DB-13 ~ DB-18 | 6 | 6 | 0 | 租户、角色、权限数据完整 |
| DB-19 ~ DB-23 | 5 | 5 | 0 | 菜单分配正确 |
| **合计** | **23** | **23** | **0** | |

---

## 三、后端 API 测试结果

| 编号范围 | 模块 | 测试项数 | 通过 | 修复后通过 |
|---------|------|---------|------|-----------|
| API-01 ~ API-10 | 公众认证 | 8(已测) | 8 | - |
| API-11 ~ API-20 | 子女管理 | 6(已测) | 6 | - |
| API-21 ~ API-30 | 活动浏览 | 5(已测) | 3 | 5（修复 BUG-03 后） |
| API-31 ~ API-35 | 定向推送 | 3(已测) | 0 | 3（修复 BUG-03 后） |
| API-36 ~ API-48 | 活动报名 | 7(已测) | 5 | 7（修复 BUG-04 后） |
| API-57 ~ API-60 | 我的数据 | 2(已测) | 2 | - |
| API-61 ~ API-64 | 公众用户管理 | 2(已测) | 2 | - |
| API-65 ~ API-69 | 管理端认证 | 4(已测) | 4 | - |
| **已测合计** | | **37** | **30** | **37** |

### 待执行的 API 测试

以下测试项因需要特定数据状态（报名通过后才能测提交），留到全链路测试中覆盖：

- API-49~56: 作品提交（需要报名通过状态）
- API-04, API-06, API-07: 注册边界（密码太短、手机号、手机号重复）
- API-15~20: 子女详情/更新/删除完整测试

---

## 四、已修复文件清单

| 文件 | 修改内容 |
|------|---------|
| `backend/src/contests/contests/dto/create-contest.dto.ts` | Visibility 枚举添加 `TARGETED` |
| `backend/src/contests/contests/contests.service.ts` | create 方法添加 visibility/targetCities/ageMin/ageMax；update 方法添加同样 4 个字段 |
| `backend/src/auth/guards/jwt-auth.guard.ts` | @Public() 接口有 token 时尝试解析 JWT（不强制） |
| `backend/src/public/public.service.ts` | registerActivity 活动查询条件支持 targeted |

---

## 五、待执行测试

### 前端测试（FE-01 ~ FE-92）

需要在浏览器中手动执行，建议按以下顺序：
1. 公众端登录/注册（FE-01~09）
2. 活动大厅（FE-10~15）
3. 活动详情按钮状态（FE-16~35）
4. 个人中心 + 子女管理（FE-36~48）
5. 管理端登录（FE-57~61）
6. 超管端（FE-62~80）
7. 广东省图端（FE-81~86）
8. 评委端（FE-87~92）
9. 响应式（FE-53~56）

### 全链路测试（4.1 ~ 4.4）

需要按照测试方案中的步骤跨端执行完整业务流程。

---

## 六、测试环境

| 项目 | 值 |
|------|-----|
| 后端 | http://localhost:3234 |
| 前端 | http://localhost:3000 |
| 数据库 | mysql://root@localhost:3306/competition_management |
| 测试活动 | ID=1(公开), ID=2(仅内部), ID=3(定向广州6-12岁) |
| 测试用户 | testuser01(广州,有子女), beijing_user(北京), demo(默认) |
