| | |
| | | <template> |
| | | <div class="data-dashboard"> |
| | | <!-- 地图模式切换 --> |
| | | <div class="map-mode-card"> |
| | | <div class="mode-tab-container"> |
| | | <div |
| | | v-for="mode in mapModes" |
| | | :key="mode.value" |
| | | class="mode-tab" |
| | | :class="{ active: activeMode === mode.value }" |
| | | @click="handleModeChange(mode)" |
| | | > |
| | | {{ mode.label }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 顶部指标卡片区 --> |
| | | <div class="top-cards"> |
| | | <!-- 时间周期选项卡片 --> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="cards-container"> |
| | | <!-- 设备在线率 --> |
| | | <el-popover placement="right-start" title="设备监控" width="400" trigger="click"> |
| | |
| | | <h4>图例</h4> |
| | | </div> |
| | | <div class="legend-items"> |
| | | <div class="legend-item"> |
| | | <!-- 污染态势模式下显示的图例 --> |
| | | <div v-if="activeMode === 'pollution'" class="legend-item"> |
| | | <img src="@/assets/exceed.png" alt="油烟浓度超标" class="legend-icon" /> |
| | | <span class="legend-text">油烟浓度超标</span> |
| | | </div> |
| | | <div class="legend-item"> |
| | | <div v-if="activeMode === 'pollution'" class="legend-item"> |
| | | <img src="@/assets/exception.png" alt="供电异常" class="legend-icon" /> |
| | | <span class="legend-text">供电异常</span> |
| | | </div> |
| | | <div class="legend-item"> |
| | | <div v-if="activeMode === 'pollution'" class="legend-item"> |
| | | <img src="@/assets/offline.png" alt="设备或网络异常" class="legend-icon" /> |
| | | <span class="legend-text">设备或网络异常</span> |
| | | </div> |
| | | <div class="legend-item"> |
| | | <!-- 设备状态模式下也显示在线状态 --> |
| | | <div v-if="activeMode === 'device'" class="legend-item"> |
| | | <img |
| | | src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSI1IiB5PSI4IiB3aWR0aD0iMjIiIGhlaWdodD0iMTYiIHJ4PSIzIiBmaWxsPSIjNTJjNDFhIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiLz48cGF0aCBkPSJNNSA4IFEgMTYgMyAyNyA4IiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9IiMzODllMGQiLz48cGF0aCBkPSJNNSAyNCBRIDE2IDI5IDI3IDI0IiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9IiM2NjY2NjYiLz48cmVjdCB4PSI4IiB5PSIxMSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjEwIiByeD0iMiIgZmlsbD0id2hpdGUiLz48cGF0aCBkPSJNMTIgMTQgTCAyMSAxNCIgc3Ryb2tlPSIjNTJjNDFhIiBzdHJva2Utd2lkdGg9IjEuNSIvPjxwYXRoIGQ9Ik0xMiAxNyBMIDE4IDE3IiBzdHJva2U9IiM1MmM0MWEiIHN0cm9rZS13aWR0aD0iMS41Ii8+PHBhdGggZD0iTTEyIDIwIEwgMTUgMjAiIHN0cm9rZT0iIzUyYzQxYSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48bGluZSB4MT0iMTYiIHkxPSI4IiB4Mj0iMTYiIHkyPSIzIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjEuNSIvPjxjaXJjbGUgY3g9IjE2IiBjeT0iMyIgcj0iMS41IiBmaWxsPSJ3aGl0ZSIvPjxjaXJjbGUgY3g9IjI3IiBjeT0iMTYiIHI9IjMiIGZpbGw9IiNmZmZmZmYiLz48Y2lyY2xlIGN4PSIyNyIgY3k9IjE2IiByPSIxLjUiIGZpbGw9IiM1MmM0MWEiLz48bGluZSB4MT0iNSIgeTE9IjEzIiB4Mj0iNiIgeTI9IjEzIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjEuNSIvPjxsaW5lIHgxPSI1IiB5MT0iMTkiIHgyPSI2IiB5Mj0iMTkiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41Ii8+PC9zdmc+" |
| | | alt="在线状态" |
| | |
| | | /> |
| | | <span class="legend-text">在线状态</span> |
| | | </div> |
| | | <div class="legend-item"> |
| | | <div v-if="activeMode === 'device'" class="legend-item"> |
| | | <img |
| | | src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB4PSI1IiB5PSI4IiB3aWR0aD0iMjIiIGhlaWdodD0iMTYiIHJ4PSIzIiBmaWxsPSIjOGM4YzhjIiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiLz48cGF0aCBkPSJNNSA4IFEgMTYgMyAyNyA4IiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9IiM2NjY2NjYiLz48cGF0aCBkPSJNNSAyNCBRIDE2IDI5IDI3IDI0IiBzdHJva2U9IndoaXRlIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9IiM2NjY2NjYiLz48cmVjdCB4PSI4IiB5PSIxMSIgd2lkdGg9IjE2IiBoZWlnaHQ9IjEwIiByeD0iMiIgZmlsbD0id2hpdGUiLz48bGluZSB4MT0iMTEiIHkxPSIxMiIgeDI9IjIxIiB5Mj0iMjIiIHN0cm9rZT0iIzhjOGM4YyIgc3Ryb2tlLXdpZHRoPSIyIi8+PGxpbmUgeDE9IjExIiB5MT0iMjIiIHgyPSIyMSIgeTI9IjEyIiBzdHJva2U9IiM4YzhjOGMiIHN0cm9rZS13aWR0aD0iMiIvPjxsaW5lIHgxPSIxNiIgeTE9IjgiIHgyPSIxNiIgeTI9IjMiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41Ii8+PGNpcmNsZSBjeD0iMTYiIGN5PSIzIiByPSIxLjUiIGZpbGw9IndoaXRlIi8+PGNpcmNsZSBjeD0iMjciIGN5PSIxNiIgcj0iMyIgZmlsbD0iI2ZmZmZmZiIvPjxjaXJjbGUgY3g9IjI3IiBjeT0iMTYiIHI9IjEuNSIgZmlsbD0iIzhjOGM4YyIvPjxsaW5lIHgxPSI1IiB5MT0iMTMiIHgyPSI2IiB5Mj0iMTMiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS13aWR0aD0iMS41Ii8+PGxpbmUgeDE9IjUiIHkxPSIxOSIgeDI9IjYiIHkyPSIxOSIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLXdpZHRoPSIxLjUiLz48L3N2Zz4=" |
| | | alt="离线状态" |
| | |
| | | data() { |
| | | return { |
| | | activeTime: 'day', |
| | | currentDate: new Date('2023-08-01'), |
| | | activeMode: 'pollution', // 默认污染态势模式 |
| | | currentDate: new Date('2025-08-01'), |
| | | timeTabs: [ |
| | | { label: '日', value: 'day' }, |
| | | { label: '周', value: 'week' }, |
| | | { label: '月', value: 'month' }, |
| | | ], |
| | | mapModes: [ |
| | | { label: '污染态势', value: 'pollution' }, |
| | | { label: '设备状态', value: 'device' }, |
| | | ], |
| | | selectedPoint: { |
| | | enterpriseName: '', |
| | |
| | | this.activeTime = tab.value |
| | | // 模拟切换时间周期后的数据更新 |
| | | this.updateMetrics() |
| | | }, |
| | | handleModeChange(mode) { |
| | | this.activeMode = mode.value |
| | | }, |
| | | navigateTime(direction) { |
| | | const newDate = new Date(this.currentDate) |
| | |
| | | justify-content: center; |
| | | margin-bottom: 8px; |
| | | min-width: 300px; |
| | | } |
| | | |
| | | /* 地图模式卡片 */ |
| | | .map-mode-card { |
| | | position: absolute; |
| | | top: 4px; |
| | | left: 50%; |
| | | transform: translateX(-50%); |
| | | z-index: 10; |
| | | background-color: #ffffff; |
| | | border-radius: 8px; |
| | | padding: 4px 16px; |
| | | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08); |
| | | display: flex; |
| | | flex-direction: column; |
| | | justify-content: center; |
| | | margin-bottom: 8px; |
| | | min-width: 300px; |
| | | } |
| | | |
| | | .mode-tab-container { |
| | | display: flex; |
| | | flex-direction: row; |
| | | gap: 8px; |
| | | width: 100%; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .mode-tab { |
| | | padding: 4px 8px; |
| | | border-radius: 4px; |
| | | cursor: pointer; |
| | | font-size: 14px; |
| | | font-weight: 500; |
| | | transition: all 0.3s ease; |
| | | color: #4e5969; |
| | | text-align: center; |
| | | border: 1px solid #e8e8e8; |
| | | background-color: #fafafa; |
| | | flex: 1; |
| | | } |
| | | |
| | | .mode-tab.active { |
| | | background-color: #1890ff; |
| | | color: #ffffff; |
| | | border-color: #1890ff; |
| | | box-shadow: 0 2px 8px rgba(24, 144, 255, 0.2); |
| | | } |
| | | |
| | | .mode-tab:hover:not(.active) { |
| | | color: #1890ff; |
| | | border-color: #e6f7ff; |
| | | background-color: #e6f7ff; |
| | | } |
| | | |
| | | .time-period-card .card-title { |
| | |
| | | text-align: left; |
| | | } |
| | | } */ |
| | | </style> |
| | | </style> |