263 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 3D态势感知应急驾驶舱 - 重构版
## 📋 项目概述
这是对从蓝湖导出的 `3DSituationalAwarenessCopy` 页面的完整重构版本,解决了原始代码的可维护性问题。
## ✨ 重构成果
### 改进前(原始代码)
- ❌ 792 行代码全在一个文件
- ❌ 使用 `group_1``block_1` 等无意义命名
- ❌ 硬编码像素值,不支持响应式
- ❌ 深层嵌套的 div 结构
- ❌ 绝对定位 + margin 混乱布局
### 改进后(重构代码)
- ✅ 拆分为 20+ 个独立组件
- ✅ 语义化命名,一目了然
- ✅ 使用 vw/vh/fs 响应式单位
- ✅ 清晰的组件层次结构
- ✅ CSS Grid + Flexbox 现代布局
- ✅ Vue 3 Composition API + `<script setup>`
## 📁 目录结构
```
3DSituationalAwarenessRefactor/
├── index.vue # 主页面入口
├── components/ # 组件目录
│ ├── PageHeader.vue # 顶部导航栏
│ ├── LeftPanel/ # 左侧面板
│ │ ├── index.vue # 面板容器
│ │ ├── DisasterAnalysis.vue # 灾害分析
│ │ ├── ForcePreset.vue # 力量预置
│ │ ├── ForceDispatch.vue # 力量调度
│ │ └── CollaborationInfo.vue # 协同信息
│ ├── MapViewer/ # 地图区域
│ │ ├── index.vue # 地图容器
│ │ └── MapControls.vue # 地图控制工具
│ ├── RightPanel/ # 右侧面板
│ │ ├── index.vue # 面板容器
│ │ ├── DispatchCommand.vue # 调度指挥
│ │ ├── VideoMonitorGrid.vue # 视频监控网格
│ │ ├── VideoMonitorItem.vue # 视频监控卡片
│ │ └── DispatchSuggestion.vue # 调度建议
│ ├── shared/ # 公共组件
│ │ ├── PanelHeader.vue # 面板标题
│ │ ├── DataField.vue # 数据字段
│ │ └── ActionButton.vue # 操作按钮
│ └── Popups/ # 弹窗组件
│ ├── PersonnelDetail.vue # 应急人员详情
│ └── EmergencyCenterDetail.vue # 应急中心详情
├── composables/ # 组合式函数
│ ├── useDisasterData.js # 灾害数据管理
│ ├── useForceDispatch.js # 力量调度逻辑
│ └── useVideoMonitor.js # 视频监控状态
├── assets/ # 资源文件
│ ├── styles/
│ │ └── common.scss # 公共样式
│ └── images/ # 图片资源需从Copy目录迁移
├── constants.js # 常量定义
└── README.md # 本文档
```
## 🎯 核心功能模块
### 1. 顶部导航栏
- 返回驾驶舱按钮
- 系统标题
- 灾后现场实景入口
- 设置按钮
### 2. 左侧面板(灾害分析与调度)
- **快速感知(灾害分析)**:灾害类型、损坏方量、滑坡体尺寸、人员伤亡等
- **快速匹配(力量预置)**:应急装备、基地、人员统计,附近养护站列表
- **快速响应(力量调度)**:响应等级、智能应急方案、预计抢通时间
- **协同信息**:气象预警、公安部门、融媒体中心的实时信息
### 3. 中央地图区域
- 3D 地图展示(支持接入 Cesium、Mapbox GL JS 等)
- 地图标记点(应急人员、应急中心)
- 测量工具栏(模型对比、测量方量、测量位置/距离)
### 4. 右侧面板(现场处置)
- **调度指挥**:现场单兵/设备/无人机列表(标签页切换)
- **视频监控网格**4 视角视频监控(单兵、无人机、指挥车外部/会议)
- **调度建议**:智能调度力量建议卡片
### 5. 弹窗组件
- **应急人员详情**:姓名、部门、位置、预计到达时间、联动操作
- **应急中心详情**:名称、行政等级、隶属单位、位置信息
## 🔧 技术栈
- **Vue 3**Composition API + `<script setup>` 语法
- **SCSS**:样式预处理器
- **响应式设计**vw/vh/fs 函数(项目统一方案)
- **状态管理**Composables组合式函数
- **组件通信**Props/Emits + Provide/Inject
## 📦 安装与使用
### 1. 图片资源迁移
**重要**:由于图片资源仍在原始目录,需要手动迁移或更新引用路径:
```bash
# 方案 1复制图片到新目录
cp -r ../3DSituationalAwarenessCopy/assets/img/* ./assets/images/
# 方案 2创建符号链接开发环境
ln -s ../3DSituationalAwarenessCopy/assets/img ./assets/images
```
### 2. 图片命名优化(可选)
原始图片命名为 `SketchPng...`,建议重命名为语义化名称:
```
SketchPng6e14... → map-background.png
SketchPng7ba5... → left-panel-bg.png
SketchPng9eb4... → disaster-type-icon.png
...
```
可以使用脚本批量重命名,或手动整理。
### 3. 启动项目
```bash
# 在项目根目录
pnpm dev:screen
```
访问路由:`/3d-situational-awareness-refactor`
## 🎨 样式规范
### CSS 变量(定义在 common.scss
```scss
--primary-color: rgba(28, 161, 255, 1); // 主色
--bg-dark: rgba(9, 22, 40, 1); // 深色背景
--bg-panel: rgba(20, 53, 118, 1); // 面板背景
--text-white: rgba(255, 255, 255, 1); // 白色文字
--success-color: rgba(17, 187, 119, 1); // 成功色
--warning-color: rgba(255, 128, 11, 1); // 警告色
--danger-color: rgba(255, 6, 36, 1); // 危险色
```
### 响应式单位
```scss
width: vw(564); // 宽度
height: vh(200); // 高度
font-size: fs(16); // 字体大小
```
### BEM 命名规范
```scss
.disaster-analysis {
&__content { } // 元素
&__row { } // 元素
&--active { } // 修饰符
}
```
## 🚀 后续工作
### 必须完成
1. **图片资源迁移**:将原始图片复制到新目录并更新引用
2. **真实图片替换**:替换占位图片为设计稿中的实际图片
3. **API 对接**:实现真实数据接口对接
### 建议优化
1. **3D 地图集成**:接入 Cesium 或 Mapbox GL JS
2. **视频流接入**:实现真实视频流播放
3. **动画效果**:添加过渡动画和交互反馈
4. **性能优化**:按需加载、虚拟滚动等
5. **单元测试**:编写组件单元测试
## 📝 组件使用示例
### 使用 DataField 组件
```vue
<DataField
label="灾害类型"
value="边坡垮塌"
icon="path/to/icon.png"
color-type="danger"
/>
```
### 使用 ActionButton 组件
```vue
<ActionButton
text="一键启动"
type="primary"
size="medium"
icon="path/to/icon.png"
@click="handleClick"
/>
```
### 使用 PanelHeader 组件
```vue
<PanelHeader title="快速感知" subtitle="「灾害分析」">
<template #extra>
<button>额外操作</button>
</template>
</PanelHeader>
```
## 🔍 对比原始代码
### 原始代码片段(不可维护)
```vue
<div class="group_3 flex-col">
<div class="section_1 flex-row">
<div class="block_1 flex-row justify-between">
<img class="thumbnail_1" src="..." />
<span class="text_1">返回驾驶舱</span>
</div>
</div>
</div>
```
### 重构后代码(清晰可维护)
```vue
<PageHeader @back="handleBack">
<template #left>
<button class="back-btn">
<img class="back-icon" src="..." />
<span class="back-text">返回驾驶舱</span>
</button>
</template>
</PageHeader>
```
## 📊 重构统计
| 指标 | 改进前 | 改进后 | 提升 |
|------|--------|--------|------|
| 单文件行数 | 792 行 | < 200 /组件 | 75% |
| 组件数量 | 1 | 20+ | - |
| 样式可读性 | | | 显著提升 |
| 代码可维护性 | | | 显著提升 |
| 响应式支持 | | 完整 | 新增 |
## 👥 团队协作建议
1. **组件开发**每个组件由独立开发者维护
2. **样式规范**严格遵循 BEM 命名和响应式单位
3. **代码审查**确保组件职责单一可复用性高
4. **文档更新**新增组件或修改 API 时及时更新文档
## 📞 联系方式
如有问题或建议请联系项目负责人
---
**重构完成日期**2025-11-14
**重构版本**v1.0.0