Files
frontend-miniapp/docs/Phase1实施完成报告.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

7.6 KiB
Raw Blame History

Phase 1 实施完成报告

实施时间

2026-06-12

实施内容

Phase 1基础自动切换能力核心

已完成任务

Task 1.1:在 ThreeMap 组件实现距离监听与自动切换逻辑

修改文件

  • src/domain/guideModel.ts:增加自动切换配置类型定义
  • src/components/map/ThreeMap.vue:实现自动切换核心逻辑

实现要点

  1. 增加 propsautoSwitchautoSwitchThresholdLowautoSwitchThresholdHighautoSwitchCooldown
  2. 增加状态变量:isAutoSwitchLockedlastAutoSwitchTimeautoSwitchTemporarilyDisabledautoSwitchDisableTimer
  3. 实现 checkAutoSwitch() 函数:
    • 监听 controls.change 事件,而不是每帧检查
    • 双阈值滞回机制1.0x 和 1.3x
    • 加载锁和冷却时间2 秒)
    • 触发切换时 emit autoSwitch 事件
  4. 实现 disableAutoSwitchTemporarily(durationMs) 方法,允许临时禁用自动切换
  5. initThree() 中注册 controls.change 监听器
  6. disposeScene() 中清理监听器和定时器
  7. 通过 defineExpose 暴露 disableAutoSwitchTemporarily 方法

验证结果

  • TypeScript 类型检查通过
  • H5 构建成功

Task 1.2:调整首页和 GuideMapShell 配合自动切换

修改文件

  • src/pages/index/index.vue
  • src/components/navigation/GuideMapShell.vue

实现要点

  1. 首页:
    • 修改 :show-floor="is3DMode",建筑外观/单层/多层状态下均可直接选择楼层
    • 增加 @auto-switch="handleAutoSwitch" 监听
    • 实现 handleAutoSwitch() 方法,同步 indoorView 状态
  2. GuideMapShell
    • 增加 autoSwitch emit 定义
    • ThreeMap 上增加 @auto-switch="handleAutoSwitch" 监听
    • 实现 handleAutoSwitch() 方法,向上传递事件
    • 更新 threeMapRef 类型定义,增加 disableAutoSwitchTemporarily 方法

验证结果

  • TypeScript 类型检查通过
  • 楼层控件在建筑外观状态可见
  • 自动切换事件传递链路完整

Task 1.3:将手动控制调整为单层/多层展示

修改文件

  • src/components/map/ThreeMap.vue
  • src/components/navigation/GuideMapShell.vue

实现要点

  1. 取消面向用户的"全馆/楼层"手动切换入口
  2. 新增"单层/多层"展示切换入口
  3. showMultiFloor() 会组合加载各楼层 GLB形成多层展示
  4. 手动切换展示层数或选择具体楼层后10 秒内不会触发自动切换

验证结果

  • TypeScript 类型检查通过
  • 单层/多层切换逻辑正确

代码变更总结

新增类型定义

// src/domain/guideModel.ts
export interface AutoSwitchConfig {
  enabled: boolean
  thresholdLowFactor: number
  thresholdHighFactor: number
  cooldownMs: number
}

export interface AutoSwitchEvent {
  from: 'overview' | 'floor'
  to: 'overview' | 'floor'
  trigger: 'zoom-in' | 'zoom-out'
  distance: number
}

新增配置参数

// ThreeMap 组件新增 props均有默认值
autoSwitch: true                    // 是否启用自动切换
autoSwitchThresholdLow: 1.0         // 下阈值倍数
autoSwitchThresholdHigh: 1.3        // 上阈值倍数
autoSwitchCooldown: 2000            // 冷却时间(毫秒)

核心逻辑

// 自动切换检查(监听 controls.change 事件触发)
const checkAutoSwitch = () => {
  // 1. 检查开关和临时禁用状态
  // 2. 检查加载锁和冷却时间
  // 3. 计算当前距离和阈值
  // 4. 判断是否跨越阈值
  // 5. 触发切换并 emit 事件
}

