Files
nonye/platform/src/components3/gu5.vue
2025-07-17 23:13:04 +08:00

163 lines
3.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="echarts-container">
<div ref="chartRef" style="width: 670px; height: 440px;"></div>
</div>
</template>
<script setup>
import {ref, onMounted, onBeforeUnmount} from 'vue';
import * as echarts from 'echarts';
const chartRef = ref(null);
let chartInstance = null;
// 手动设置故障时段数据 (6点1个18点1个22点1个)
const faultTimeData = ref([
{name: '00:00-02:00', value: 0},
{name: '02:00-04:00', value: 0},
{name: '04:00-06:00', value: 1}, // 6点一个故障
{name: '06:00-08:00', value: 0},
{name: '08:00-10:00', value: 0},
{name: '10:00-12:00', value: 0},
{name: '12:00-14:00', value: 0},
{name: '14:00-16:00', value: 0},
{name: '16:00-18:00', value: 0},
{name: '18:00-20:00', value: 0},
{name: '20:00-22:00', value: 1}, // 22点一个故障
{name: '22:00-24:00', value: 0}
]);
// 初始化图表
const initChart = () => {
if (!chartRef.value) return;
chartInstance = echarts.init(chartRef.value);
const option = {
title: {
text: '系统故障时段分布统计',
left: 'center',
textStyle: {
fontSize: 18,
fontWeight: 'bold',
color: '#333'
},
subtext: '24小时故障发生情况',
subtextStyle: {
fontSize: 14,
color: '#666'
}
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter: '时段: {b}<br/>故障次数: {c}次',
backgroundColor: 'rgba(50,50,50,0.9)',
borderColor: '#333',
textStyle: {
color: '#fff'
}
},
grid: {
left: '10%',
right: '5%',
bottom: '8%',
top: '20%',
containLabel: true
},
xAxis: {
type: 'category',
data: faultTimeData.value.map(item => item.name),
axisLabel: {
interval: 0,
rotate: 30,
fontSize: 12,
margin: 15
},
axisLine: {lineStyle: {color: '#666'}},
axisTick: {alignWithLabel: true, length: 5}
},
yAxis: {
type: 'value',
name: '故障次数',
nameLocation: 'middle',
nameGap: 40,
nameTextStyle: {fontSize: 14, padding: [0, 0, 10, 0]},
axisLabel: {
fontSize: 12,
formatter: function (value) {
return value; // 确保Y轴只显示整数
}
},
min: 0, // 最小值设为0
max: 5, // 最大值设为5
interval: 1, // 间隔设为1
splitLine: {lineStyle: {type: 'dashed'}}
},
series: [{
name: '故障次数',
type: 'bar',
barWidth: '50%',
data: faultTimeData.value.map(item => item.value),
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{offset: 0, color: '#ff9e9e'},
{offset: 0.5, color: '#ff6b6b'},
{offset: 1, color: '#ff3d3d'}
]),
borderRadius: [6, 6, 0, 0]
},
emphasis: {
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{offset: 0, color: '#ff6b6b'},
{offset: 0.7, color: '#ff3d3d'},
{offset: 1, color: '#cc2a2a'}
]),
shadowColor: 'rgba(255, 100, 100, 0.5)',
shadowBlur: 10,
shadowOffsetY: 3
}
},
label: {
show: true,
position: 'top',
formatter: '{c}',
fontSize: 12,
fontWeight: 'bold',
color: '#ff3d3d'
}
}]
};
chartInstance.setOption(option);
window.addEventListener('resize', handleResize);
};
const handleResize = () => {
chartInstance?.resize();
};
onMounted(() => {
initChart();
});
onBeforeUnmount(() => {
window.removeEventListener('resize', handleResize);
chartInstance?.dispose();
});
</script>
<style scoped>
.echarts-container {
display: flex;
justify-content: center;
align-items: center;
padding-top: 47px;
width: fit-content;
margin: 0 auto;
position: relative;
}
</style>