Files
frontend-miniapp/docs/Benchmark/guide-video-ux-logic-analysis.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

222 lines
16 KiB
Markdown
Raw Permalink 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.
# 对标导览小程序 UX 与功能逻辑分析
## 1. 分析范围
- 对标视频:`E:\下载\导览.mp4`
- 视频信息:约 66.43 秒448 x 96030fps竖屏小程序录屏。
- 本报告只抽取导览应用的功能逻辑、任务闭环、状态机和交互流程,不做 UI 视觉还原。
- 本项目对照范围:`frontend-miniapp` 的 H5 导览业务源码,重点看 `src/pages/index/index.vue``src/components/navigation/*``src/components/map/ThreeMap.vue``src/pages/search/index.vue``src/pages/route/detail.vue``src/domain/guideReadiness.ts``src/usecases/guideRouteUseCase.ts`
## 2. 抽帧与时间线方法
已使用 ffmpeg 抽帧,并用 OpenCV 计算逐秒帧差,形成视频时间线。
分析素材:
- 抽帧拼图:`.codex-artifacts/benchmark-guide-logic/timeline_contact_sheet.jpg`
- 逐秒帧:`.codex-artifacts/benchmark-guide-logic/frames/t_001.jpg``t_066.jpg`
- 关键帧:`.codex-artifacts/benchmark-guide-logic/key_01.jpg``key_16.jpg`
- OpenCV 时间线:`.codex-artifacts/benchmark-guide-logic/opencv_timeline.json`
OpenCV 识别出的主要画面转折点为:`00:02``00:06``00:15``00:18``00:24``00:34``00:38``00:39``00:40``00:43``00:53``00:62``00:63`。这些时间点基本对应加载完成、进入分类列表、切换选点态、键盘搜索、确认起点、路线预览、开始模拟导航、退出导览等状态变化。
## 3. 视频时间线
| 时间段 | 画面 / 状态 | 用户动作 | 系统反馈 | 关键帧 |
| --- | --- | --- | --- | --- |
| 00:00-00:02 | 小程序加载页,展示馆名和加载进度 | 打开小程序 | 进入导览主页前的启动反馈 | `key_01.jpg` |
| 00:02-00:06 | 导览主页,地图为主界面,顶部搜索,右侧工具,底部功能入口 | 等待地图加载或浏览首页 | 默认落在导览地图,可直接搜索、来馆、更多或进入推荐内容 | `key_02.jpg` |
| 00:06-00:15 | 分类 / 地图列表态展示设施分类图标、楼层切换、POI 列表 | 点击地图 / 分类入口,浏览设施 | 同屏保留地图上下文和下方列表,用户不离开导览上下文 | `key_03.jpg` |
| 00:15-00:18 | 分类无结果提示 | 点击暂无数据的分类,如饮料售卖机 | Toast 提示暂无结果,仍停留当前列表,不打断任务 | `key_04.jpg` |
| 00:18-00:24 | 路线规划选点态,顶部起终点条,下方提示选择起点,模拟导航按钮置灰 | 进入路线规划,未选起点时尝试继续 | 提示必须先选起点,主按钮保持不可用 | `key_05.jpg``key_06.jpg` |
| 00:24-00:34 | 搜索 / 选点态,弹出键盘,用户输入或选择点位 | 选择起点或终点 | 候选点位列表更新,地图仍作为空间参考 | `key_09.jpg``key_10.jpg` |
| 00:34-00:38 | 选择确认态,地图上出现选点标记,底部弹出确认或点位卡 | 确认将该点设为起点 / 终点 | 起终点条更新,进入路线可规划状态 | `key_11.jpg``key_12.jpg` |
| 00:38-00:43 | 路线方案态,展示推荐路线、不走楼梯、电梯等方案,显示时间 / 距离 | 查看路线方案,点击模拟导航 | 路线叠加到地图,主按钮由不可用变为可启动 | `key_08.jpg` |
| 00:43-00:53 | 导航中态,顶部转向指令卡,地图路线、当前位置箭头、语音 / 低速 / 楼层 / 缩放控件,底部目的地与退出 | 模拟导航进行中 | 给出连续导航指令和当前位置反馈,保留退出导览能力 | `key_07.jpg` |
| 00:53-00:62 | 导航中跨步骤 / 结束前状态 | 继续模拟导航或操作退出 | 当前步骤更新,路线和目的地状态持续可见 | `key_13.jpg``key_14.jpg` |
| 00:62-00:66 | 退出导览后回到地图 / 列表态 | 点击退出或完成导览 | 清理导航态,回到可再次搜索 / 分类 / 规划的导览首页 | `key_15.jpg``key_16.jpg` |
## 4. 对标应用的用户任务闭环
对标应用的核心闭环不是单个“搜索结果页”,而是围绕地图持续完成任务:
1. 进入导览首页:地图即工作台,用户先获得空间上下文。
2. 找目标:通过搜索、分类、楼层列表或地图点选定位目标。
3. 定起终点:路线规划需要明确起点和终点,未满足条件时主动作禁用并给出原因。
4. 看方案:系统生成推荐路线,并提供偏好方案,如不走楼梯、电梯。
5. 开始导览:从路线方案进入导航中,地图、路线、位置、转向指令同步变化。
6. 导航中纠偏:持续显示当前指令、楼层、缩放、语音等控制,用户可以退出。
7. 结束 / 退出:退出后清理导航态,返回导览主页,可继续搜索或重新规划。
这个闭环的 UX 关键点是“上下文不断裂”:搜索、分类、选点、路线、导航都嵌在地图任务里,用户很少被推到孤立页面。
## 5. 导览状态机
```mermaid
stateDiagram-v2
[*] --> Loading
Loading --> MapHome
MapHome --> CategoryList: 打开地图/分类
MapHome --> SearchSelecting: 搜索或选点
MapHome --> RoutePointPicking: 进入路线规划
CategoryList --> EmptyCategory: 分类无结果
EmptyCategory --> CategoryList: Toast 后停留
CategoryList --> PoiSelected: 点击 POI
SearchSelecting --> PoiSelected: 选择候选点
PoiSelected --> RoutePointPicking: 设为起点/终点
RoutePointPicking --> RoutePointPicking: 起终点不完整/提示
RoutePointPicking --> RoutePreview: 起终点完整并规划
RoutePreview --> Navigating: 开始/模拟导航
Navigating --> Navigating: 步进/转向/楼层变化
Navigating --> MapHome: 退出导览
RoutePreview --> RoutePointPicking: 返回修改起终点
RoutePointPicking --> MapHome: 取消/清除
```
状态机说明:
- `MapHome` 是中心状态,不只是入口页;其它状态多数都能回到它。
- `RoutePointPicking` 对起点 / 终点完整性有强校验,防止用户在条件不足时进入导航。
- `RoutePreview``Navigating` 是两个不同状态:前者看方案,后者进入指令驱动。
- `Navigating` 必须有退出路径,否则用户进入沉浸态后会失控。
## 6. 路线规划流程
```mermaid
flowchart TD
A[进入路线规划] --> B{是否已有起点}
B -- 否 --> C[提示选择起点并禁用主按钮]
C --> D[搜索/地图点选/列表选择起点]
B -- 是 --> E{是否已有终点}
D --> E
E -- 否 --> F[提示选择终点并禁用主按钮]
F --> G[搜索/地图点选/列表选择终点]
E -- 是 --> H[展示路线偏好]
G --> H
H --> I[请求路线规划]
I --> J{是否有可用路线}
J -- 否 --> K[展示无路线/能力不可用原因]
J -- 是 --> L[展示推荐路线、距离、时间、跨层信息]
L --> M[开始模拟/正式导航]
M --> N[导航中指令、定位、楼层、退出]
N --> O[结束或退出,清理导航态]
```
对标流程里的路线偏好包含“推荐路线 / 不走楼梯 / 电梯”。这不只是三个按钮,而是路线规划输入条件的一部分:它们应改变路径权重、可通行边、垂直交通工具偏好,不能只改变文案。
## 7. 搜索 / 选点 / 楼层 / 导航中 / 结束逻辑
### 搜索逻辑
- 搜索框始终贴近地图主场景,搜索不是脱离地图的单独任务。
- 输入时可出现键盘与候选列表;确认后应回填到起点或终点,而不是只跳详情。
- 搜索结果应可被用于三类动作:查看位置、设为起点、设为终点。
- 空结果使用轻量 Toast 或空态,不破坏当前选点任务。
### 选点逻辑
- 路线规划明确区分起点和终点。
- 当前正在选起点还是终点,需要有持续提示。
- 未选起点 / 终点时,模拟导航等主动作应禁用。
- 选点后需要地图标记、文本条和底部确认态同步更新。
### 楼层逻辑
- 楼层既是浏览过滤条件,也是路线语义的一部分。
- 分类 / POI 列表与楼层选择联动,用户可以按楼层缩小范围。
- 跨层路线需要展示跨层提示,并在导航中支持楼层切换或自动跟随。
- 电梯、扶梯、楼梯不只是设施 POI在正式路线里应作为垂直连接器参与拓扑。
### 导航中逻辑
- 导航中要从“看路线”切换到“执行指令”:顶部当前动作、地图路线、当前位置、目的地、退出按钮是最小闭环。
- 语音、低速、楼层、缩放等控制属于导航运行态控制,不应和路线方案态混淆。
- 模拟导航可以作为无真实定位时的演示模式,但需要和正式导航文案区分。
### 结束导览逻辑
- 结束或退出要清理路线、当前位置模拟、转向指令和目的地卡片。
- 退出后应回到地图主页或路线方案可编辑态,而不是落到空白或无法继续的状态。
- 对“已到达”与“用户主动退出”应分别处理:前者可给到到达反馈,后者保持可重规划。
## 8. 本项目当前逻辑对照
| 模块 | 当前状态 | 源码证据 | 与对标逻辑的差距 |
| --- | --- | --- | --- |
| 导览主页地图工作台 | 部分实现 | `src/pages/index/index.vue` 已有 `is3DMode``guideOutdoorState``indoorView``activeGuideFloor``selectedGuidePoi` 等状态;`GuideMapShell` 统一承载馆内 / 馆外、搜索、楼层、工具事件 | 已具备地图主页骨架,但搜索 / 分类 / 选点 / 路线的“同一任务上下文”还不如对标视频连贯 |
| “来馆”入口 | 已实现 | `src/pages/index/index.vue` 更多菜单标题已为“来馆”,并通过 `openOutdoorNavPanel()` 切到馆外 2D 地图 | 与对标里的“来馆/馆外参考”接近,继续保持与馆内导航解耦 |
| 馆外导航 / 来馆 | 已实现 | `src/components/navigation/OutdoorNavigationPanel.vue` 支持 GPS、手动起点、地址搜索、出行方式、路线结果、开始导航 / 清除 | 与对标导览里的馆内路线逻辑是两条业务线,不能混成馆内导航能力 |
| 馆内 3D 和楼层 | 部分实现 | `src/components/map/ThreeMap.vue``GuideMapShell` 已有馆内模型、楼层、POI 聚焦、路线预览渲染入口 | 具备位置预览和楼层浏览基础;正式跨层导航还缺经验证的拓扑与连接器 |
| POI 选择与卡片 | 部分实现 | `src/pages/index/index.vue``selectedGuidePoi`、POI 卡片、设起点 / 终点相关处理 | 对标视频中选点和路线起终点绑定更强;本项目仍偏“点位预览 + 路线面板” |
| 搜索 | 部分实现 | `src/pages/search/index.vue` 有搜索输入、筛选 chip、结果列表、点击详情、结果动作跳 `route/detail` | 已有搜索基础,但不是对标那种地图内分类面板 + 楼层 POI 列表 + 选起终点一体化流程 |
| 路线规划面板 | 部分实现 | `src/components/navigation/RoutePlannerPanel.vue` 有起点、终点、交换、清除、收起、推荐路线 / 少走楼梯 / 电梯优先、主按钮 | 面板结构接近对标,但路线偏好大多禁用;主流程受路线数据门禁限制 |
| 起终点搜索 / 选择 | 已实现基础 | `RoutePointPicker.vue``RoutePlannerPanel.vue` 使用,支持起点 / 终点 picker 与搜索 | 可继续吸收对标的“地图点选确认”和“当前选择角色持续提示” |
| 路线可用性门禁 | 已实现且必须保留 | `src/domain/guideReadiness.ts``NAV_ROUTE_GRAPH_READY = false`,不可用文案为“当前暂不支持正式导航,可查看位置预览、路线示意和馆外参考” | 当前不能对外宣称正式馆内导航,这是正确边界 |
| 真正路线规划 | 缺失 / 被门禁关闭 | `src/usecases/guideRouteUseCase.ts``planRoute()` 先读 readiness未 ready 直接返回 error`GuideRouteRepository` 也经过 `applyRouteReadinessGate` | 对标视频可进入路线方案和导航中,本项目当前只能做位置预览或能力不可用提示 |
| 导航中 turn-by-turn | 缺失 | `src/pages/index/index.vue``isSimulatingRoute` 和模拟态 UI 变量,但由于 `routeReady=false` 通常无法获得真实 `activeRoutePreview` | 缺真实路线、实时 / 模拟位置步进、转向指令、到达判断、偏航处理 |
| 路线偏好 | 缺失 / 占位 | `RoutePlannerPanel.vue` 中“少走楼梯”“电梯优先”均 `disabled: true`,提示待路线数据验证 | 需要真实 graph 边权、垂直连接器、无障碍属性后才可启用 |
| 结束导览 | 部分实现 | `handleRouteBack()``handleRouteClear()``handleRouteSimulate()` 可切换 / 清理部分路线状态 | 对标中的“导航中退出 -> 回到地图 / 方案态”闭环可借鉴,但需先有稳定导航中状态 |
## 9. 已有能力、缺失能力与优先级
### 已有,可继续打磨
- 地图作为导览主页:本项目已通过 `GuideMapShell``ThreeMap``TencentMap` 分离馆内 / 馆外渲染。
- POI / 楼层 / 位置预览:已有基础数据流和 UI 状态。
- 起终点面板已有起点、终点、交换、清除、picker 搜索等基础能力。
- 路线能力门禁:当前 `NAV_ROUTE_GRAPH_READY=false`,避免误导用户,这是上线前必须保留的保护。
- 来馆:馆外导航面板已存在,适合承接对标视频里的“来馆”任务。
### 部分已有,建议按 UX 闭环补齐
- 地图内分类列表:当前搜索页是独立页面样式,建议未来改为地图上下文内的分类 / 楼层 / POI 列表,不打断导览。
- 点位到路线的动作搜索结果、POI 卡片、地图点选应统一提供“查看位置 / 设为起点 / 设为终点”。
- 路线方案态:可先在 route graph 未就绪时展示“位置关系 / 路线示意不可用原因”,路线就绪后再切换到推荐路线。
- 导航退出闭环:现有清理函数可复用,但应明确区分取消规划、退出模拟、到达结束。
### 缺失,需数据和算法支撑
- 经验证的 `route_graph` / `nav_data` 加载、校验和冒烟测试。
- 馆内路径规划算法或 SDK 路线规划结果适配。
- 楼层连接器:楼梯、扶梯、电梯与图节点 / 边的关联。
- 路线偏好:推荐、不走楼梯、电梯优先对应不同权重和约束。
- 导航中 turn-by-turn分步指令、当前位置更新、下一步提示、到达判断、偏航 / 重规划。
- 正式导航和模拟导航的文案与状态区分。
## 10. 建议吸收的 UX 逻辑
P1先补齐不依赖真实路线的闭环。
- 将搜索、分类、楼层、POI 列表尽量保持在导览地图上下文内。
- 统一点位动作模型:`preview``setStart``setEnd``clear`
- 路线未就绪时,主按钮和状态文案只表达“查看位置 / 位置关系 / 能力不可用原因”,不出现正式导航承诺。
- 空结果、未选起点、未选终点用即时反馈,不跳离当前任务。
P2在 route graph 就绪后启用路线方案态。
- 接入真实 `route_graph``nav_data`、楼层连接器和 POI 到可行走节点映射。
- 将推荐路线、不走楼梯、电梯优先从 UI 占位变成规划输入。
- 路线方案卡展示距离、预计时间、跨层信息、关键连接器。
P3再启用导航中状态。
- 明确模拟导航与正式导航两条状态。
- 导航中提供当前指令、下一步、楼层跟随、缩放、语音开关、退出。
- 结束导览后清理导航态并回到地图主页或路线方案态。
## 11. 风险边界
本项目当前不能按对标视频完整复刻“正式馆内导航”。原因不是 UI 缺按钮,而是路线能力被明确门禁:
- `src/domain/guideReadiness.ts``NAV_ROUTE_GRAPH_READY` 固定为 `false`
- `guideRouteUseCase.planRoute()` 在 readiness 未就绪时直接返回错误,不进入真实路线规划。
- “少走楼梯 / 电梯优先”在路线面板中仍是禁用占位。
因此,对标视频中的路线方案、转向指令、模拟导航、到达结束等逻辑可以作为产品目标和状态机设计参考,但在本项目中必须等 `route_graph``nav_data`、楼层连接器和路线冒烟测试完成后才能启用。短期应继续使用“位置预览 / 查看位置关系 / 馆外参考 / 来馆”作为真实能力表述。
## 12. 结论
对标小程序的核心优势是把导览任务组织成一个连续地图工作流:找点、选点、看路线、开始导航、退出导览都在同一空间上下文中完成。本项目已经具备地图 shell、馆内 3D、楼层、POI、路线面板、来馆面板和路线能力门禁基础方向正确。
当前最大差距在于真实馆内路线数据和导航运行态:对标视频已经展示路线方案与导航中指令,本项目仍应停留在位置预览和能力不可用提示。建议先吸收不依赖路线数据的 UX 闭环,再在数据验证完成后逐步开放路线方案和导航中状态。