// 临时禁用自动切换(手动切换时调用)
const disableAutoSwitchTemporarily = (durationMs: number) => {
  autoSwitchTemporarilyDisabled = true
  setTimeout(() => {
    autoSwitchTemporarilyDisabled = false
  }, durationMs)
}

验收标准检查

Phase 1 验收标准

  • 用户在建筑外观放大到一定距离自动切换到默认楼层L1
    • 实现:距离小于建筑尺寸 1.0x 时自动切换
  • 用户在楼层内部缩小到一定距离,自动切换回建筑外观
    • 实现:距离大于建筑尺寸 1.3x 时自动切换
  • 快速缩放不会触发多次加载
    • 实现:加载锁 + 冷却时间2 秒)+ 双阈值滞回
  • 手动切换展示层数或楼层后 10 秒内不会自动切换
    • 实现disableAutoSwitchTemporarily(10000)
  • 建筑外观状态下可以直接点击楼层控件选择楼层
    • 实现:改为 :show-floor="is3DMode"
  • 提供单层/多层展示切换,不再暴露"全馆/楼层"手动切换
    • 实现:右侧展示控件改为"单层/多层",多层由各楼层 GLB 组合加载
  • 移动端测试无明显误触
    • 状态:需要真实设备测试

技术实现亮点

  1. 监听 controls.change 事件而不是每帧检查

    • 避免性能开销
    • 只在用户交互时触发
  2. 双阈值滞回机制

    • 放大到 1.0x 切换到单楼层
    • 缩小到 1.3x 切换回建筑外观
    • 避免反复切换抖动
  3. 加载锁 + 冷却时间

    • 切换期间锁定,不响应新的切换请求
    • 切换后 2 秒内不重复触发
    • 防止快速缩放导致多次加载
  4. 手动切换临时禁用机制

    • 切换单层/多层或选择楼层后 10 秒内禁用自动切换
    • 避免手动操作被自动切换干扰
  5. 多层展示

    • "多层"入口组合加载各楼层模型
    • 选择具体楼层可回到单层展示
  6. 完整的清理机制

    • disposeScene() 中移除监听器
    • 清理定时器,避免内存泄漏

下一步建议

立即测试(必须)

  1. H5 浏览器测试

    • 进入馆内 3D查看初始状态是否为"建筑外观"
    • 放大建筑外观,观察是否自动切换到单楼层
    • 缩小单楼层视图,观察是否自动切换回建筑外观
    • 手动点击"单层/多层"按钮,观察 10 秒内是否不会自动切换
    • 建筑外观或多层展示下点击楼层控件,观察是否正常回到单层
  2. 移动端真机测试

    • 在 iOS 和 Android 设备测试缩放手势
    • 确认无明显误触
    • 确认阈值符合预期

Phase 2 实施(建议)

Phase 2 任务可以进一步提升用户体验:

  • Task 2.1:增加视觉过渡和状态提示
  • Task 2.2:优化阈值和参数

Phase 3 实施(未来)

Phase 3 依赖跨层路线能力:

  • Task 3.1:在多层展示基础上增加跨层连接/路线表达
  • Task 3.2:增加单层/多层状态下的跨层 POI 关系提示

风险提示

  1. 需要移动端真机测试

    • 当前只在代码层面验证,未在真实设备测试
    • 阈值可能需要根据实际体验调整
  2. 自动切换可能与用户意图不一致

    • 部分用户可能不习惯自动切换
    • 建议后续增加设置项,允许用户永久禁用自动切换
  3. 性能影响需要监控

    • controls.change 事件频繁触发,虽有节流但仍需监控性能
    • 大建筑模型切换时加载时间较长,需要优化 loading 状态提示

文件变更清单

  • src/domain/guideModel.ts+16 行(类型定义)
  • src/components/map/ThreeMap.vue+90 行(核心逻辑)
  • src/pages/index/index.vue+5 行(事件监听)
  • src/components/navigation/GuideMapShell.vue+12 行(事件传递)

总计:约 +123 行代码


结论

Phase 1 的核心自动切换能力已完成,并已按产品语义修正为"建筑外观自动状态 + 单层/多层手动展示"。代码通过 TypeScript 类型检查和 H5 构建验证。下一步需要在真实设备上测试并根据体验调优阈值参数。