|
@@ -0,0 +1,220 @@
|
|
|
+
|
|
|
+<template>
|
|
|
+ <div class="pressure-monitor">
|
|
|
+ <div class="header">
|
|
|
+ <h2>矿压监测系统</h2>
|
|
|
+ <div class="time-display">{{ currentTime }}</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="chart-container">
|
|
|
+ <div ref="chartEl" class="chart"></div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="info-panel">
|
|
|
+ <div class="legend-section">
|
|
|
+ <h3>状态说明</h3>
|
|
|
+ <div class="legend-grid">
|
|
|
+ <div v-for="(item, index) in legendData" :key="index" class="legend-item">
|
|
|
+ <span class="color-indicator" :style="{ backgroundColor: item.color }"></span>
|
|
|
+ <span class="legend-text">{{ item.label }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="range-section">
|
|
|
+ <h3>数据范围(kPa)</h3>
|
|
|
+ <div class="range-grid">
|
|
|
+ <div v-for="(item, idx) in dataRanges" :key="idx" class="range-item">
|
|
|
+ <span class="color-indicator" :style="{ backgroundColor: item.color }"></span>
|
|
|
+ <span class="legend-text">{{ item.label }}</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup lang="ts">
|
|
|
+import { ref, onMounted, computed } from 'vue';
|
|
|
+import * as echarts from 'echarts';
|
|
|
+
|
|
|
+const chartEl = ref<HTMLElement>();
|
|
|
+const currentTime = computed(() => new Date().toLocaleString());
|
|
|
+
|
|
|
+const colorRanges = [
|
|
|
+ { min: -Infinity, max: 0, color: '#999999', label: '异常数据' },
|
|
|
+ { min: 0, max: 252, color: '#5470c6', label: '初撑力不足' },
|
|
|
+ { min: 252, max: 375, color: '#91cc75', label: '正常' },
|
|
|
+ { min: 375, max: 425, color: '#fac858', label: '轻微来压' },
|
|
|
+ { min: 425, max: 475, color: '#ee6666', label: '强来压' },
|
|
|
+ { min: 475, max: Infinity, color: '#fc8452', label: '剧烈来压' },
|
|
|
+];
|
|
|
+const dataRanges = [
|
|
|
+ { min: -Infinity, max: 0, color: '#999', label: '<0' },
|
|
|
+ { min: 0, max: 252, color: '#5470c6', label: '0-252' },
|
|
|
+ { min: 252, max: 375, color: '#91cc75', label: '252-375' },
|
|
|
+ { min: 375, max: 425, color: '#fac858', label: '375-425' },
|
|
|
+ { min: 425, max: 475, color: '#ee6666', label: '425-475' },
|
|
|
+ { min: 475, max: Infinity, color: '#fc8452', label: '>475' },
|
|
|
+];
|
|
|
+
|
|
|
+const legendData = colorRanges.map((item) => ({
|
|
|
+ color: item.color,
|
|
|
+ label: item.label,
|
|
|
+}));
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ if (!chartEl.value) return;
|
|
|
+
|
|
|
+ const chart = echarts.init(chartEl.value);
|
|
|
+ const data = Array.from({ length: 50 }, () => Math.floor(Math.random() * 700) - 100);
|
|
|
+
|
|
|
+ const option = {
|
|
|
+ tooltip: {
|
|
|
+ trigger: 'axis',
|
|
|
+ formatter: (params: any) => {
|
|
|
+ const value = params[0].value;
|
|
|
+ const range = colorRanges.find((r) => value >= r.min && value < r.max);
|
|
|
+ return `${params[0].dataIndex + 1}#<br/>
|
|
|
+ 值: ${value}kPa<br/>
|
|
|
+ 状态: ${range?.label || '未知'}`;
|
|
|
+ },
|
|
|
+ },
|
|
|
+ xAxis: {
|
|
|
+ type: 'category',
|
|
|
+ data: data.map((_, i) => `${i + 1}#`),
|
|
|
+ axisLabel: {
|
|
|
+ interval: 1,
|
|
|
+ rotate: 45,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ yAxis: {
|
|
|
+ type: 'value',
|
|
|
+ name: '矿压值(kPa)',
|
|
|
+ min: -50,
|
|
|
+ max: 600,
|
|
|
+ },
|
|
|
+ series: [
|
|
|
+ {
|
|
|
+ data: data.map((value) => ({
|
|
|
+ value,
|
|
|
+ itemStyle: {
|
|
|
+ color: colorRanges.find((r) => value >= r.min && value < r.max)?.color,
|
|
|
+ },
|
|
|
+ })),
|
|
|
+ type: 'bar',
|
|
|
+ barWidth: '60%',
|
|
|
+ label: {
|
|
|
+ show: true,
|
|
|
+ position: 'top',
|
|
|
+ formatter: '{c}',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ grid: {
|
|
|
+ left: '3%',
|
|
|
+ right: '4%',
|
|
|
+ bottom: '15%',
|
|
|
+ containLabel: true,
|
|
|
+ },
|
|
|
+ };
|
|
|
+
|
|
|
+ chart.setOption(option);
|
|
|
+ window.addEventListener('resize', () => chart.resize());
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.pressure-monitor {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ padding: 10px 10px 15px 10px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+.header {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ padding-bottom: 10px;
|
|
|
+ border-bottom: 1px solid #093ff1;
|
|
|
+}
|
|
|
+
|
|
|
+.header h2 {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 24px;
|
|
|
+ margin: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.time-display {
|
|
|
+ color: #fff;
|
|
|
+ font-size: 14px;
|
|
|
+}
|
|
|
+
|
|
|
+.chart-container {
|
|
|
+ width: 100%;
|
|
|
+ height: 500px;
|
|
|
+ border-radius: 8px;
|
|
|
+ padding: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.chart {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.info-panel {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
+ gap: 20px;
|
|
|
+ margin-top: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-section,
|
|
|
+.range-section {
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
|
|
|
+}
|
|
|
+
|
|
|
+h3 {
|
|
|
+ color: #fff;
|
|
|
+ margin-top: 0;
|
|
|
+ margin-bottom: 15px;
|
|
|
+ font-size: 16px;
|
|
|
+ padding-bottom: 8px;
|
|
|
+ border-bottom: 1px solid #303efd;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-grid,
|
|
|
+.range-grid {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(2, 1fr);
|
|
|
+ gap: 12px;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-item,
|
|
|
+.range-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+.color-indicator {
|
|
|
+ display: inline-block;
|
|
|
+ width: 18px;
|
|
|
+ height: 18px;
|
|
|
+ border-radius: 4px;
|
|
|
+ margin-right: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.legend-text,
|
|
|
+.range-text {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.range-text {
|
|
|
+ font-family: monospace;
|
|
|
+}
|
|
|
+</style>
|