| | |
| | | import * as echarts from "echarts"; |
| | | import "./transparent"; |
| | | import { onMounted, onBeforeUnmount, ref, nextTick } from "vue"; |
| | | import eventBus from "@/utils/eventBus"; |
| | | |
| | | const chart_instance = ref(null); |
| | | let exportChart_instance = ref(null); |
| | | let chart_instance = null; |
| | | let exportChart_instance = null; |
| | | |
| | | const chart = ref(null); |
| | | const exportChart = ref(null); |
| | | const fullScreenFlag = ref(false); |
| | | const emit = defineEmits(["click"]); |
| | | const emit = defineEmits(["click", "update:fullFlag"]); |
| | | |
| | | const props = defineProps({ |
| | | fullFlag: { |
| | | type: Boolean, |
| | | default: false, |
| | | } |
| | | }); |
| | | |
| | | const fullScreenFlag = ref(props.fullFlag); |
| | | |
| | | |
| | | |
| | | onMounted(() => { |
| | | console.log('base mounted',chart.value, '============='); |
| | | |
| | | chart_instance.value = echarts.init(chart.value, "transparent"); |
| | | exportChart_instance.value = echarts.init(exportChart.value, "transparent"); |
| | | |
| | | let option = getOptions(); |
| | | // chart_instance.value = echarts.init(chart.value, "transparent"); |
| | | chart_instance = echarts.init(chart.value, "transparent"); |
| | | exportChart_instance = echarts.init(exportChart.value, "transparent"); |
| | | |
| | | nextTick(() => { |
| | | chart_instance.value.resize(); |
| | | chart_instance.value.setOption(option); |
| | | chart_instance.resize(); |
| | | }); |
| | | window.addEventListener("resize", resize); |
| | | |
| | | eventBus.on("toggleSiteList", () => { |
| | | console.log('toggleSiteList', '============='); |
| | | setTimeout(() => { |
| | | resize(); |
| | | // 因为过渡设置了0.5s,所以需要等待0.5s后再resize |
| | | }, 500); |
| | | |
| | | }); |
| | | |
| | | }); |
| | | |
| | | onBeforeUnmount(() => { |
| | | window.removeEventListener("resize", resize); |
| | | eventBus.off("toggleSiteList"); |
| | | dispose(); |
| | | }); |
| | | |
| | | function getOptions() { |
| | | |
| | | const option = { |
| | | // title: { |
| | | // text: '请求数', |
| | | // textStyle: { |
| | | // fontWeight: 'normal', |
| | | // fontSize: 16, |
| | | // color: '#F1F1F3' |
| | | // }, |
| | | // left: '6%' |
| | | // }, |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | lineStyle: { |
| | | color: '#57617B' |
| | | } |
| | | } |
| | | }, |
| | | // legend: { |
| | | // icon: 'rect', |
| | | // itemWidth: 14, |
| | | // itemHeight: 5, |
| | | // itemGap: 13, |
| | | // data: ['移动', '电信', '联通'], |
| | | // right: '4%', |
| | | // textStyle: { |
| | | // fontSize: 12, |
| | | // color: '#F1F1F3' |
| | | // } |
| | | // }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: [{ |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#57617B' |
| | | } |
| | | }, |
| | | data: ['13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30', '13:35', '13:40', '13:45', '13:50', '13:55'] |
| | | }, { |
| | | axisPointer: { |
| | | show: false |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#57617B' |
| | | } |
| | | }, |
| | | axisTick: { |
| | | show: false |
| | | }, |
| | | |
| | | position: 'bottom', |
| | | offset: 20, |
| | | data: ['', '', '', '', '', '', '', '', '', '', { |
| | | value: '周六', |
| | | textStyle: { |
| | | align: 'left' |
| | | } |
| | | }, '周日'] |
| | | }], |
| | | yAxis: [{ |
| | | type: 'value', |
| | | name: '单位(%)', |
| | | axisTick: { |
| | | show: false |
| | | }, |
| | | axisLine: { |
| | | lineStyle: { |
| | | color: '#57617B' |
| | | } |
| | | }, |
| | | axisLabel: { |
| | | margin: 10, |
| | | textStyle: { |
| | | fontSize: 14 |
| | | } |
| | | }, |
| | | splitLine: { |
| | | lineStyle: { |
| | | color: '#57617B' |
| | | } |
| | | } |
| | | }], |
| | | series: [{ |
| | | name: '移动', |
| | | type: 'line', |
| | | smooth: true, |
| | | symbol: 'circle', |
| | | symbolSize: 5, |
| | | showSymbol: false, |
| | | lineStyle: { |
| | | normal: { |
| | | width: 1 |
| | | } |
| | | }, |
| | | areaStyle: { |
| | | normal: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ |
| | | offset: 0, |
| | | color: 'rgba(137, 189, 27, 0.3)' |
| | | }, { |
| | | offset: 0.8, |
| | | color: 'rgba(137, 189, 27, 0)' |
| | | }], false), |
| | | shadowColor: 'rgba(0, 0, 0, 0.1)', |
| | | shadowBlur: 10 |
| | | } |
| | | }, |
| | | itemStyle: { |
| | | normal: { |
| | | color: 'rgb(137,189,27)', |
| | | borderColor: 'rgba(137,189,2,0.27)', |
| | | borderWidth: 12 |
| | | |
| | | } |
| | | }, |
| | | data: [220, 182, 191, 134, 150, 120, 110, 125, 145, 122, 165, 122] |
| | | }, { |
| | | name: '电信', |
| | | type: 'line', |
| | | smooth: true, |
| | | symbol: 'circle', |
| | | symbolSize: 5, |
| | | showSymbol: false, |
| | | lineStyle: { |
| | | normal: { |
| | | width: 1 |
| | | } |
| | | }, |
| | | areaStyle: { |
| | | normal: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ |
| | | offset: 0, |
| | | color: 'rgba(0, 136, 212, 0.3)' |
| | | }, { |
| | | offset: 0.8, |
| | | color: 'rgba(0, 136, 212, 0)' |
| | | }], false), |
| | | shadowColor: 'rgba(0, 0, 0, 0.1)', |
| | | shadowBlur: 10 |
| | | } |
| | | }, |
| | | itemStyle: { |
| | | normal: { |
| | | color: 'rgb(0,136,212)', |
| | | borderColor: 'rgba(0,136,212,0.2)', |
| | | borderWidth: 12 |
| | | |
| | | } |
| | | }, |
| | | data: [120, 110, 125, 145, 122, 165, 122, 220, 182, 191, 134, 150] |
| | | }, { |
| | | name: '联通', |
| | | type: 'line', |
| | | smooth: true, |
| | | symbol: 'circle', |
| | | symbolSize: 5, |
| | | showSymbol: false, |
| | | lineStyle: { |
| | | normal: { |
| | | width: 1 |
| | | } |
| | | }, |
| | | areaStyle: { |
| | | normal: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ |
| | | offset: 0, |
| | | color: 'rgba(219, 50, 51, 0.3)' |
| | | }, { |
| | | offset: 0.8, |
| | | color: 'rgba(219, 50, 51, 0)' |
| | | }], false), |
| | | shadowColor: 'rgba(0, 0, 0, 0.1)', |
| | | shadowBlur: 10 |
| | | } |
| | | }, |
| | | itemStyle: { |
| | | normal: { |
| | | |
| | | color: 'rgb(219,50,51)', |
| | | borderColor: 'rgba(219,50,51,0.2)', |
| | | borderWidth: 12 |
| | | } |
| | | }, |
| | | data: [220, 182, 125, 145, 122, 191, 134, 150, 120, 110, 165, 122] |
| | | },] |
| | | }; |
| | | |
| | | return option; |
| | | } |
| | | |
| | | function getChart() { |
| | | return chart_instance.value; |
| | | return chart_instance; |
| | | } |
| | | |
| | | function setOption(option) { |
| | | if (chart_instance.value) { |
| | | chart_instance.value.setOption(option); |
| | | if (chart_instance) { |
| | | chart_instance.setOption(option); |
| | | } |
| | | } |
| | | |
| | | function fullScreen() { |
| | | fullScreenFlag.value = !fullScreenFlag.value; |
| | | emit("update:fullFlag", fullScreenFlag.value); |
| | | nextTick(() => { |
| | | resize(); |
| | | }); |
| | |
| | | |
| | | function getDataURL() { |
| | | let base64 = ""; |
| | | if (exportChart_instance.value) { |
| | | let option = chart_instance.value.getOption(); |
| | | if (exportChart_instance) { |
| | | let option = chart_instance.getOption(); |
| | | option.xAxis[0].axisLine.lineStyle = { |
| | | color: "#000", |
| | | }; |
| | | option.xAxis[0].axisLabel.textStyle = option.xAxis[0].axisLabel.textStyle || {}; |
| | | option.xAxis[0].axisLabel.textStyle.color = "#000"; |
| | | |
| | | option.yAxis[0].axisLine.lineStyle = { |
| | | color: "#000", |
| | | }; |
| | | option.yAxis[0].axisLabel.textStyle = option.yAxis[0].axisLabel.textStyle || {}; |
| | | option.yAxis[0].axisLabel.textStyle.color = "#000"; |
| | | exportChart_instance.value.setOption(option); |
| | | base64 = exportChart_instance.value.getDataURL({ |
| | | |
| | | option.animation = false; |
| | | |
| | | exportChart_instance.setOption(option); |
| | | base64 = exportChart_instance.getDataURL({ |
| | | pixelRatio: 1, |
| | | backgroundColor: "#fff", |
| | | }); |
| | |
| | | } |
| | | |
| | | function resize() { |
| | | if (chart_instance.value) { |
| | | chart_instance.value.resize(); |
| | | console.log('resize', '============='); |
| | | |
| | | if (chart_instance) { |
| | | chart_instance.resize(); |
| | | } |
| | | } |
| | | |
| | | function dispose() { |
| | | disposeChart(chart_instance.value); |
| | | disposeChart(exportChart_instance.value); |
| | | disposeChart(chart_instance); |
| | | disposeChart(exportChart_instance); |
| | | } |
| | | |
| | | function disposeChart(chart) { |
| | |
| | | <div |
| | | class="e-chart-root" |
| | | :class="{ 'full-screen': fullScreenFlag }" |
| | | @click="handleClick" |
| | | @dblclick="fullScreen" |
| | | > |
| | | <!-- @click="handleClick" |
| | | @dblclick="fullScreen" --> |
| | | <div class="e-chart-container"> |
| | | <div class="e-chart" ref="chart"></div> |
| | | <slot name="tools"></slot> |