diff --git a/docs/superpowers/plans/2026-08-26-monitor-jcweb3-align.md b/docs/superpowers/plans/2026-08-26-monitor-jcweb3-align.md new file mode 100644 index 0000000..26d0a0e --- /dev/null +++ b/docs/superpowers/plans/2026-08-26-monitor-jcweb3-align.md @@ -0,0 +1,158 @@ +# Monitor 整页对齐 jcWeb 3 Implementation Plan + +> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. + +**Goal:** 按 `jcWeb 3` 整页对齐 `/monitor`:右侧栏文案、机巢状态弹窗、无人机图传与当前任务、地图工具条/比例尺/绑定虚线。 + +**Architecture:** 在现有 `MonitorView` + Mapbox 能力上增量改。弹窗与任务块本地实现;地图样式切换走 `mapStyles` + `style.load` 恢复 layers;绑定线用 line layer。 + +**Tech Stack:** Vue 3、Mapbox GL、现有 live API / devicesStore realtime、`prototype.css` + +**Spec:** `docs/superpowers/specs/2026-08-26-monitor-jcweb3-align-design.md` + +--- + +### Task 1: 右侧栏文案与飞行/环境对齐 + +**Files:** +- Modify: `src/views/MonitorView/MonitorView.vue` +- Modify: `src/styles/prototype.css`(如需 mission-state / 环境副文案) + +**Steps:** +1. 环境区: + - 标题改为「机巢环境」 + - 副文案显示更新时间 + - 字段:舱外温度 / 风速 / 雨量 + - 雨量 helper:有数值 → `x mm`;否则 bool;都无 → `--` +2. 无人机飞行区: + - 四格文案改为:飞行电量 / 相对高度 / 地速 / 卫星数量 + - 标题旁 `mission-state`(任务中/停放待命等),基于 `statusClass` / status +3. 关联:`绑定机巢` → `所属机巢`(按钮仍 `select(parent)`) +4. 无人机 eyebrow 可改为「无人机设备」(对齐原型) + +**Acceptance:** +- 机巢环境三字段文案对齐 +- 无人机飞行四格文案对齐且速度一位小数 +- 所属机巢可切换 + +--- + +### Task 2: 机巢状态弹窗替换「查看详情」跳转 + +**Files:** +- Modify: `src/views/MonitorView/MonitorView.vue` +- Modify: `src/styles/prototype.css`(dock-status-dialog 样式,可从 jcWeb 3 迁移精简版) + +**Steps:** +1. 新增弹窗状态 `dockStatusOpen` +2. 运行状态旁「查看详情」→ `openDockStatus()`,**不再** `router.push` +3. header maximize 保留 `goDetail()` 进设备详情(职责分离) +4. 弹窗结构对齐原型: + - header:机巢运行状态 + 名称 + 关闭 + - 摘要格:设备连接 / 无人机状态 / 舱门 / 充电 / 控制模式 / 当前告警 + - 明细板:舱门/归中/系统状态(有 realtime 则高亮 active) +5. 复用已有 `rt` / `doorValue` / `chargeText` / `centering` 映射 +6. 遮罩点击与 Escape 关闭 + +**Acceptance:** +- 点「查看详情」开弹窗,不跳路由 +- maximize 仍可进 `/device/:id` +- 缺字段不造假 + +--- + +### Task 3: 无人机视频区 + +**Files:** +- Modify: `src/views/MonitorView/MonitorView.vue` +- Modify: `src/components/LivePlayer.vue`(仅当需透传 label) + +**Steps:** +1. 视频 section 从 `v-if="!isDrone"` 改为机巢/无人机都显示 +2. `:camera-label="isDrone ? '无人机图传' : '机巢摄像头'"` +3. live join 逻辑:无人机选中时用所属机巢 `dockId` 拉流(现有 live API 以 dock 为维度);切换选中关闭旧 session +4. 无流保持待机壳 + +**Acceptance:** +- 选中无人机可见视频区,标签为「无人机图传」 +- 切换设备时 session 正确切换/关闭 + +--- + +### Task 4: 当前任务块 + +**Files:** +- Modify: `src/views/MonitorView/MonitorView.vue` +- Modify: `src/styles/prototype.css`(mission-progress 样式,可参考 jcWeb 3) + +**Steps:** +1. 无人机态在飞行状态与控制区之间插入 `mission-progress` +2. 从 realtime / record 读取: + - `missionName` / `mission` + - 进度、航点、时长、距离(有则显示,无则 `--`) +3. 无任务名/无进行中任务 → 空态「暂无任务」 +4. 「任务详情」:有 task id 则跳任务页;否则 toast 或 disabled +5. 1080p 密度规则补 mission 块间距 + +**Acceptance:** +- 有数据展示进度信息;无数据空态 +- 不引入新 API 字段协议 + +--- + +### Task 5: 地图工具条、比例尺、绑定虚线 + +**Files:** +- Modify: `src/views/MonitorView/MonitorView.vue` +- Modify: `src/core/mapHelper.js` 和/或 `src/layout/MapLayer.vue`(如需 `setStyle` 封装) +- Modify: `src/config/map.js`(如需 export 双样式) +- Modify: `src/styles/prototype.css`(toolbar / scale 定位) + +**Steps:** +1. 地图层叠加 UI: + - 左上:`卫星` / `地图` + fitAll 按钮 + - 右下:动态 `map-scale` 文案 +2. 样式切换: + - `map.setStyle(mapStyles.satelliteMap | streetMap)` + - 监听 `style.load` 后重建 marker images / symbol layers / binding line source +3. fitAll: + - 有选中:`clearSelection` + `resetOverviewCamera` + - 无选中:`fitBounds` 全部有效坐标 +4. 绑定虚线 layer: + - source geojson LineString:选中机巢坐标 ↔ 飞行中子无人机坐标 + - 仅 `!inDock` 且两端坐标有效时 `setData`;否则空 feature +5. zoom/move 时更新比例尺估算(简单 zoom→米/公里映射即可) + +**Acceptance:** +- 卫星/地图切换后点位仍在 +- fitAll 行为正确 +- 选中飞行关系出现虚线;在巢/无坐标不显示 +- 比例尺可见并随缩放变化 + +--- + +### Task 6: 浏览器冒烟(1920×1080) + +**Steps:** +1. mock docks/drones + realtime(含 door/charge/mission/坐标) +2. 验证: + - 环境/飞行文案 + - 查看详情弹窗 + - 无人机视频标签 + - 任务块有/无数据 + - 地图切换、fitAll、绑定线、比例尺 + - 右侧栏尽量无外层滚动 +3. 回归:机巢运行态四格、速度一位小数 + +**Acceptance:** +- 上述路径 DOM/截图可证 +- 无控制台致命错误 + +--- + +### Execution note + +- 跳过全仓 formatter / 全量测试 +- 不改后端协议 +- 中文 commit +- 与工作区其他 WIP 隔离提交 diff --git a/src/views/MonitorView/MonitorView.vue b/src/views/MonitorView/MonitorView.vue index c353e4c..cd15a61 100644 --- a/src/views/MonitorView/MonitorView.vue +++ b/src/views/MonitorView/MonitorView.vue @@ -87,7 +87,7 @@