sync: 旅程验证增加资源加载状态检查 + MinIO dual S3Client + §9 资源可访问性

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
yourname
2026-04-07 14:24:26 +00:00
parent ecb26b8b0f
commit ad11fef195
3 changed files with 59 additions and 1 deletions

View File

@@ -394,7 +394,14 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这
3. 证据阶段(⛔ 强制,不得跳过):
- browser_take_screenshot → 保存最终截图到 tests/e2e/screenshots/journey-epic{N}-{M}-final.png
- browser_network_requests → 检查无 localhost API 调用
- browser_network_requests(static=false) → 检查无 localhost API 调用
- ⛔ **资源加载状态检查**(新增 — 每条旅程必须执行):
- `browser_network_requests(static=true, filter="\\.(jpg|jpeg|png|gif|webp|svg|mp4|webm|mov)$")`
- 过滤图片/视频资源请求,检查 HTTP 状态码
- 任何 403/404 → 标记 `resource_status_check.found = FOUND` + 触发修复
- 常见 403 原因MinIO 私有 bucket 未用 presigned URL、防盗链、CORS
- 常见 404 原因:资源路径错误、文件未上传
- 记录到 pipeline-state.yaml 的 `verification_detail.resource_status_check`
4. 修复阶段(⛔ 以下任一条件满足时必须执行,不得跳过):

View File

@@ -282,3 +282,37 @@ getPublicDownloadUrl(key) → getSignedUrl(s3Public, ...) // host=minio-xxx.dev
K8S ingress 会将 HTTP 升级为 HTTPS。`S3_PUBLIC_URL` 必须使用 `https://`
否则 presigned URL 签名会因重定向而失效。
---
## 9. 资源 URL 可访问性检查(⛔ 强制)
### 问题描述
MinIO bucket 默认私有,所有通过 URL 直接访问的资源(图片、视频)都会返回 403。
前端 `<img src>` 或 `<video src>` 使用直接 URL 会加载失败,但不会报 JS 错误(静默失败)。
### 受影响的资源类型
| 资源 | 存储位置 | 访问方式 |
|------|---------|---------|
| 视频文件 | MinIO `videos/` | stream API 路由 → presigned URL 重定向 |
| 封面图 | MinIO `covers/` | API 返回时注入 presigned URL |
| 其他上传文件 | MinIO | 同上 |
### 代码规则
- **禁止前端直接使用 MinIO URL**`<img src="https://minio-xxx/bucket/key">` 会 403
- **API 返回资源 URL 时**:必须用 `getPublicDownloadUrl(key)` 生成 presigned URL
- **视频播放**:通过 stream API 路由(`/api/v1/videos/[id]/stream`)重定向到 presigned URL
- **封面图显示**:在视频详情 API 中为 `coverImages[].imageUrl` 注入 presigned URL
- **presigned URL 有效期**:默认 3600 秒1 小时),前端需在过期前重新获取
### 检测方法
旅程验证时使用 `browser_network_requests(static=true)` 检查图片/视频资源状态码:
```bash
# 过滤图片/视频请求
browser_network_requests(static=true, filter="\\.(jpg|jpeg|png|gif|webp|svg|mp4|webm)$")
# 状态码 403/404 → 资源不可访问 → AUTO-FIX
```

View File

@@ -83,6 +83,14 @@
- 无 broken image加载失败的图片占位符
- 无 emoji 充当功能图标
2.5. **资源加载状态检查**(⛔ 强制 — 每次视觉验证关卡必须执行):
- `browser_network_requests(static=true, filter="\\.(jpg|jpeg|png|gif|webp|svg|mp4|webm)$")`
- 检查所有图片/视频资源的 HTTP 状态码
- 状态码 403 → 私有存储未签名(如 MinIO bucket 需 presigned URL
- 状态码 404 → 资源不存在(路径错误或文件未上传)
- 状态码 5xx → 服务端错误
→ 发现非 200 状态码 → 标记 `resource_status_check.found = FOUND` → 按分流规则处理
3. **英文枚举检测**
- 页面可见文本中无英文大写枚举值(如 APPROVED/REJECTED/PENDING/PAID 等)
@@ -209,6 +217,14 @@ verification_detail:
element_deformation: NONE/FOUND # e. 元素变形(按钮/输入框被挤压)
alignment_issues: NONE/FOUND # f. 对齐问题
details: "具体描述"
resource_status_check: # ⛔ 新增 — 资源加载状态
executed: true/false
found: NONE/FOUND
failed_resources: # FOUND 时列出失败资源
- url: "https://..."
status: 403/404
type: "image/jpeg"
details: "描述"
```
---
@@ -230,6 +246,7 @@ verification_detail:
| SVG data URI 充当图标/装饰 | Bug(平台不兼容 #17) | AUTO-IMPLEMENT: **⛔ 必须按 ./reference/platform-uni-app.md §1 完整安装 Iconify + tailwindcss-icons + weapp-tailwindcss/vite** | iron-laws L223 |
| 英文枚举值显示 | Bug(#15) | AUTO-FIX: 添加中文映射函数 | iron-laws L239 |
| Broken image | Bug | AUTO-FIX: 修复图片路径/占位符 | — |
| 图片/视频资源 403/404 | Bug | AUTO-FIX: 使用 presigned URL403或修复路径404 | — |
| 布局溢出 | Bug | AUTO-FIX: CSS 修复 | iron-laws L222 |
| 元素变形/挤压(按钮/输入框/卡片宽高比异常、被挤压、文字截断显示省略号) | Bug | AUTO-FIX: 修复 CSS flex/width/padding/gap | — |
| 间距异常(导航栏与内容之间过大空白、相邻交互元素紧贴无间距、异常大空白区域) | Bug | AUTO-FIX: 修复 margin/padding/gap | — |