|
|
@@ -1,43 +1,354 @@
|
|
|
<template>
|
|
|
<div class="water-station-content">
|
|
|
- <div class="left-panel">
|
|
|
- <div class="left-panel-3d">
|
|
|
- <m-card title="圩区统计" class="water-station-card" :width="398" :height="450">
|
|
|
- <div class="stats-panel">
|
|
|
- <div class="core-indicator">
|
|
|
- <div class="indicator-main">
|
|
|
- <span class="main-value">94</span>
|
|
|
- <span class="main-unit">个</span>
|
|
|
+ <!-- 圩区总览 -->
|
|
|
+ <template v-if="!selectedPolderDetail">
|
|
|
+ <div class="left-panel">
|
|
|
+ <div class="left-panel-3d">
|
|
|
+ <m-card title="圩区统计" class="water-station-card water-station-card-top" :width="398" :height="280">
|
|
|
+ <div class="stats-panel">
|
|
|
+ <div class="core-indicator">
|
|
|
+ <div class="indicator-main">
|
|
|
+ <span class="main-value">94</span>
|
|
|
+ <span class="main-unit">个</span>
|
|
|
+ </div>
|
|
|
+ <div class="indicator-label">圩区总数</div>
|
|
|
+ </div>
|
|
|
+ <div class="stats-grid">
|
|
|
+ <div class="stat-item">
|
|
|
+ <div class="stat-value">18</div>
|
|
|
+ <div class="stat-label">骨干河道</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <div class="stat-value">618</div>
|
|
|
+ <div class="stat-label">防洪闸</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <div class="stat-value">560</div>
|
|
|
+ <div class="stat-label">排涝站</div>
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <div class="stat-value">2173.69<span class="stat-unit">m³/s</span></div>
|
|
|
+ <div class="stat-label">排涝流量</div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="indicator-label">圩区总数</div>
|
|
|
</div>
|
|
|
- <div class="stats-grid">
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">18</div>
|
|
|
- <div class="stat-label">骨干河道</div>
|
|
|
+ </m-card>
|
|
|
+ <m-card title="圩区信息" class="water-station-card water-station-card-bottom" :width="398" :height="520">
|
|
|
+ <div class="polder-list">
|
|
|
+ <div class="polder-list-header">
|
|
|
+ <div class="header-item">序号</div>
|
|
|
+ <div class="header-item">圩区名称</div>
|
|
|
+ <div class="header-item">实时水位</div>
|
|
|
+ <div class="header-item">控制水位</div>
|
|
|
+ <div class="header-item">流量</div>
|
|
|
+ <div class="header-item">运行情况</div>
|
|
|
+ </div>
|
|
|
+ <div class="polder-list-body">
|
|
|
+ <div class="polder-item" v-for="(item, index) in polderList" :key="index">
|
|
|
+ <div class="item-cell">{{ index + 1 }}</div>
|
|
|
+ <div class="item-cell">{{ item.name }}</div>
|
|
|
+ <div class="item-cell">{{ item.waterLevel }}</div>
|
|
|
+ <div class="item-cell">{{ item.controlLevel }}</div>
|
|
|
+ <div class="item-cell">{{ item.flow }}</div>
|
|
|
+ <div class="item-cell">
|
|
|
+ <div class="rate-bar">
|
|
|
+ <div class="rate-fill" :style="{ width: item.rate }"></div>
|
|
|
+ <span class="rate-text">{{ item.rate }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </m-card>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 圩区详情 -->
|
|
|
+ <template v-else>
|
|
|
+ <div class="left-panel">
|
|
|
+ <div class="left-panel-3d">
|
|
|
+ <!-- 圩区水位分析 -->
|
|
|
+ <m-card :title="selectedPolderDetail === 'konggang' ? '孔港联圩水位分析' : '圩区水位分析'" class="water-station-card water-station-card-top" :width="398" :height="320">
|
|
|
+ <div class="water-level-analysis-panel">
|
|
|
+ <!-- 水位数据 -->
|
|
|
+ <div class="water-level-data">
|
|
|
+ <div class="data-item">
|
|
|
+ <div class="data-label">水位(m)</div>
|
|
|
+ <div class="data-value">2.54</div>
|
|
|
+ </div>
|
|
|
+ <div class="data-item">
|
|
|
+ <div class="data-label">比昨日(m)</div>
|
|
|
+ <div class="data-value negative">-0.05</div>
|
|
|
+ </div>
|
|
|
+ <div class="data-item">
|
|
|
+ <div class="data-label">历史最高(m)</div>
|
|
|
+ <div class="data-value">4.06</div>
|
|
|
+ </div>
|
|
|
+ <div class="data-item">
|
|
|
+ <div class="data-label">生态水位(m)</div>
|
|
|
+ <div class="data-value">2.08</div>
|
|
|
+ </div>
|
|
|
+ <div class="data-item">
|
|
|
+ <div class="data-label">比警戒(m)</div>
|
|
|
+ <div class="data-value negative">-0.79</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 水位趋势图 -->
|
|
|
+ <div class="water-level-chart">
|
|
|
+ <VChart ref="waterLevelChart" :option="waterLevelChartOption" :autoresize="true" style="width: 100%; height: 100%;" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </m-card>
|
|
|
+
|
|
|
+ <!-- 代表站水位排序 -->
|
|
|
+ <m-card title="代表站水位排序" class="water-station-card water-station-card-bottom" :width="398" :height="480">
|
|
|
+ <div class="station-ranking-panel">
|
|
|
+ <div class="ranking-table">
|
|
|
+ <div class="ranking-row header">
|
|
|
+ <div class="ranking-cell">区镇</div>
|
|
|
+ <div class="ranking-cell">站名</div>
|
|
|
+ <div class="ranking-cell">水位(m)</div>
|
|
|
+ <div class="ranking-cell">时间</div>
|
|
|
+ </div>
|
|
|
+ <div class="ranking-row" v-for="(station, index) in stationRanking" :key="index">
|
|
|
+ <div class="ranking-cell">{{ station.district }}</div>
|
|
|
+ <div class="ranking-cell">{{ station.name }}</div>
|
|
|
+ <div class="ranking-cell">{{ station.level }}</div>
|
|
|
+ <div class="ranking-cell">{{ station.time }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </m-card>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 右侧面板 -->
|
|
|
+ <div class="right-panel" v-if="!selectedPolderDetail">
|
|
|
+ <div class="right-panel-3d">
|
|
|
+ <!-- 气象预警信息 -->
|
|
|
+ <m-card title="气象预警信息" class="water-station-card water-station-card-top" :width="398" :height="320">
|
|
|
+ <div class="weather-warning-panel">
|
|
|
+ <div class="warning-grid">
|
|
|
+ <div class="warning-item">
|
|
|
+ <div class="warning-title">暴雨</div>
|
|
|
+ <div class="warning-icon rain-icon">
|
|
|
+ <img src="@/assets/images/rain.svg" alt="暴雨" />
|
|
|
+ </div>
|
|
|
+ <div class="warning-status">无</div>
|
|
|
+ <div class="warning-time">09-30 11:06</div>
|
|
|
+ </div>
|
|
|
+ <div class="warning-item">
|
|
|
+ <div class="warning-title">强对流</div>
|
|
|
+ <div class="warning-icon storm-icon">
|
|
|
+ <img src="@/assets/images/storm.svg" alt="强对流" />
|
|
|
+ </div>
|
|
|
+ <div class="warning-status">无</div>
|
|
|
+ <div class="warning-time">10-18 05:28</div>
|
|
|
+ </div>
|
|
|
+ <div class="warning-item">
|
|
|
+ <div class="warning-title">台风</div>
|
|
|
+ <div class="warning-icon typhoon-icon">
|
|
|
+ <img src="@/assets/images/typhoon.svg" alt="台风" />
|
|
|
+ </div>
|
|
|
+ <div class="warning-status">无</div>
|
|
|
+ <div class="warning-time">07-31 10:08</div>
|
|
|
+ </div>
|
|
|
+ <div class="warning-item">
|
|
|
+ <div class="warning-title">高温</div>
|
|
|
+ <div class="warning-icon heat-icon">
|
|
|
+ <img src="@/assets/images/heat.svg" alt="高温" />
|
|
|
+ </div>
|
|
|
+ <div class="warning-status">无</div>
|
|
|
+ <div class="warning-time">09-17 17:27</div>
|
|
|
</div>
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">618</div>
|
|
|
- <div class="stat-label">防洪闸</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </m-card>
|
|
|
+
|
|
|
+ <!-- 预警统计 -->
|
|
|
+ <m-card title="预警统计" class="water-station-card water-station-card-bottom" :width="398" :height="240">
|
|
|
+ <div class="warning-stats-panel">
|
|
|
+ <div class="stats-grid">
|
|
|
+ <div class="stat-card warning-stat">
|
|
|
+ <div class="stat-title">超警站点个数</div>
|
|
|
+ <div class="stat-value">0/11</div>
|
|
|
</div>
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">560</div>
|
|
|
- <div class="stat-label">排涝站</div>
|
|
|
+ <div class="stat-card alert-stat">
|
|
|
+ <div class="stat-title">超保站点个数</div>
|
|
|
+ <div class="stat-value">0/11</div>
|
|
|
</div>
|
|
|
- <div class="stat-item">
|
|
|
- <div class="stat-value">2173.69<span class="stat-unit">m³/s</span></div>
|
|
|
- <div class="stat-label">排涝流量</div>
|
|
|
+ <div class="stat-card normal-stat">
|
|
|
+ <div class="stat-title">正常站点个数</div>
|
|
|
+ <div class="stat-value">55/57</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</m-card>
|
|
|
</div>
|
|
|
</div>
|
|
|
+
|
|
|
+ <!-- 孔港联圩详情 -->
|
|
|
+ <template v-if="selectedPolderDetail === 'konggang' && !showHydrologyDetail">
|
|
|
+ <!-- 侧边开关控制 -->
|
|
|
+ <div class="polder-layer-controls">
|
|
|
+ <div class="toggle-item">
|
|
|
+ <span class="toggle-text">泵站</span>
|
|
|
+ <div class="toggle-switch" :class="{ active: showGate }" @click="$emit('update:showGate', !showGate)">
|
|
|
+ <div class="toggle-knob"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="toggle-item">
|
|
|
+ <span class="toggle-text">水文站</span>
|
|
|
+ <div class="toggle-switch" :class="{ active: showHydrology }" @click="$emit('update:showHydrology', !showHydrology)">
|
|
|
+ <div class="toggle-knob"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
|
+import { ref } from "vue"
|
|
|
import mCard from "@/components/mCard/index.vue"
|
|
|
+import VChart from "vue-echarts"
|
|
|
+import * as echarts from "echarts"
|
|
|
+
|
|
|
+defineProps({
|
|
|
+ selectedPolderDetail: {
|
|
|
+ type: String,
|
|
|
+ default: null
|
|
|
+ },
|
|
|
+ showGate: {
|
|
|
+ type: Boolean,
|
|
|
+ default: true
|
|
|
+ },
|
|
|
+ showHydrology: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ },
|
|
|
+ showHydrologyDetail: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ }
|
|
|
+})
|
|
|
+defineEmits(['update:showGate', 'update:showHydrology'])
|
|
|
+
|
|
|
+const polderList = ref([
|
|
|
+ { name: '庙泾联圩', waterLevel: '2.19', controlLevel: '2.50', flow: '3.20', rate: '28%' },
|
|
|
+ { name: '西河联圩', waterLevel: '2.74', controlLevel: '3.10', flow: '3.00', rate: '17%' },
|
|
|
+ { name: '永胜联圩', waterLevel: '—', controlLevel: '3.20', flow: '0.80', rate: '13%' },
|
|
|
+ { name: '包桥联圩', waterLevel: '2.72', controlLevel: '3.10', flow: '11.70', rate: '12%' },
|
|
|
+ { name: '城南联圩', waterLevel: '2.62', controlLevel: '3.10', flow: '8.50', rate: '10%' },
|
|
|
+ { name: '曹安路南联圩', waterLevel: '2.69', controlLevel: '3.10', flow: '5.10', rate: '7%' },
|
|
|
+ { name: '枫塘联圩', waterLevel: '2.14', controlLevel: '2.40', flow: '1.00', rate: '2%' },
|
|
|
+ { name: '北大联圩', waterLevel: '2.73', controlLevel: '3.10', flow: '0.00', rate: '0%' },
|
|
|
+ { name: '娄江联圩', waterLevel: '2.11', controlLevel: '3.10', flow: '0.00', rate: '0%' },
|
|
|
+ { name: '孔巷联圩', waterLevel: '—', controlLevel: '3.10', flow: '0.00', rate: '0%' },
|
|
|
+ { name: '南大联圩', waterLevel: '2.71', controlLevel: '3.10', flow: '0.00', rate: '0%' }
|
|
|
+])
|
|
|
+
|
|
|
+const stationRanking = ref([
|
|
|
+ { district: '巴城镇', name: '巴城湖', level: '2.89', time: '02-12 10:05' },
|
|
|
+ { district: '周市镇', name: '斜塘', level: '2.85', time: '02-12 10:05' },
|
|
|
+ { district: '高新区', name: '赵库', level: '2.81', time: '02-12 10:05' },
|
|
|
+ { district: '开发区', name: '兵希(浏)', level: '2.76', time: '02-12 10:05' },
|
|
|
+ { district: '张浦镇', name: '大直', level: '2.70', time: '02-12 10:05' },
|
|
|
+ { district: '陆家镇', name: '友谊(夏)', level: '2.69', time: '02-12 10:05' },
|
|
|
+ { district: '花桥镇', name: '石浦(吴)', level: '2.62', time: '02-12 10:05' },
|
|
|
+ { district: '千灯镇', name: '迮塘浦', level: '2.57', time: '02-12 09:50' },
|
|
|
+ { district: '周庄镇', name: '周庄站', level: '2.56', time: '02-12 10:05' },
|
|
|
+ { district: '锦溪镇', name: '锦溪(赵田港)', level: '2.53', time: '02-12 10:05' },
|
|
|
+ { district: '淀山湖镇', name: '清水湾', level: '2.52', time: '02-12 10:05' }
|
|
|
+])
|
|
|
+
|
|
|
+// 水位过程线图表配置
|
|
|
+const waterLevelChartOption = ref({
|
|
|
+ grid: {
|
|
|
+ left: '8%',
|
|
|
+ top: '15%',
|
|
|
+ right: '8%',
|
|
|
+ bottom: '20%',
|
|
|
+ containLabel: true
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ data: ['02-11 10:00', '02-11 16:00', '02-11 22:00', '02-12 04:00', '02-12 10:00'],
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: 'rgba(48, 220, 255, 0.6)'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: 'rgba(255, 255, 255, 0.8)',
|
|
|
+ fontSize: 10
|
|
|
+ }
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ min: 2.1,
|
|
|
+ max: 2.8,
|
|
|
+ interval: 0.1,
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: 'rgba(48, 220, 255, 0.6)'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: 'rgba(255, 255, 255, 0.8)',
|
|
|
+ fontSize: 10
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: 'rgba(48, 220, 255, 0.2)'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ backgroundColor: 'rgba(0, 20, 40, 0.9)',
|
|
|
+ borderColor: 'rgba(48, 220, 255, 0.5)',
|
|
|
+ textStyle: {
|
|
|
+ color: '#fff'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: '水位',
|
|
|
+ type: 'line',
|
|
|
+ data: [2.60, 2.62, 2.58, 2.56, 2.54],
|
|
|
+ smooth: true,
|
|
|
+ symbol: 'circle',
|
|
|
+ symbolSize: 8,
|
|
|
+ lineStyle: {
|
|
|
+ color: '#30dcff',
|
|
|
+ width: 2,
|
|
|
+ shadowColor: 'rgba(48, 220, 255, 0.6)',
|
|
|
+ shadowBlur: 10
|
|
|
+ },
|
|
|
+ itemStyle: {
|
|
|
+ color: '#30dcff',
|
|
|
+ borderColor: '#fff',
|
|
|
+ borderWidth: 2
|
|
|
+ },
|
|
|
+ areaStyle: {
|
|
|
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
|
+ {
|
|
|
+ offset: 0,
|
|
|
+ color: 'rgba(48, 220, 255, 0.3)'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ offset: 1,
|
|
|
+ color: 'rgba(48, 220, 255, 0.1)'
|
|
|
+ }
|
|
|
+ ])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+})
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
|
@@ -56,7 +367,7 @@ import mCard from "@/components/mCard/index.vue"
|
|
|
z-index: 4;
|
|
|
width: 398px;
|
|
|
left: 32px;
|
|
|
- top: 180px;
|
|
|
+ top: 100px;
|
|
|
bottom: 50px;
|
|
|
perspective: 500px;
|
|
|
perspective-origin: 50% 50%;
|
|
|
@@ -70,14 +381,22 @@ import mCard from "@/components/mCard/index.vue"
|
|
|
bottom: 0;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
- justify-content: space-between;
|
|
|
+ gap: 15px;
|
|
|
transform: translate3d(0px, 0px, 0px) scaleX(1) scaleY(1) rotateX(0deg) rotateY(6deg) rotateZ(0deg) skewX(0deg) skewY(0deg);
|
|
|
z-index: 4;
|
|
|
}
|
|
|
|
|
|
.water-station-card {
|
|
|
- transform: translateX(-150%);
|
|
|
- opacity: 0;
|
|
|
+ pointer-events: auto;
|
|
|
+
|
|
|
+ &.water-station-card-top {
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.water-station-card-bottom {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 400px;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.stats-panel {
|
|
|
@@ -87,22 +406,24 @@ import mCard from "@/components/mCard/index.vue"
|
|
|
flex-direction: column;
|
|
|
gap: 12px;
|
|
|
box-sizing: border-box;
|
|
|
+ background: rgba(0, 30, 60, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
}
|
|
|
|
|
|
.core-indicator {
|
|
|
text-align: center;
|
|
|
padding: 12px;
|
|
|
- background: linear-gradient(135deg, rgba(48, 220, 255, 0.1) 0%, rgba(0, 191, 255, 0.05) 100%);
|
|
|
+ background: linear-gradient(135deg, rgba(48, 220, 255, 0.25) 0%, rgba(0, 191, 255, 0.2) 100%);
|
|
|
border-radius: 8px;
|
|
|
- border: 1px solid rgba(48, 220, 255, 0.3);
|
|
|
+ border: 1px solid rgba(48, 220, 255, 0.4);
|
|
|
}
|
|
|
|
|
|
.indicator-main {
|
|
|
- margin-bottom: 5px;
|
|
|
+ margin-bottom: 3px;
|
|
|
}
|
|
|
|
|
|
.main-value {
|
|
|
- font-size: 40px;
|
|
|
+ font-size: 32px;
|
|
|
font-weight: 700;
|
|
|
color: #30DCFF;
|
|
|
font-family: "D-DIN";
|
|
|
@@ -110,55 +431,564 @@ import mCard from "@/components/mCard/index.vue"
|
|
|
}
|
|
|
|
|
|
.main-unit {
|
|
|
- font-size: 20px;
|
|
|
+ font-size: 16px;
|
|
|
color: rgba(48, 220, 255, 0.8);
|
|
|
font-weight: 600;
|
|
|
}
|
|
|
|
|
|
.indicator-label {
|
|
|
color: rgba(255, 255, 255, 0.8);
|
|
|
- font-size: 12px;
|
|
|
+ font-size: 11px;
|
|
|
letter-spacing: 1px;
|
|
|
}
|
|
|
|
|
|
.stats-grid {
|
|
|
display: grid;
|
|
|
grid-template-columns: repeat(2, 1fr);
|
|
|
- gap: 10px;
|
|
|
+ gap: 8px;
|
|
|
}
|
|
|
|
|
|
.stat-item {
|
|
|
- background: rgba(0, 180, 255, 0.08);
|
|
|
- border: 1px solid rgba(0, 180, 255, 0.2);
|
|
|
- border-radius: 8px;
|
|
|
- padding: 15px 10px;
|
|
|
+ background: rgba(0, 180, 255, 0.25);
|
|
|
+ border: 1px solid rgba(0, 180, 255, 0.4);
|
|
|
+ border-radius: 6px;
|
|
|
+ padding: 12px 10px;
|
|
|
text-align: center;
|
|
|
transition: all 0.3s ease;
|
|
|
|
|
|
&:hover {
|
|
|
- background: rgba(0, 180, 255, 0.15);
|
|
|
- border-color: rgba(48, 220, 255, 0.5);
|
|
|
+ background: rgba(0, 180, 255, 0.35);
|
|
|
+ border-color: rgba(48, 220, 255, 0.6);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.stat-value {
|
|
|
- font-size: 24px;
|
|
|
+ font-size: 20px;
|
|
|
font-weight: 700;
|
|
|
color: #30DCFF;
|
|
|
font-family: "D-DIN";
|
|
|
- margin-bottom: 5px;
|
|
|
+ margin-bottom: 3px;
|
|
|
text-shadow: 0 0 10px rgba(48, 220, 255, 0.5);
|
|
|
|
|
|
.stat-unit {
|
|
|
- font-size: 12px;
|
|
|
+ font-size: 10px;
|
|
|
margin-left: 2px;
|
|
|
opacity: 0.8;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.stat-label {
|
|
|
- font-size: 12px;
|
|
|
+ font-size: 11px;
|
|
|
color: rgba(255, 255, 255, 0.7);
|
|
|
letter-spacing: 1px;
|
|
|
}
|
|
|
+
|
|
|
+.polder-list {
|
|
|
+ height: 100%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ box-sizing: border-box;
|
|
|
+ padding: 10px;
|
|
|
+ background: rgba(0, 30, 60, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+
|
|
|
+ .polder-list-header {
|
|
|
+ display: flex;
|
|
|
+ padding: 10px 15px;
|
|
|
+ background: rgba(0, 100, 150, 0.5);
|
|
|
+ border-bottom: 1px solid rgba(48, 220, 255, 0.4);
|
|
|
+ color: #30dcff;
|
|
|
+ font-weight: bold;
|
|
|
+ font-size: 13px;
|
|
|
+ flex-shrink: 0;
|
|
|
+ border-radius: 4px 4px 0 0;
|
|
|
+ margin-bottom: 5px;
|
|
|
+
|
|
|
+ .header-item {
|
|
|
+ flex: 1;
|
|
|
+ text-align: center;
|
|
|
+ padding: 0 5px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .polder-list-body {
|
|
|
+ flex: 1;
|
|
|
+
|
|
|
+ .polder-item {
|
|
|
+ display: flex;
|
|
|
+ padding: 8px 15px;
|
|
|
+ border-bottom: 1px solid rgba(48, 220, 255, 0.2);
|
|
|
+ color: rgba(255, 255, 255, 0.9);
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 1.4;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ background: rgba(48, 220, 255, 0.15);
|
|
|
+ border-radius: 3px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:last-child {
|
|
|
+ border-bottom: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item-cell {
|
|
|
+ flex: 1;
|
|
|
+ text-align: center;
|
|
|
+ padding: 0 5px;
|
|
|
+
|
|
|
+ &:first-child {
|
|
|
+ flex: 0 0 40px;
|
|
|
+ color: #30dcff;
|
|
|
+ font-weight: 500;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:nth-child(2) {
|
|
|
+ flex: 2;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .rate-bar {
|
|
|
+ width: 60px;
|
|
|
+ height: 16px;
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ border-radius: 4px;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ .rate-fill {
|
|
|
+ height: 100%;
|
|
|
+ background: linear-gradient(90deg, #00d4ff, #30dcff);
|
|
|
+ border-radius: 4px;
|
|
|
+ transition: width 0.3s ease;
|
|
|
+ }
|
|
|
+
|
|
|
+ .rate-text {
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ left: 50%;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+ font-size: 11px;
|
|
|
+ color: #fff;
|
|
|
+ text-shadow: 0 0 3px rgba(0, 0, 0, 0.8);
|
|
|
+ font-weight: 500;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.right-panel {
|
|
|
+ position: absolute;
|
|
|
+ z-index: 4;
|
|
|
+ width: 398px;
|
|
|
+ right: 32px;
|
|
|
+ top: 100px;
|
|
|
+ bottom: 50px;
|
|
|
+ perspective: 500px;
|
|
|
+ perspective-origin: 50% 50%;
|
|
|
+ overflow-y: auto;
|
|
|
+
|
|
|
+ &::-webkit-scrollbar {
|
|
|
+ width: 6px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &::-webkit-scrollbar-track {
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ }
|
|
|
+
|
|
|
+ &::-webkit-scrollbar-thumb {
|
|
|
+ background: rgba(48, 220, 255, 0.4);
|
|
|
+ border-radius: 3px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.right-panel-3d {
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ right: 0;
|
|
|
+ bottom: 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 15px;
|
|
|
+ transform: translate3d(0px, 0px, 0px) scaleX(1) scaleY(1) rotateX(0deg) rotateY(-6deg) rotateZ(0deg) skewX(0deg) skewY(0deg);
|
|
|
+ z-index: 4;
|
|
|
+}
|
|
|
+
|
|
|
+.weather-warning-panel {
|
|
|
+ height: 100%;
|
|
|
+ padding: 15px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: rgba(0, 30, 60, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-grid {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(2, 1fr);
|
|
|
+ gap: 15px;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-item {
|
|
|
+ background: rgba(0, 100, 150, 0.4);
|
|
|
+ border: 1px solid rgba(48, 220, 255, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+ padding: 12px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ text-align: center;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+
|
|
|
+ &::before {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ top: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ height: 2px;
|
|
|
+ background: linear-gradient(90deg, #30dcff, transparent);
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-title {
|
|
|
+ color: #30dcff;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-icon {
|
|
|
+ width: 60px;
|
|
|
+ height: 60px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ background: rgba(0, 0, 0, 0.4);
|
|
|
+ border-radius: 8px;
|
|
|
+
|
|
|
+ img {
|
|
|
+ width: 32px;
|
|
|
+ height: 32px;
|
|
|
+ object-fit: contain;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-status {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .warning-time {
|
|
|
+ color: rgba(255, 255, 255, 0.8);
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.warning-stats-panel {
|
|
|
+ height: 100%;
|
|
|
+ padding: 15px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: rgba(0, 30, 60, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-stats-panel .stats-grid {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(3, 1fr);
|
|
|
+ gap: 12px;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.stat-card {
|
|
|
+ background: rgba(0, 100, 150, 0.4);
|
|
|
+ border: 1px solid rgba(48, 220, 255, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+ padding: 12px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ text-align: center;
|
|
|
+
|
|
|
+ &.warning-stat {
|
|
|
+ border-color: #00d4ff;
|
|
|
+ background: rgba(0, 212, 255, 0.25);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.alert-stat {
|
|
|
+ border-color: #ff4444;
|
|
|
+ background: rgba(255, 68, 68, 0.25);
|
|
|
+ }
|
|
|
+
|
|
|
+ &.normal-stat {
|
|
|
+ border-color: #00ff88;
|
|
|
+ background: rgba(0, 255, 136, 0.25);
|
|
|
+ }
|
|
|
+
|
|
|
+ .stat-title {
|
|
|
+ color: rgba(255, 255, 255, 0.9);
|
|
|
+ font-size: 12px;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .stat-value {
|
|
|
+ font-size: 20px;
|
|
|
+ font-weight: bold;
|
|
|
+ font-family: "D-DIN";
|
|
|
+ text-shadow: 0 0 10px rgba(48, 220, 255, 0.5);
|
|
|
+
|
|
|
+ .warning-stat & {
|
|
|
+ color: #00d4ff;
|
|
|
+ }
|
|
|
+
|
|
|
+ .alert-stat & {
|
|
|
+ color: #ff4444;
|
|
|
+ }
|
|
|
+
|
|
|
+ .normal-stat & {
|
|
|
+ color: #00ff88;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.water-level-analysis-panel {
|
|
|
+ height: 100%;
|
|
|
+ padding: 15px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: rgba(0, 30, 60, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.water-level-data {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(5, 1fr);
|
|
|
+ gap: 8px;
|
|
|
+ padding: 10px;
|
|
|
+ background: rgba(0, 100, 150, 0.3);
|
|
|
+ border-radius: 6px;
|
|
|
+
|
|
|
+ .data-item {
|
|
|
+ text-align: center;
|
|
|
+
|
|
|
+ .data-label {
|
|
|
+ font-size: 11px;
|
|
|
+ color: rgba(255, 255, 255, 0.7);
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .data-value {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #30dcff;
|
|
|
+ font-family: "D-DIN";
|
|
|
+
|
|
|
+ &.negative {
|
|
|
+ color: #ff6b6b;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.water-level-chart {
|
|
|
+ flex: 1;
|
|
|
+ height: 200px;
|
|
|
+ padding: 10px;
|
|
|
+ background: rgba(0, 100, 150, 0.2);
|
|
|
+ border-radius: 6px;
|
|
|
+ border: 1px solid rgba(48, 220, 255, 0.3);
|
|
|
+
|
|
|
+ :deep(.echarts-container) {
|
|
|
+ width: 100% !important;
|
|
|
+ height: 100% !important;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.station-ranking {
|
|
|
+ padding: 10px;
|
|
|
+ background: rgba(0, 100, 150, 0.3);
|
|
|
+ border-radius: 6px;
|
|
|
+
|
|
|
+ .ranking-header {
|
|
|
+ color: #30dcff;
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 8px;
|
|
|
+ padding-bottom: 4px;
|
|
|
+ border-bottom: 1px solid rgba(48, 220, 255, 0.3);
|
|
|
+ }
|
|
|
+
|
|
|
+ .ranking-table {
|
|
|
+ max-height: 120px;
|
|
|
+ overflow-y: auto;
|
|
|
+
|
|
|
+ &::-webkit-scrollbar {
|
|
|
+ width: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &::-webkit-scrollbar-track {
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ }
|
|
|
+
|
|
|
+ &::-webkit-scrollbar-thumb {
|
|
|
+ background: rgba(48, 220, 255, 0.4);
|
|
|
+ border-radius: 2px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .ranking-row {
|
|
|
+ display: flex;
|
|
|
+ padding: 4px 0;
|
|
|
+ border-bottom: 1px solid rgba(48, 220, 255, 0.1);
|
|
|
+ font-size: 12px;
|
|
|
+
|
|
|
+ &:hover {
|
|
|
+ background: rgba(48, 220, 255, 0.05);
|
|
|
+ }
|
|
|
+
|
|
|
+ .ranking-cell {
|
|
|
+ flex: 1;
|
|
|
+ text-align: center;
|
|
|
+ color: rgba(255, 255, 255, 0.8);
|
|
|
+
|
|
|
+ &:first-child {
|
|
|
+ flex: 1.2;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:nth-child(2) {
|
|
|
+ flex: 1.5;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.station-ranking-panel {
|
|
|
+ height: 100%;
|
|
|
+ padding: 10px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ background: rgba(0, 30, 60, 0.5);
|
|
|
+ border-radius: 6px;
|
|
|
+
|
|
|
+ .ranking-table {
|
|
|
+ height: 100%;
|
|
|
+ overflow-y: auto;
|
|
|
+
|
|
|
+ &::-webkit-scrollbar {
|
|
|
+ width: 6px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &::-webkit-scrollbar-track {
|
|
|
+ background: rgba(0, 0, 0, 0.3);
|
|
|
+ }
|
|
|
+
|
|
|
+ &::-webkit-scrollbar-thumb {
|
|
|
+ background: rgba(48, 220, 255, 0.4);
|
|
|
+ border-radius: 3px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .ranking-row {
|
|
|
+ display: flex;
|
|
|
+ padding: 6px 10px;
|
|
|
+ border-bottom: 1px solid rgba(48, 220, 255, 0.2);
|
|
|
+ font-size: 12px;
|
|
|
+
|
|
|
+ &.header {
|
|
|
+ background: rgba(0, 100, 150, 0.4);
|
|
|
+ font-weight: bold;
|
|
|
+ color: #30dcff;
|
|
|
+ border-bottom: 1px solid rgba(48, 220, 255, 0.4);
|
|
|
+ }
|
|
|
+
|
|
|
+ &:hover:not(.header) {
|
|
|
+ background: rgba(48, 220, 255, 0.1);
|
|
|
+ }
|
|
|
+
|
|
|
+ .ranking-cell {
|
|
|
+ flex: 1;
|
|
|
+ text-align: center;
|
|
|
+ color: rgba(255, 255, 255, 0.9);
|
|
|
+
|
|
|
+ &:first-child {
|
|
|
+ flex: 1.2;
|
|
|
+ }
|
|
|
+
|
|
|
+ &:nth-child(2) {
|
|
|
+ flex: 1.5;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+
|
|
|
+ .header & {
|
|
|
+ color: #30dcff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+.polder-layer-controls {
|
|
|
+ position: absolute;
|
|
|
+ right: 20px;
|
|
|
+ top: 50%;
|
|
|
+ transform: translateY(-50%);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 15px;
|
|
|
+ z-index: 1000;
|
|
|
+ pointer-events: auto;
|
|
|
+
|
|
|
+ .toggle-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 10px;
|
|
|
+ padding: 8px 12px;
|
|
|
+ background: rgba(0, 20, 40, 0.8);
|
|
|
+ border-radius: 6px;
|
|
|
+
|
|
|
+ .toggle-text {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+ text-shadow: 0 0 5px rgba(0, 0, 0, 0.8);
|
|
|
+ }
|
|
|
+
|
|
|
+ .toggle-switch {
|
|
|
+ width: 44px;
|
|
|
+ height: 22px;
|
|
|
+ background: rgba(100, 100, 100, 0.5);
|
|
|
+ border-radius: 11px;
|
|
|
+ cursor: pointer;
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ position: relative;
|
|
|
+
|
|
|
+ .toggle-knob {
|
|
|
+ position: absolute;
|
|
|
+ left: 2px;
|
|
|
+ top: 2px;
|
|
|
+ width: 18px;
|
|
|
+ height: 18px;
|
|
|
+ background: #a3dcde;
|
|
|
+ border-radius: 50%;
|
|
|
+ transition: all 0.3s ease;
|
|
|
+ }
|
|
|
+
|
|
|
+ &.active {
|
|
|
+ background: rgba(48, 220, 255, 0.4);
|
|
|
+ box-shadow: 0 0 10px rgba(48, 220, 255, 0.3);
|
|
|
+
|
|
|
+ .toggle-knob {
|
|
|
+ left: 24px;
|
|
|
+ background: #30dcff;
|
|
|
+ box-shadow: 0 0 8px rgba(48, 220, 255, 0.5);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
</style>
|