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