|
|
@@ -0,0 +1,731 @@
|
|
|
+<template>
|
|
|
+ <div class="forecast-panel">
|
|
|
+ <div class="left-sidebar">
|
|
|
+ <div class="data-card">
|
|
|
+ <div class="card-header" @click="toggleHydrologyForecast">
|
|
|
+ <h3 class="card-title">水文预报</h3>
|
|
|
+ <div class="header-actions">
|
|
|
+ <span class="toggle-btn">{{ hydrologyForecastExpanded ? '▼' : '▶' }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="hydrologyForecastExpanded" class="card-body">
|
|
|
+ <div class="forecast-content">
|
|
|
+ <div class="chart-box">
|
|
|
+ <div class="chart-title">未来24小时水位预报</div>
|
|
|
+ <canvas id="forecastWaterLevelChart" width="300" height="180"></canvas>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="data-card mt-20">
|
|
|
+ <div class="card-header" @click="toggleDistrictRainfall">
|
|
|
+ <h3 class="card-title">分区降雨预报</h3>
|
|
|
+ <div class="header-actions">
|
|
|
+ <span class="update-time">{{ rainfallDateRange }}</span>
|
|
|
+ <span class="toggle-btn">{{ districtRainfallExpanded ? '▼' : '▶' }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="districtRainfallExpanded" class="card-body">
|
|
|
+ <div class="district-rainfall-content">
|
|
|
+ <div class="rainfall-map-container">
|
|
|
+ <img :src="rainfallMapImage" alt="连云港降雨分布图" class="rainfall-map-image">
|
|
|
+ </div>
|
|
|
+ <div class="rainfall-legend">
|
|
|
+ <div class="legend-item">
|
|
|
+ <div class="legend-color level-0"></div>
|
|
|
+ <span class="legend-text">0~10</span>
|
|
|
+ </div>
|
|
|
+ <div class="legend-item">
|
|
|
+ <div class="legend-color level-1"></div>
|
|
|
+ <span class="legend-text">10~25</span>
|
|
|
+ </div>
|
|
|
+ <div class="legend-item">
|
|
|
+ <div class="legend-color level-2"></div>
|
|
|
+ <span class="legend-text">25~50</span>
|
|
|
+ </div>
|
|
|
+ <div class="legend-item">
|
|
|
+ <div class="legend-color level-3"></div>
|
|
|
+ <span class="legend-text">50~100</span>
|
|
|
+ </div>
|
|
|
+ <div class="legend-item">
|
|
|
+ <div class="legend-color level-4"></div>
|
|
|
+ <span class="legend-text">100~250</span>
|
|
|
+ </div>
|
|
|
+ <div class="legend-item">
|
|
|
+ <div class="legend-color level-5"></div>
|
|
|
+ <span class="legend-text">>=250</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="data-card mt-20">
|
|
|
+ <div class="card-header" @click="toggleFlowForecast">
|
|
|
+ <h3 class="card-title">流量预报</h3>
|
|
|
+ <div class="header-actions">
|
|
|
+ <span class="toggle-btn">{{ flowForecastExpanded ? '▼' : '▶' }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="flowForecastExpanded" class="card-body">
|
|
|
+ <div class="flow-forecast-content">
|
|
|
+ <div class="chart-box">
|
|
|
+ <div class="chart-title">未来72小时流量预报</div>
|
|
|
+ <canvas id="forecastFlowChart" width="300" height="180"></canvas>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="right-sidebar">
|
|
|
+ <div class="data-card">
|
|
|
+ <div class="card-header" @click="toggleWarningLevel">
|
|
|
+ <h3 class="card-title">预警级别</h3>
|
|
|
+ <div class="header-actions">
|
|
|
+ <span class="toggle-btn">{{ warningLevelExpanded ? '▼' : '▶' }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="warningLevelExpanded" class="card-body">
|
|
|
+ <div class="warning-levels">
|
|
|
+ <div class="warning-item" v-for="(level, index) in warningLevels" :key="index">
|
|
|
+ <div class="warning-indicator" :class="level.class"></div>
|
|
|
+ <div class="warning-info">
|
|
|
+ <div class="warning-name">{{ level.name }}</div>
|
|
|
+ <div class="warning-desc">{{ level.desc }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="data-card mt-20">
|
|
|
+ <div class="card-header" @click="toggleForecastStations">
|
|
|
+ <h3 class="card-title">预报站点</h3>
|
|
|
+ <div class="header-actions">
|
|
|
+ <span class="toggle-btn">{{ forecastStationsExpanded ? '▼' : '▶' }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="forecastStationsExpanded" class="card-body">
|
|
|
+ <div class="stations-list">
|
|
|
+ <div class="station-item" v-for="(station, index) in forecastStations" :key="index">
|
|
|
+ <div class="station-name">{{ station.name }}</div>
|
|
|
+ <div class="station-value" :class="station.status === 'normal' ? 'normal' : 'warning'">
|
|
|
+ {{ station.value }}m
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="data-card mt-20">
|
|
|
+ <div class="card-header" @click="toggleForecastSummary">
|
|
|
+ <h3 class="card-title">预报摘要</h3>
|
|
|
+ <div class="header-actions">
|
|
|
+ <span class="toggle-btn">{{ forecastSummaryExpanded ? '▼' : '▶' }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="forecastSummaryExpanded" class="card-body">
|
|
|
+ <div class="summary-content">
|
|
|
+ <div class="summary-item">
|
|
|
+ <div class="summary-label">最高水位</div>
|
|
|
+ <div class="summary-value">4.2m</div>
|
|
|
+ </div>
|
|
|
+ <div class="summary-item">
|
|
|
+ <div class="summary-label">最大流量</div>
|
|
|
+ <div class="summary-value">68.5m³/s</div>
|
|
|
+ </div>
|
|
|
+ <div class="summary-item">
|
|
|
+ <div class="summary-label">预计降雨</div>
|
|
|
+ <div class="summary-value">32.8mm</div>
|
|
|
+ </div>
|
|
|
+ <div class="summary-item">
|
|
|
+ <div class="summary-label">预警等级</div>
|
|
|
+ <div class="summary-value warning">蓝色预警</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import DataCard from './DataCard.vue'
|
|
|
+import * as echarts from 'echarts'
|
|
|
+import rainfallMapImage from '../assets/images/连云港降雨分布图.png'
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: 'HydrologyForecastPanel',
|
|
|
+ components: {
|
|
|
+ DataCard
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ rainfallDateRange: '',
|
|
|
+ hydrologyForecastExpanded: true,
|
|
|
+ districtRainfallExpanded: true,
|
|
|
+ flowForecastExpanded: true,
|
|
|
+ warningLevelExpanded: true,
|
|
|
+ forecastStationsExpanded: true,
|
|
|
+ forecastSummaryExpanded: true,
|
|
|
+ forecastWaterLevelChart: null,
|
|
|
+ forecastFlowChart: null,
|
|
|
+ rainfallMapImage: rainfallMapImage,
|
|
|
+ warningLevels: [
|
|
|
+ { name: '蓝色预警', desc: '水位接近警戒', class: 'blue' },
|
|
|
+ { name: '黄色预警', desc: '水位超过警戒', class: 'yellow' },
|
|
|
+ { name: '橙色预警', desc: '水位接近保证', class: 'orange' },
|
|
|
+ { name: '红色预警', desc: '水位超过保证', class: 'red' }
|
|
|
+ ],
|
|
|
+ forecastStations: [
|
|
|
+ { name: '黑林站', value: 3.8, status: 'normal' },
|
|
|
+ { name: '小塔山站', value: 18.6, status: 'normal' },
|
|
|
+ { name: '吴山站', value: 2.9, status: 'normal' },
|
|
|
+ { name: '陡沟站', value: 3.2, status: 'warning' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ const now = new Date()
|
|
|
+ const month = now.getMonth() + 1
|
|
|
+ const day = now.getDate()
|
|
|
+ this.rainfallDateRange = `${month}月${day}日至今`
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ this.initCharts()
|
|
|
+ }, 100)
|
|
|
+ },
|
|
|
+ beforeUnmount() {
|
|
|
+ this.destroyCharts()
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ toggleHydrologyForecast() {
|
|
|
+ this.hydrologyForecastExpanded = !this.hydrologyForecastExpanded
|
|
|
+ if (this.hydrologyForecastExpanded) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.initForecastWaterLevelChart()
|
|
|
+ }, 100)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ toggleDistrictRainfall() {
|
|
|
+ this.districtRainfallExpanded = !this.districtRainfallExpanded
|
|
|
+ },
|
|
|
+ toggleFlowForecast() {
|
|
|
+ this.flowForecastExpanded = !this.flowForecastExpanded
|
|
|
+ if (this.flowForecastExpanded) {
|
|
|
+ setTimeout(() => {
|
|
|
+ this.initForecastFlowChart()
|
|
|
+ }, 100)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ toggleWarningLevel() {
|
|
|
+ this.warningLevelExpanded = !this.warningLevelExpanded
|
|
|
+ },
|
|
|
+ toggleForecastStations() {
|
|
|
+ this.forecastStationsExpanded = !this.forecastStationsExpanded
|
|
|
+ },
|
|
|
+ toggleForecastSummary() {
|
|
|
+ this.forecastSummaryExpanded = !this.forecastSummaryExpanded
|
|
|
+ },
|
|
|
+ initCharts() {
|
|
|
+ this.initForecastWaterLevelChart()
|
|
|
+ this.initForecastFlowChart()
|
|
|
+ },
|
|
|
+ destroyCharts() {
|
|
|
+ if (this.forecastWaterLevelChart) {
|
|
|
+ this.forecastWaterLevelChart.dispose()
|
|
|
+ }
|
|
|
+ if (this.forecastFlowChart) {
|
|
|
+ this.forecastFlowChart.dispose()
|
|
|
+ }
|
|
|
+ },
|
|
|
+ initForecastWaterLevelChart() {
|
|
|
+ if (document.getElementById('forecastWaterLevelChart')) {
|
|
|
+ if (this.forecastWaterLevelChart) {
|
|
|
+ this.forecastWaterLevelChart.dispose()
|
|
|
+ }
|
|
|
+ this.forecastWaterLevelChart = echarts.init(document.getElementById('forecastWaterLevelChart'))
|
|
|
+ const option = {
|
|
|
+ animation: false,
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis'
|
|
|
+ },
|
|
|
+ grid: {
|
|
|
+ left: '3%',
|
|
|
+ right: '4%',
|
|
|
+ bottom: '15%',
|
|
|
+ top: '15%',
|
|
|
+ containLabel: true
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ boundaryGap: false,
|
|
|
+ data: ['00:00', '06:00', '12:00', '18:00', '次日00:00'],
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ name: '水位(m)',
|
|
|
+ nameTextStyle: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ },
|
|
|
+ min: 0,
|
|
|
+ max: 5,
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: 'rgba(123, 190, 246, 0.2)'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: '预报水位',
|
|
|
+ type: 'line',
|
|
|
+ data: [2.5, 2.8, 3.5, 4.2, 3.8],
|
|
|
+ lineStyle: {
|
|
|
+ color: '#62f6fb',
|
|
|
+ width: 2
|
|
|
+ },
|
|
|
+ itemStyle: {
|
|
|
+ color: '#62f6fb'
|
|
|
+ },
|
|
|
+ areaStyle: {
|
|
|
+ color: 'rgba(98, 246, 251, 0.2)'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: '警戒水位',
|
|
|
+ type: 'line',
|
|
|
+ data: [4.5, 4.5, 4.5, 4.5, 4.5],
|
|
|
+ symbol: 'none',
|
|
|
+ lineStyle: {
|
|
|
+ color: '#ff6b6b',
|
|
|
+ width: 2,
|
|
|
+ type: 'dashed'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ this.forecastWaterLevelChart.setOption(option)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ initForecastFlowChart() {
|
|
|
+ if (document.getElementById('forecastFlowChart')) {
|
|
|
+ if (this.forecastFlowChart) {
|
|
|
+ this.forecastFlowChart.dispose()
|
|
|
+ }
|
|
|
+ this.forecastFlowChart = echarts.init(document.getElementById('forecastFlowChart'))
|
|
|
+ const option = {
|
|
|
+ animation: false,
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis'
|
|
|
+ },
|
|
|
+ grid: {
|
|
|
+ left: '3%',
|
|
|
+ right: '4%',
|
|
|
+ bottom: '15%',
|
|
|
+ top: '15%',
|
|
|
+ containLabel: true
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ boundaryGap: false,
|
|
|
+ data: ['00:00', '12:00', '24:00', '36:00', '48:00', '60:00', '72:00'],
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ name: '流量(m³/s)',
|
|
|
+ nameTextStyle: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ },
|
|
|
+ min: 0,
|
|
|
+ max: 100,
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ color: '#7bbef6'
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ lineStyle: {
|
|
|
+ color: 'rgba(123, 190, 246, 0.2)'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ name: '预报流量',
|
|
|
+ type: 'line',
|
|
|
+ data: [45.2, 52.8, 68.5, 62.3, 55.7, 48.2, 42.5],
|
|
|
+ lineStyle: {
|
|
|
+ color: '#00d4ff',
|
|
|
+ width: 2
|
|
|
+ },
|
|
|
+ itemStyle: {
|
|
|
+ color: '#00d4ff'
|
|
|
+ },
|
|
|
+ areaStyle: {
|
|
|
+ color: 'rgba(0, 212, 255, 0.2)'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ this.forecastFlowChart.setOption(option)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.forecast-panel {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.left-sidebar {
|
|
|
+ position: absolute;
|
|
|
+ left: 20px;
|
|
|
+ top: 120px;
|
|
|
+ width: 350px;
|
|
|
+ z-index: 5;
|
|
|
+}
|
|
|
+
|
|
|
+.right-sidebar {
|
|
|
+ position: absolute;
|
|
|
+ right: 20px;
|
|
|
+ top: 120px;
|
|
|
+ width: 350px;
|
|
|
+ z-index: 5;
|
|
|
+}
|
|
|
+
|
|
|
+.mt-20 {
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.data-card {
|
|
|
+ width: 100%;
|
|
|
+ background: rgba(0, 20, 40, 0.7);
|
|
|
+ border-radius: 4px;
|
|
|
+ overflow: hidden;
|
|
|
+ box-shadow: 0 0 10px rgba(0, 212, 255, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+.card-header {
|
|
|
+ height: 50px;
|
|
|
+ background-image: url('/src/assets/images/数据小标题.png');
|
|
|
+ background-size: 100% 100%;
|
|
|
+ background-position: center;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 6px 20px 0;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.card-title {
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #e0fcff;
|
|
|
+ margin: 0;
|
|
|
+ text-shadow: 0 0 5px rgba(0, 212, 255, 0.5);
|
|
|
+ padding-left: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.header-actions {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 15px;
|
|
|
+ margin-top: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.update-time {
|
|
|
+ color: #62f6fb;
|
|
|
+ font-size: 14px;
|
|
|
+ font-family: monospace;
|
|
|
+}
|
|
|
+
|
|
|
+.toggle-btn {
|
|
|
+ color: #e0fcff;
|
|
|
+ font-size: 14px;
|
|
|
+ cursor: pointer;
|
|
|
+}
|
|
|
+
|
|
|
+.card-body {
|
|
|
+ padding: 12px;
|
|
|
+ min-height: auto;
|
|
|
+ font-size: 16px;
|
|
|
+ line-height: 1.6;
|
|
|
+ margin-top: -10px;
|
|
|
+}
|
|
|
+
|
|
|
+.chart-box {
|
|
|
+ background: rgba(0, 20, 40, 0.5);
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid rgba(0, 212, 255, 0.2);
|
|
|
+ padding: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.chart-title {
|
|
|
+ color: #7bbef6;
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-bottom: 6px;
|
|
|
+ text-align: left;
|
|
|
+}
|
|
|
+
|
|
|
+.five-day-rainfall {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-around;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.rainfall-day {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ padding: 2px 2px;
|
|
|
+ background: rgba(0, 20, 40, 0.5);
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid rgba(0, 212, 255, 0.2);
|
|
|
+ flex: 1;
|
|
|
+ min-width: 50px;
|
|
|
+}
|
|
|
+
|
|
|
+.rainfall-icon {
|
|
|
+ font-size: 24px;
|
|
|
+}
|
|
|
+
|
|
|
+.day-name {
|
|
|
+ color: #7bbef6;
|
|
|
+ font-size: 12px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-top: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+.rainfall-value {
|
|
|
+ color: #62f6fb;
|
|
|
+ font-size: 11px;
|
|
|
+ font-weight: bold;
|
|
|
+ margin-top: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-levels {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 12px;
|
|
|
+ padding: 8px;
|
|
|
+ background: rgba(0, 20, 40, 0.5);
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid rgba(0, 212, 255, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+.warning-indicator {
|
|
|
+ width: 20px;
|
|
|
+ height: 20px;
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-indicator.blue {
|
|
|
+ background-color: #3b82f6;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-indicator.yellow {
|
|
|
+ background-color: #ffd93d;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-indicator.orange {
|
|
|
+ background-color: #f97316;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-indicator.red {
|
|
|
+ background-color: #ef4444;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-info {
|
|
|
+ flex: 1;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-name {
|
|
|
+ color: #e0fcff;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-desc {
|
|
|
+ color: #7bbef6;
|
|
|
+ font-size: 12px;
|
|
|
+ margin-top: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+.stations-list {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.station-item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 8px 12px;
|
|
|
+ background: rgba(0, 20, 40, 0.5);
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid rgba(0, 212, 255, 0.2);
|
|
|
+}
|
|
|
+
|
|
|
+.station-name {
|
|
|
+ color: #e0fcff;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+.station-value {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+.station-value.normal {
|
|
|
+ color: #62f6fb;
|
|
|
+}
|
|
|
+
|
|
|
+.station-value.warning {
|
|
|
+ color: #ffd93d;
|
|
|
+}
|
|
|
+
|
|
|
+.summary-content {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.summary-item {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ padding: 6px 10px;
|
|
|
+ background: rgba(0, 20, 40, 0.5);
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.summary-label {
|
|
|
+ color: #7bbef6;
|
|
|
+ font-size: 13px;
|
|
|
+}
|
|
|
+
|
|
|
+.summary-value {
|
|
|
+ color: #e0fcff;
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+}
|
|
|
+
|
|
|
+.summary-value.warning {
|
|
|
+ color: #3b82f6;
|
|
|
+}
|
|
|
+
|
|
|
+.district-rainfall-content {
|
|
|
+ display: flex;
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.rainfall-map-container {
|
|
|
+ flex: 1;
|
|
|
+ height: 140px;
|
|
|
+ background: rgba(0, 20, 40, 0.5);
|
|
|
+ border-radius: 4px;
|
|
|
+ border: 1px solid rgba(0, 212, 255, 0.2);
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.rainfall-map-image {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ object-fit: fill;
|
|
|
+}
|
|
|
+
|
|
|
+.rainfall-legend {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 6px;
|
|
|
+ justify-content: center;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 2px;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color {
|
|
|
+ width: 10px;
|
|
|
+ height: 10px;
|
|
|
+ border-radius: 1px;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color.level-0 {
|
|
|
+ background-color: #4ade80;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color.level-1 {
|
|
|
+ background-color: #22c55e;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color.level-2 {
|
|
|
+ background-color: #38bdf8;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color.level-3 {
|
|
|
+ background-color: #3b82f6;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color.level-4 {
|
|
|
+ background-color: #f472b6;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-color.level-5 {
|
|
|
+ background-color: #9f1239;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-text {
|
|
|
+ color: #e0fcff;
|
|
|
+ font-size: 10px;
|
|
|
+}
|
|
|
+</style>
|