# 地图模块重构实施清单 ## 1. 使用说明 本文档是地图模块重构的执行清单,只保留当前已经明确、可以直接落地的实施项。 以下内容暂不纳入本清单: - 仍需进一步讨论的方案; - 依赖后端配合后才能确定的优化项; - 暂未确定收益与改造成本的预研项; - 调试面板、埋点体系、长期性能平台化建设等扩展项。 执行原则: - 先止血,再拆层,再提速; - 每一步都要保证现有业务可用; - 每个阶段结束后都要做功能回归; - 不在同一阶段同时改动 UI、Store、地图渲染层的大块逻辑。 --- ## 2. 本轮重构目标 本轮只完成以下确定目标: - 收口当前明显缺陷和遗留代码; - 建立基础类型和索引; - 将分散在组件中的核心业务规则收口; - 拆分地图 Store,建立更清晰的数据职责; - 抽离统一编排层; - 拆分 `map.ol.ts` 的核心管理职责; - 保证图层树、图例、锚点显隐链路更清晰; - 为后续继续重构预留稳定结构。 --- ## 3. 阶段一:现状收口与问题修复 ## 3.1 清理明显遗留问题 - [ ] 删除 `map.ol.ts` 中无意义代码和重复日志 - [ ] 清理大段失效注释,保留必要说明 - [ ] 统一地图相关文件中的临时 `console.log` 涉及文件: - `src/components/gis/map.ol.ts` 验收标准: - 页面可正常编译; - 首次进入地图页面不报错; - 控制台不再出现未定义函数或变量错误; - 默认图层、图例、锚点仍可正常显示。 ## 3.2 补充基础类型定义 - [ ] 新增地图图层类型定义 - [ ] 新增图例结构类型定义 - [ ] 新增锚点数据类型定义 - [ ] 新增筛选参数类型定义 - [ ] 为 `map.ts`、`map.class.ts`、`map.ol.ts` 替换第一批高频 `any` 建议新增文件: - `src/modules/map/types/map-layer.ts` - `src/modules/map/types/map-legend.ts` - `src/modules/map/types/map-point.ts` - `src/modules/map/types/map-filter.ts` 验收标准: - 核心地图模块类型边界可读; - 新增类型后不影响现有运行; - `map.ts`、`map.ol.ts` 中关键方法参数不再全部使用 `any`。 ## 3.3 建立基础索引 - [x] 建立 `layerByKey` 索引 - [x] 建立 `legendByNameEn` 索引 - [x] 建立 `legendByLayerCode` 索引 - [x] 将 `findLayerByKey()` 的高频调用逐步替换为索引访问 - [x] 将图例派生中的重复递归改为“初始化索引 + 增量查询” 优先改造位置: - `src/store/modules/map.ts` 验收标准: - 图层查找和图例查找不再完全依赖全量递归; - 图层勾选、图例切换后响应速度不下降; - 功能表现与现状一致。 --- ## 4. 阶段二:规则收口 ## 4.1 收口互斥规则 - [x] 将图层互斥逻辑从 `LayerController.vue` 中移出 - [x] 将视频监控站与 AI 视频监控站互斥统一到规则函数 - [x] 将环保设施与环保设施在建互斥统一到规则函数 - [x] 将珍稀鱼类与沿程鱼类互斥统一到规则函数 - [x] 保证互斥规则只有一个入口执行 建议新增文件: - `src/modules/map/domain/map-layer-rules.ts` 涉及文件: - `src/components/mapController/LayerController.vue` - `src/store/modules/map.ts` 验收标准: - 图层树勾选时互斥结果稳定; - 不再同时在组件和 Store 两处维护同一套互斥规则; - 勾选结果、图例结果、地图显示结果保持一致。 ## 4.2 收口图例派生规则 - [x] 将“图层选中后生成图例”逻辑提炼为独立函数 - [x] 将“环保设施图例自动补充”逻辑提炼为独立规则 - [x] 分离图例原始结构与图例选中状态 - [x] 保证 `legendDataOriginal` 不再被运行态逻辑污染 建议新增文件: - `src/modules/map/domain/legend-deriver.ts` 涉及文件: - `src/store/modules/map.ts` - `src/components/mapLegend/index.vue` 验收标准: - 图例显示仍按当前选中图层正确联动; - 图例点击后锚点显隐正确; - 图例原始结构与运行时状态职责更清晰。 --- ## 5. 阶段三:拆分 Store ## 5.1 拆分配置状态 - [ ] 抽离图层树配置状态 - [ ] 抽离图例原始配置状态 - [ ] 抽离页面地图配置加载逻辑 建议新增文件: - `src/modules/map/stores/map-config.store.ts` 当前迁移来源: - `src/store/modules/map.ts` - `src/api/map.ts` ## 5.2 拆分运行状态 - [ ] 抽离当前选中图层 key - [ ] 抽离当前选中图例 key - [ ] 抽离当前基地、时间范围、缩放级别等运行态 - [ ] 统一“当前地图状态”的唯一来源 建议新增文件: - `src/modules/map/stores/map-view.store.ts` ## 5.3 拆分数据缓存 - [ ] 抽离锚点缓存 - [ ] 抽离图层加载状态 - [ ] 抽离锚点合并数据 `pointData` - [ ] 为每个图层维护独立 `loading / loaded / error` 建议新增文件: - `src/modules/map/stores/map-data.store.ts` 验收标准: - 原 `map.ts` 体积明显下降; - 配置、运行态、数据缓存职责分离; - 现有组件仍可通过兼容方式读取数据; - 默认图层、图例、锚点加载不受影响。 --- ## 6. 阶段四:建立统一编排层 ## 6.1 新增地图编排器 - [x] 新增地图模块统一编排入口 - [x] 将地图初始化流程迁移到编排器 - [x] 将图层勾选、图例勾选、基地切换、时间筛选、搜索定位改为统一命令 - [x] 收口 `GisView.vue` 中的配置加载与监听联动逻辑 建议新增文件: - `src/modules/map/application/map-orchestrator.ts` ## 6.2 统一入口命令 - [x] 定义 `initialize(pageKey)` - [x] 定义 `toggleLayer(layerKey)` - [x] 定义 `toggleLegend(layerKey, legendKey)` - [x] 定义 `changeBaseId(baseId)` - [x] 定义 `changeTimeRange(range)` - [x] 定义 `focusPoint(pointId)` 涉及文件: - `src/components/gis/GisView.vue` - `src/components/mapController/LayerController.vue` - `src/components/mapLegend/index.vue` - `src/components/mapFilter/index.vue` 验收标准: - 地图相关 UI 组件不再直接拼复杂业务逻辑; - 组件交互都通过统一入口触发; - 图层树、图例、筛选的联动链路更容易追踪。 --- ## 7. 阶段五:拆分 OpenLayers 渲染层 ## 7.1 拆分点图层管理 - [ ] 从 `map.ol.ts` 中抽离锚点图层创建逻辑 - [ ] 从 `map.ol.ts` 中抽离锚点显隐逻辑 - [ ] 从 `map.ol.ts` 中抽离图例控制锚点逻辑 - [ ] 在点图层管理模块中维护图层注册表 建议新增文件: - `src/components/gis/ol/point-layer-manager.ts` 当前迁移来源: - `src/components/gis/map.ol.ts` ## 7.2 拆分 Popup 管理 - [ ] 抽离 `initPopupOverlay()` - [ ] 抽离 `detectFeatureAtPixel()` - [ ] 抽离 `showPopup()` - [ ] 收口 hover 和 click 交互逻辑 建议新增文件: - `src/components/gis/ol/popup-manager.ts` ## 7.3 拆分区域过滤管理 - [x] 抽离基地切换后的区域裁切逻辑 - [x] 抽离点在面内判断逻辑 - [x] 抽离区域外锚点显隐逻辑 - [x] 抽离遮罩应用与清理逻辑 建议新增文件: - `src/components/gis/ol/region-mask-manager.ts` 验收标准: - `map.ol.ts` 文件长度和职责明显收缩; - 点图层、Popup、基地裁切三类逻辑各自独立; - 现有地图交互行为不变。 --- ## 8. 阶段六:组件瘦身 ## 8.1 `GisView.vue` - [x] 仅保留地图容器、地图初始化调用、组件挂载 - [x] 移除配置请求和复杂 watch 编排逻辑 - [x] 只通过编排器触发初始化和页面切换 ## 8.2 `LayerController.vue` - [x] 只保留树渲染与勾选事件 - [x] 移除互斥规则 - [x] 移除基础图层初始化编排逻辑 ## 8.3 `MapLegend.vue` - [x] 只保留图例渲染与点击事件分发 - [x] 不直接调用地图实例 ## 8.4 `MapFilter.vue` - [x] 只保留表单与用户输入 - [x] 搜索、容量、时间、基地变化全部通过编排器分发 - [x] 不直接修改图例运行态和锚点显隐 验收标准: - 组件文件职责单一; - UI 组件中不再出现大段业务逻辑; - 地图相关行为主要集中在编排层和 Store。 --- ## 9. 阶段七:性能优化 ## 9.1 请求与缓存优化 - [x] 将 `GisUrlList.ts` 预编译为索引字典,而不是每次请求时重建 - [x] 实现真实请求去重 - [x] 增加请求取消能力,避免菜单切换时旧请求回写 - [x] 对图层加载增加并发控制 - [x] 将缓存 key 与图层 key、筛选条件绑定 ## 9.2 锚点显示优化 - [x] 图例切换时只处理目标图例对应的锚点集合 - [x] 图层切换时优先切换图层可见性,不重复加点 - [x] 减少 hover 时全量点图层重绘 - [x] 减少样式函数中的业务判断复杂度 验收标准: - 首屏加载时长不高于当前; - 图层勾选、图例勾选、基地切换响应速度优于当前; - 菜单快速切换时不出现旧数据回写。 --- ## 10. 回归测试清单 每完成一个阶段,至少回归以下功能: - [x] 地图初始化正常 - [x] 默认基础图层正常显示 - [x] 图层树勾选与取消勾选正常 - [x] 图例随图层选中动态显示 - [x] 图例点击能正确控制锚点显隐 - [x] 基地切换后区域裁切和锚点过滤正常 - [x] 锚点 hover Popup 正常 - [x] 锚点点击详情弹窗正常 - [x] 时间筛选、容量筛选、搜索定位正常 - [x] 视频监控站与 AI 视频监控站互斥正常 - [x] 菜单切换后地图数据不串页 --- ## 11. 实施顺序建议 推荐严格按以下顺序执行: 1. 阶段一:现状收口与问题修复 2. 阶段二:规则收口 3. 阶段三:拆分 Store 4. 阶段四:建立统一编排层 5. 阶段五:拆分 OpenLayers 渲染层 6. 阶段六:组件瘦身 7. 阶段七:性能优化 不建议直接跳到渲染层拆分或性能优化,否则会在旧结构上重复返工。 --- ## 12. 本轮交付标准 当本清单全部完成后,应达到以下结果: - 地图模块核心职责划分清晰; - 图层树、图例、锚点、筛选、基地切换链路可追踪; - 关键规则不再散落在多个组件里; - `map.ts` 和 `map.ol.ts` 体积明显下降; - 新增地图业务时有明确扩展点; - 后续继续做底图体系优化、长期性能建设时不需要再推翻本轮结构。