Files
frontend-miniapp/docs/QA/h5-guide-explain-regression-2026-07-01.md
lyf 8fed715235
Some checks failed
CI / verify (push) Has been cancelled
chore: sync latest project updates
2026-07-03 14:42:38 +08:00

470 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# H5 导览/讲解业务闭环回归记录
> 日期2026-07-01
> 项目:深圳自然博物馆 `frontend-miniapp`
> 范围H5 guide / explain 业务闭环
> 验证来源Codex 源码审查 + H5 browser smoke + 命令行质量门禁
> 测试目标:验证三轮修复后,导览位置预览、讲解音频状态、馆内楼层控件交互是否闭环。
---
## 1. 总体结论
本轮 H5 guide / explain 回归结论:**通过,发布前条件通过**。
已验证通过的闭环:
| 编号 | 闭环 | 结果 | 说明 |
|---|---|---|---|
| P1-1 | 讲解 -> guide 位置预览 | 通过 | 人类厅、展品详情均可进入位置预览 |
| P1/P2-2 | 音频可播放/不可用状态 | 通过 | 大猩猩不再误标音频讲解,播放失败后降级图文讲解 |
| P2-3 | 馆内楼层控件遮挡/误触 | 通过 | 馆内入口不再自动打开终点选择,楼层按钮可正常点击 |
| 文案边界 | 不越权宣称真实导航 | 通过 | 仍使用位置预览、位置关系、暂不提供正式室内导航等文案 |
| 质量门禁 | `pnpm type-check` / `pnpm lint` | 通过 | lint warnings 已清理 |
当前仍保留一个非阻塞发布前复测建议:在真实约 390px 宽度移动设备或 WebView 中,再做一次楼层按钮物理点击区 spot check。
---
## 2. 修复背景
Codex H5 用户测试最初发现 3 类问题:
### 2.1 P1讲解到位置预览闭环未闭合
现象:
- 人类厅“查看展厅位置”未跳转到 guide / route preview。
- 展品详情“查看位置”未跳转到位置预览。
- toast
- `该展厅暂无三维位置数据`
- `该讲解暂无所属展厅位置数据`
根因:
- explain 内容域 `hallId` / `poiId` 与 guide 导览域 POI ID 存在命名空间差异。
- 页面层尝试直接用 content hall id 查 guide POI导致运行时找不到位置。
- static bridge 中已有 `hallId -> nav POI` 映射,但原点击链路没有稳定走 use case / repository 解析。
### 2.2 P1/P2音频可播放标记与真实播放不一致
现象:
- 人类厅列表中“大猩猩”显示 `22秒 · 音频讲解`
- 详情显示音频面板和 `23秒`
- 点击后没有真实可播放 audio src。
- toast`音频加载失败,当前提供图文讲解。`
- console`详情音频不可播放`
根因:
- 列表/详情展示层依据 `audioAvailable``hasAudio`、duration 等 metadata 判断“可播放”。
- 播放层需要真实 `playUrl` 或 H5 可加载 URL。
- 两套 truth source 不一致,导致 UI 宣称可播但实际不可播。
### 2.3 P2馆内楼层控件遮挡/误触
现象:
- 点击“馆内”后自动打开 route/guide panel。
- 点击左侧 `B1` 区域打开“选择终点”,而不是切换楼层。
- 面板收起后仍遮挡 `B1/B2` 区域。
- 点击 `2F` 后进入多层加载状态active floor 表达不稳定。
根因:
- “馆内”入口调用 route planner 打开逻辑。
- `RoutePlannerPanel` / `RoutePointPicker` z-index 高于 floor switcher且拦截 touch。
- floor header sticky 造成点击区域覆盖。
- multi 模式下 active floor 样式被抑制,用户误以为没有当前楼层。
---
## 3. 变更范围
本轮修复涉及文件如下:
```text
src/usecases/guideUseCase.ts
src/repositories/GuideRepository.ts
src/data/adapters/backendExplainDataAdapter.ts
src/pages/hall/detail.vue
src/pages/exhibit/detail.vue
src/view-models/explainViewModels.ts
src/usecases/explainUseCase.ts
src/pages/index/index.vue
src/components/navigation/GuideMapShell.vue
src/data/providers/backendExplainContentProvider.ts
```
### 3.1 位置预览闭环修复
涉及:
```text
src/usecases/guideUseCase.ts
src/repositories/GuideRepository.ts
src/data/adapters/backendExplainDataAdapter.ts
src/pages/hall/detail.vue
src/pages/exhibit/detail.vue
```
主要变化:
- 新增/集中 explain content -> guide preview target 解析逻辑。
- 页面不再重复做 direct id / name guessing。
- 解析顺序变为:
```text
direct POI
-> bridged location.poiId
-> hall id as hall-like POI
-> hall name fallback
-> target name fallback
-> unavailable toast
```
- SDK mode 中允许 static bridge POI ID 通过 SDK POI name fallback 或 static fallback 转换成可预览目标。
- 展品详情若无 exhibit POI可 fallback 到所属展厅位置。
- 未引入正式导航文案,仍跳转 `route/detail?...&state=preview`
### 3.2 音频状态修复
涉及:
```text
src/view-models/explainViewModels.ts
src/data/adapters/backendExplainDataAdapter.ts
src/usecases/explainUseCase.ts
src/pages/exhibit/detail.vue
```
主要变化:
- 列表/详情 playable 状态收紧为“存在真实非空 H5 media URL / playUrl”。
- duration、`audioAvailable``hasAudio``audioStatus` 不再单独导致“音频讲解”可播放展示。
- metadata 保留为描述性信息,不再等同播放能力。
- H5 播放失败后详情页降级为图文讲解 / 音频暂不可用。
- 未添加 fake / placeholder audio。
### 3.3 楼层控件遮挡修复
涉及:
```text
src/pages/index/index.vue
src/components/navigation/GuideMapShell.vue
```
主要变化:
- “馆内”入口进入室内 3D 单层预览,不再自动打开 route planner。
- route planner 显示时隐藏 floor switcher避免“看得见但点不到”。
- floor header 从 sticky 改为 relative避免覆盖楼层按钮。
- multi 模式 header 显示 `多层`
- active floor 样式在 multi/single 状态中保持可见或有明确模式提示。
### 3.4 lint 收尾清理
涉及:
```text
src/data/providers/backendExplainContentProvider.ts
```
主要变化:
- 删除未使用 type imports
- `ExplainTrack`
- `MediaAsset`
- `MuseumHall`
- 仅 import 清理,无业务逻辑变更。
---
## 4. 命令验证
### 4.1 TypeScript 类型检查
命令:
```powershell
pnpm type-check
```
实际输出摘要:
```text
$ vue-tsc --noEmit
```
结果通过exit code `0`
### 4.2 ESLint
命令:
```powershell
pnpm lint
```
实际输出摘要:
```text
$ eslint "src/**/*.{ts,vue}"
```
结果通过exit code `0`
最终收尾后,之前 `src/data/providers/backendExplainContentProvider.ts` 中 3 个 unused import warnings 已清理。
### 4.3 H5 build
未运行:
```powershell
pnpm build:h5
```
原因:该命令会写入 `dist`本轮以源码修复、type-check、lint 和 H5 smoke 为验证基线。
---
## 5. H5 smoke 验证记录
### 5.1 测试环境
URL
```text
http://localhost:5173/#/pages/index/index?tab=guide
```
视口:
```text
请求 viewport390x844
实际 browser CSS viewport728x912DPR 1
```
说明Codex in-app browser 的 CSS viewport 与请求值不完全一致,因此发布前仍建议在真实约 390px 宽移动设备或 WebView 上 spot check。
---
## 6. Guide smoke 结果
### 6.1 操作步骤
1. 打开 guide tab。
2. 点击首页“馆内”。
3. 观察是否自动打开 route planner / 选择终点。
4. 点击可见楼层控件:
- `B2`
- `B1`
- `1F`
- `2F`
### 6.2 观察结果
- 点击“馆内”后未自动打开 route planner。
- 未出现 `选择终点``选择起点`
- `B2``B1``1F``2F` 均可点击。
- 点击楼层后对应楼层成为 active floor。
- 点击楼层未触发 route panel / picker。
- 未发现室内真实导航越权文案。
### 6.3 结论
Guide smoke通过。
---
## 7. Explain -> Guide 位置预览 smoke 结果
### 7.1 人类厅查看展厅位置
步骤:
```text
讲解 -> 人类厅 -> 查看展厅位置
```
观察结果:
- 页面跳转到:
```text
/pages/route/detail?...&state=preview
```
- 页面标题:
```text
位置预览
```
- 页面内容包含:
```text
位置预览:人类厅
```
结论:通过。
### 7.2 大猩猩 / 展品详情查看位置
步骤:
```text
讲解 -> 人类厅 -> 大猩猩 -> 查看位置
```
观察结果:
- 页面跳转到:
```text
/pages/route/detail?...&state=preview
```
- 因大猩猩展品自身无稳定 exhibit POIfallback 到所属展厅 preview。
- 页面内容显示:
```text
位置预览展厅5人类厅
```
- 未出现正式室内导航承诺。
结论:通过。
---
## 8. Audio smoke 结果
### 8.1 列表状态
步骤:
```text
讲解 -> 人类厅 -> 查看大猩猩列表项
```
观察结果:
- 人类厅列表包含“大猩猩”。
- 大猩猩显示为:
```text
图文讲解
```
- 人类厅列表中 `音频讲解` count 为 `0`
结论:列表不再误标可播放音频,通过。
### 8.2 详情状态与播放失败降级
步骤:
```text
讲解 -> 人类厅 -> 大猩猩 -> 点击音频面板
```
观察结果:
- 详情初始可解析到 direct URL因此显示 `23秒` 音频面板。
- 点击后 H5 播放失败。
- 页面降级为:
```text
图文讲解
音频加载失败,当前提供图文讲解。
```
- `23秒` 播放面板消失。
结论:播放失败后状态如实降级,通过。
---
## 9. 室内导航话术审计
本轮测试确认guide / route preview 相关文案仍保持位置预览和 readiness 边界,没有宣称正式室内导航。
已观察到的安全文案包括:
```text
位置预览 · 查看位置关系
当前可查看位置预览和位置关系,暂不提供正式室内导航
位置关系不可用
当前不作为正式室内导航
```
说明:室外 Tencent 路线失败等文案不属于室内 certified-navigation 承诺范围。
结论:通过。
---
## 10. 剩余风险与后续建议
| 优先级 | 风险 | 状态 | 建议 |
|---|---|---|---|
| P1 | 三个已验证闭环出现阻塞回归 | 未发现 | 保持当前回归用例 |
| P2 | Codex in-app browser 实际 CSS viewport 与请求 390px 不一致 | 存在 | 发布前用真机或标准 Chrome mobile viewport spot check |
| P2 | SDK/static mixed POI fallback 掩盖后端 ID 规范缺口 | 存在 | 作为数据层迁移债记录,推动 SGS/API 提供稳定 hallId/poiId/floorId 映射 |
| P3 | preview 页个别文案略别扭 | 存在 | 后续文案 polish例如 `无法定位,当前仅支持点位位置预览` |
| P3 | H5 build 未跑 | 有意跳过 | 如进入发布流程,再运行 `pnpm build:h5` |
---
## 11. 发布前推荐复测清单
建议在真实约 390px 宽移动设备或 WebView 中执行:
### Guide
- 打开首页。
- 点击 `馆内`
- 点击 `B2 / B1 / 1F / 2F`
- 确认不会打开 `选择终点`
- 确认 active floor 稳定。
### Explain -> Guide
- `讲解 -> 人类厅 -> 查看展厅位置`
- 确认进入 `位置预览:人类厅`
### Exhibit -> Guide
- `讲解 -> 人类厅 -> 大猩猩 -> 查看位置`
- 确认进入 `位置预览展厅5人类厅`
### Audio
- 人类厅列表查看“大猩猩”。
- 确认列表不误标 `音频讲解`
- 打开详情并点击音频。
- 如果音频加载失败,确认降级为图文讲解并显示失败提示。
---
## 12. 最终状态
当前本轮 Codex 修复与 H5 smoke 结果可归档为:
```text
H5 guide/explain business-loop regression: PASS
Release readiness: CONDITIONAL PASS
Condition: real 390px mobile/WebView floor-control spot check before production release.
```
本轮不改变产品能力边界:
```text
guide = 室内 3D 展示 + POI/位置预览
explain = 内容/讲解 + 真实媒体可用时音频播放
route = route graph/nav data 未验证前保持位置关系/位置预览,不作为正式室内导航
```