sync: 旅程验证增加资源加载状态检查 + MinIO dual S3Client + §9 资源可访问性
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -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. 修复阶段(⛔ 以下任一条件满足时必须执行,不得跳过):
|
||||
|
||||
|
||||
@@ -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
|
||||
```
|
||||
|
||||
@@ -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 URL(403)或修复路径(404) | — |
|
||||
| 布局溢出 | Bug | AUTO-FIX: CSS 修复 | iron-laws L222 |
|
||||
| 元素变形/挤压(按钮/输入框/卡片宽高比异常、被挤压、文字截断显示省略号) | Bug | AUTO-FIX: 修复 CSS flex/width/padding/gap | — |
|
||||
| 间距异常(导航栏与内容之间过大空白、相邻交互元素紧贴无间距、异常大空白区域) | Bug | AUTO-FIX: 修复 margin/padding/gap | — |
|
||||
|
||||
Reference in New Issue
Block a user