271 lines
6.1 KiB
Markdown
Raw Normal View History

# 安全保通服务大屏 - 重构说明
## 📦 重构概览
本次重构将原来 567 行的单一组件拆分为模块化的组件架构,提高了代码的可维护性和可扩展性。
## 🎯 主要改进
### 1. **组件化架构**
- ✅ 将单一大文件拆分为 7 个独立组件
- ✅ 每个组件职责单一,易于维护
- ✅ 组件可复用,便于扩展
### 2. **布局方式优化**
-**重构前**: 大量使用 `position: absolute` 和固定像素定位
-**重构后**: 使用 CSS Grid 和 Flexbox 实现响应式布局
- ✅ 更易调整和适配不同屏幕尺寸
### 3. **数据驱动**
-**重构前**: 数据硬编码在模板中
-**重构后**: 使用 Vue 3 Composition API,数据驱动渲染
- ✅ 便于后续接入真实 API 数据
### 4. **样式管理**
-**重构前**: 类名混乱 (`box_1`, `group_3` 等)
-**重构后**: 语义化类名,易于理解
- ✅ 样式模块化,避免全局污染
## 📁 目录结构
```
cockpit/
├── index.vue # 主入口文件
├── components/ # 组件目录
│ ├── CockpitLayout.vue # 主布局组件
│ ├── PageHeader.vue # 页面头部
│ ├── WeatherWarning.vue # 气象预警 (左上)
│ ├── EmergencyResources.vue # 应急资源 (左下)
│ ├── BlockEvent.vue # 阻断事件 (右上)
│ ├── YearStatistics.vue # 往年统计 (右下)
│ └── MapCenter.vue # 中间地图区域
└── assets/ # 资源文件
└── img/ # 图片资源
```
## 🔧 组件说明
### 1. CockpitLayout.vue (主布局)
使用 CSS Grid 三列布局:
```css
grid-template-columns: 580px 1fr 580px;
```
- 左侧面板: 固定 580px
- 中间地图: 自适应剩余空间
- 右侧面板: 固定 580px
### 2. PageHeader.vue (页面头部)
- 居中显示标题 "安全保通服务"
- 右侧应用按钮
- 使用 Flexbox 布局
### 3. WeatherWarning.vue (气象预警)
**数据结构**:
```javascript
{
warningLevels: [
{ id, name, count, color, icon }
],
districts: [
{ id, name, km, warning, warningColor }
]
}
```
**功能**:
- 四级预警图标展示 (蓝/黄/橙/红)
- 海拔800米以上气象情况
- 区县预警列表
### 4. EmergencyResources.vue (应急资源)
**数据结构**:
```javascript
{
resources: [
{ id, name, stations, supplies, equipment, equipmentClass, hasAlert }
]
}
```
**功能**:
- 展示各区县应急资源数量
- 服务站点、应急物资、应急设备统计
- 异常状态图标提示
### 5. BlockEvent.vue (阻断事件)
**数据结构**:
```javascript
{
stats: [
{ id, title, value }
]
}
```
**功能**:
- 统计卡片展示 (2列网格布局)
- 当前封闭交通、限速通行、抢通等数据
### 6. YearStatistics.vue (往年统计)
**功能**:
- 冰雪事件趋势图 (当前使用静态图片)
- 图表图例
- 坐标轴标签
**TODO**: 集成 ECharts 实现动态图表
### 7. MapCenter.vue (中间地图)
**功能**:
- 顶部功能按钮 (服务站点/预警路段/气象预警)
- 地图标记点
- 底部菜单 (应急体系/重大事件处置等)
- 中央功能菜单
**TODO**: 集成实际地图 API (如高德地图/百度地图)
## 🚀 使用方式
### 1. 基础使用
```vue
<template>
<CockpitLayout />
</template>
<script setup>
import CockpitLayout from './components/CockpitLayout.vue'
</script>
```
### 2. 修改数据
每个组件都使用 `ref` 定义响应式数据,可以直接修改:
```javascript
// WeatherWarning.vue
const districts = ref([
{ id: 1, name: '万州区', km: 32, warning: '红色预警', warningColor: 'rgba(229, 37, 42, 1)' }
])
```
### 3. 接入 API
将静态数据改为 API 调用:
```javascript
import { ref, onMounted } from 'vue'
import { fetchDistricts } from '@/api/weather'
const districts = ref([])
onMounted(async () => {
districts.value = await fetchDistricts()
})
```
## 📊 后续优化建议
### 1. 集成真实地图
推荐使用:
- 高德地图 API
- 百度地图 API
- Mapbox GL
### 2. 集成图表库
推荐使用:
- **ECharts** (功能强大,配置灵活)
- Chart.js
- D3.js
示例代码:
```javascript
import * as echarts from 'echarts'
onMounted(() => {
const chart = echarts.init(chartRef.value)
chart.setOption({
xAxis: { data: xAxisYears.value },
yAxis: {},
series: [
{ type: 'line', data: [1000, 2000, 3000, 4000, 5000] }
]
})
})
```
### 3. 添加响应式适配
使用媒体查询或 `vw/vh` 单位适配不同屏幕:
```css
@media (max-width: 1920px) {
.cockpit-main {
grid-template-columns: 450px 1fr 450px;
}
}
```
### 4. 添加数据刷新
使用定时器或 WebSocket 实现实时数据更新:
```javascript
import { useIntervalFn } from '@vueuse/core'
useIntervalFn(() => {
refreshData()
}, 30000) // 每30秒刷新
```
### 5. 添加交互功能
- 地图标记点击事件
- 表格行点击查看详情
- 图表数据筛选
- 时间范围选择
### 6. 性能优化
- 使用虚拟滚动处理大量数据
- 图片懒加载
- 组件懒加载
```javascript
const MapCenter = defineAsyncComponent(() =>
import('./components/MapCenter.vue')
)
```
## ⚠️ 注意事项
1. **图片路径**: 确保所有图片资源存在于 `assets/img/` 目录中
2. **字体文件**: 部分组件使用自定义字体,需要确保字体文件已引入
3. **浏览器兼容**: Grid 布局需要现代浏览器支持 (IE11+ 需要 polyfill)
## 🎨 布局对比
### 重构前
```
├── 嵌套10层+ div
├── position: absolute 定位超过50处
├── 固定 margin/left/top 值
└── 567行单文件
```
### 重构后
```
├── 语义化组件结构
├── Grid + Flexbox 布局
├── 响应式设计理念
└── 7个模块化组件,平均每个约150行
```
## 📝 版本历史
- **v2.0** (2025-01-XX) - 组件化重构,使用 Grid 布局
- **v1.0** (之前) - 原始版本,单文件实现
## 🤝 贡献指南
1. 修改组件时保持单一职责原则
2. 新增功能优先考虑组件复用
3. 样式使用 scoped,避免全局污染
4. 数据结构清晰,便于接入 API
---
如有问题或建议,请联系开发团队。