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

16 KiB
Raw Permalink Blame History

对标导览小程序 UX 与功能逻辑分析

1. 分析范围

  • 对标视频:E:\下载\导览.mp4
  • 视频信息:约 66.43 秒448 x 96030fps竖屏小程序录屏。
  • 本报告只抽取导览应用的功能逻辑、任务闭环、状态机和交互流程,不做 UI 视觉还原。
  • 本项目对照范围:frontend-miniapp 的 H5 导览业务源码,重点看 src/pages/index/index.vuesrc/components/navigation/*src/components/map/ThreeMap.vuesrc/pages/search/index.vuesrc/pages/route/detail.vuesrc/domain/guideReadiness.tssrc/usecases/guideRouteUseCase.ts

2. 抽帧与时间线方法

已使用 ffmpeg 抽帧,并用 OpenCV 计算逐秒帧差,形成视频时间线。

分析素材:

  • 抽帧拼图:.codex-artifacts/benchmark-guide-logic/timeline_contact_sheet.jpg
  • 逐秒帧:.codex-artifacts/benchmark-guide-logic/frames/t_001.jpgt_066.jpg
  • 关键帧:.codex-artifacts/benchmark-guide-logic/key_01.jpgkey_16.jpg
  • OpenCV 时间线:.codex-artifacts/benchmark-guide-logic/opencv_timeline.json

OpenCV 识别出的主要画面转折点为:00:0200:0600:1500:1800:2400:3400:3800:3900:4000:4300:5300:6200: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.jpgkey_06.jpg
00:24-00:34 搜索 / 选点态,弹出键盘,用户输入或选择点位 选择起点或终点 候选点位列表更新,地图仍作为空间参考 key_09.jpgkey_10.jpg
00:34-00:38 选择确认态,地图上出现选点标记,底部弹出确认或点位卡 确认将该点设为起点 / 终点 起终点条更新,进入路线可规划状态 key_11.jpgkey_12.jpg
00:38-00:43 路线方案态,展示推荐路线、不走楼梯、电梯等方案,显示时间 / 距离 查看路线方案,点击模拟导航 路线叠加到地图,主按钮由不可用变为可启动 key_08.jpg
00:43-00:53 导航中态,顶部转向指令卡,地图路线、当前位置箭头、语音 / 低速 / 楼层 / 缩放控件,底部目的地与退出 模拟导航进行中 给出连续导航指令和当前位置反馈,保留退出导览能力 key_07.jpg
00:53-00:62 导航中跨步骤 / 结束前状态 继续模拟导航或操作退出 当前步骤更新,路线和目的地状态持续可见 key_13.jpgkey_14.jpg
00:62-00:66 退出导览后回到地图 / 列表态 点击退出或完成导览 清理导航态,回到可再次搜索 / 分类 / 规划的导览首页 key_15.jpgkey_16.jpg

4. 对标应用的用户任务闭环

对标应用的核心闭环不是单个“搜索结果页”,而是围绕地图持续完成任务:

  1. 进入导览首页:地图即工作台,用户先获得空间上下文。
  2. 找目标:通过搜索、分类、楼层列表或地图点选定位目标。
  3. 定起终点:路线规划需要明确起点和终点,未满足条件时主动作禁用并给出原因。
  4. 看方案:系统生成推荐路线,并提供偏好方案,如不走楼梯、电梯。
  5. 开始导览:从路线方案进入导航中,地图、路线、位置、转向指令同步变化。
  6. 导航中纠偏:持续显示当前指令、楼层、缩放、语音等控制,用户可以退出。
  7. 结束 / 退出:退出后清理导航态,返回导览主页,可继续搜索或重新规划。

这个闭环的 UX 关键点是“上下文不断裂”:搜索、分类、选点、路线、导航都嵌在地图任务里,用户很少被推到孤立页面。

5. 导览状态机

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 对起点 / 终点完整性有强校验,防止用户在条件不足时进入导航。
  • RoutePreviewNavigating 是两个不同状态:前者看方案,后者进入指令驱动。
  • Navigating 必须有退出路径,否则用户进入沉浸态后会失控。

6. 路线规划流程

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 已有 is3DModeguideOutdoorStateindoorViewactiveGuideFloorselectedGuidePoi 等状态;GuideMapShell 统一承载馆内 / 馆外、搜索、楼层、工具事件 已具备地图主页骨架,但搜索 / 分类 / 选点 / 路线的“同一任务上下文”还不如对标视频连贯
“来馆”入口 已实现 src/pages/index/index.vue 更多菜单标题已为“来馆”,并通过 openOutdoorNavPanel() 切到馆外 2D 地图 与对标里的“来馆/馆外参考”接近,继续保持与馆内导航解耦
馆外导航 / 来馆 已实现 src/components/navigation/OutdoorNavigationPanel.vue 支持 GPS、手动起点、地址搜索、出行方式、路线结果、开始导航 / 清除 与对标导览里的馆内路线逻辑是两条业务线,不能混成馆内导航能力
馆内 3D 和楼层 部分实现 src/components/map/ThreeMap.vueGuideMapShell 已有馆内模型、楼层、POI 聚焦、路线预览渲染入口 具备位置预览和楼层浏览基础;正式跨层导航还缺经验证的拓扑与连接器
POI 选择与卡片 部分实现 src/pages/index/index.vueselectedGuidePoi、POI 卡片、设起点 / 终点相关处理 对标视频中选点和路线起终点绑定更强;本项目仍偏“点位预览 + 路线面板”
搜索 部分实现 src/pages/search/index.vue 有搜索输入、筛选 chip、结果列表、点击详情、结果动作跳 route/detail 已有搜索基础,但不是对标那种地图内分类面板 + 楼层 POI 列表 + 选起终点一体化流程
路线规划面板 部分实现 src/components/navigation/RoutePlannerPanel.vue 有起点、终点、交换、清除、收起、推荐路线 / 少走楼梯 / 电梯优先、主按钮 面板结构接近对标,但路线偏好大多禁用;主流程受路线数据门禁限制
起终点搜索 / 选择 已实现基础 RoutePointPicker.vueRoutePlannerPanel.vue 使用,支持起点 / 终点 picker 与搜索 可继续吸收对标的“地图点选确认”和“当前选择角色持续提示”
路线可用性门禁 已实现且必须保留 src/domain/guideReadiness.tsNAV_ROUTE_GRAPH_READY = false,不可用文案为“当前暂不支持正式导航,可查看位置预览、路线示意和馆外参考” 当前不能对外宣称正式馆内导航,这是正确边界
真正路线规划 缺失 / 被门禁关闭 src/usecases/guideRouteUseCase.tsplanRoute() 先读 readiness未 ready 直接返回 errorGuideRouteRepository 也经过 applyRouteReadinessGate 对标视频可进入路线方案和导航中,本项目当前只能做位置预览或能力不可用提示
导航中 turn-by-turn 缺失 src/pages/index/index.vueisSimulatingRoute 和模拟态 UI 变量,但由于 routeReady=false 通常无法获得真实 activeRoutePreview 缺真实路线、实时 / 模拟位置步进、转向指令、到达判断、偏航处理
路线偏好 缺失 / 占位 RoutePlannerPanel.vue 中“少走楼梯”“电梯优先”均 disabled: true,提示待路线数据验证 需要真实 graph 边权、垂直连接器、无障碍属性后才可启用
结束导览 部分实现 handleRouteBack()handleRouteClear()handleRouteSimulate() 可切换 / 清理部分路线状态 对标中的“导航中退出 -> 回到地图 / 方案态”闭环可借鉴,但需先有稳定导航中状态

9. 已有能力、缺失能力与优先级

已有,可继续打磨

  • 地图作为导览主页:本项目已通过 GuideMapShellThreeMapTencentMap 分离馆内 / 馆外渲染。
  • 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 列表尽量保持在导览地图上下文内。
  • 统一点位动作模型:previewsetStartsetEndclear
  • 路线未就绪时,主按钮和状态文案只表达“查看位置 / 位置关系 / 能力不可用原因”,不出现正式导航承诺。
  • 空结果、未选起点、未选终点用即时反馈,不跳离当前任务。

P2在 route graph 就绪后启用路线方案态。

  • 接入真实 route_graphnav_data、楼层连接器和 POI 到可行走节点映射。
  • 将推荐路线、不走楼梯、电梯优先从 UI 占位变成规划输入。
  • 路线方案卡展示距离、预计时间、跨层信息、关键连接器。

P3再启用导航中状态。

  • 明确模拟导航与正式导航两条状态。
  • 导航中提供当前指令、下一步、楼层跟随、缩放、语音开关、退出。
  • 结束导览后清理导航态并回到地图主页或路线方案态。

11. 风险边界

本项目当前不能按对标视频完整复刻“正式馆内导航”。原因不是 UI 缺按钮,而是路线能力被明确门禁:

  • src/domain/guideReadiness.tsNAV_ROUTE_GRAPH_READY 固定为 false
  • guideRouteUseCase.planRoute() 在 readiness 未就绪时直接返回错误,不进入真实路线规划。
  • “少走楼梯 / 电梯优先”在路线面板中仍是禁用占位。

因此,对标视频中的路线方案、转向指令、模拟导航、到达结束等逻辑可以作为产品目标和状态机设计参考,但在本项目中必须等 route_graphnav_data、楼层连接器和路线冒烟测试完成后才能启用。短期应继续使用“位置预览 / 查看位置关系 / 馆外参考 / 来馆”作为真实能力表述。

12. 结论

对标小程序的核心优势是把导览任务组织成一个连续地图工作流:找点、选点、看路线、开始导航、退出导览都在同一空间上下文中完成。本项目已经具备地图 shell、馆内 3D、楼层、POI、路线面板、来馆面板和路线能力门禁基础方向正确。

当前最大差距在于真实馆内路线数据和导航运行态:对标视频已经展示路线方案与导航中指令,本项目仍应停留在位置预览和能力不可用提示。建议先吸收不依赖路线数据的 UX 闭环,再在数据验证完成后逐步开放路线方案和导航中状态。