16 KiB
对标导览小程序 UX 与功能逻辑分析
1. 分析范围
- 对标视频:
E:\下载\导览.mp4 - 视频信息:约 66.43 秒,448 x 960,30fps,竖屏小程序录屏。
- 本报告只抽取导览应用的功能逻辑、任务闭环、状态机和交互流程,不做 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. 对标应用的用户任务闭环
对标应用的核心闭环不是单个“搜索结果页”,而是围绕地图持续完成任务:
- 进入导览首页:地图即工作台,用户先获得空间上下文。
- 找目标:通过搜索、分类、楼层列表或地图点选定位目标。
- 定起终点:路线规划需要明确起点和终点,未满足条件时主动作禁用并给出原因。
- 看方案:系统生成推荐路线,并提供偏好方案,如不走楼梯、电梯。
- 开始导览:从路线方案进入导航中,地图、路线、位置、转向指令同步变化。
- 导航中纠偏:持续显示当前指令、楼层、缩放、语音等控制,用户可以退出。
- 结束 / 退出:退出后清理导航态,返回导览主页,可继续搜索或重新规划。
这个闭环的 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对起点 / 终点完整性有强校验,防止用户在条件不足时进入导航。RoutePreview与Navigating是两个不同状态:前者看方案,后者进入指令驱动。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 已有 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 闭环,再在数据验证完成后逐步开放路线方案和导航中状态。