You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.1 KiB
190 lines
5.1 KiB
|
8 months ago
|
<script lang="ts" setup>
|
||
|
|
import type { Ref } from 'vue'
|
||
|
|
import { onMounted, ref, watch } from 'vue'
|
||
|
|
import type { YAXisOption } from 'echarts/types/dist/shared'
|
||
|
|
import moment from 'moment'
|
||
|
|
import { useECharts } from '@/hooks/web/useECharts'
|
||
|
|
import { propTypes } from '@/utils/propTypes'
|
||
|
|
|
||
|
|
const props = defineProps({
|
||
|
|
isAsync: {
|
||
|
|
type: Boolean,
|
||
|
|
default: false,
|
||
|
|
},
|
||
|
|
height: {
|
||
|
|
type: String,
|
||
|
|
default: propTypes.string.def('500px'),
|
||
|
|
},
|
||
|
|
title: {
|
||
|
|
type: String,
|
||
|
|
default: '',
|
||
|
|
},
|
||
|
|
name: {
|
||
|
|
type: Array<string>,
|
||
|
|
default: [],
|
||
|
|
},
|
||
|
|
data: {
|
||
|
|
type: Array<Array<number>>,
|
||
|
|
default: () => [[]],
|
||
|
|
},
|
||
|
|
width: propTypes.string.def('100%'),
|
||
|
|
// height: propTypes.string.def('70vh'),
|
||
|
|
})
|
||
|
|
const chartRef = ref<HTMLDivElement | null>(null)
|
||
|
|
|
||
|
|
const { setOptions, setGroup, chartInstance } = useECharts(chartRef as Ref<HTMLDivElement>, 'default', props.isAsync)
|
||
|
|
onMounted(() => {
|
||
|
|
|
||
|
|
})
|
||
|
|
|
||
|
|
// const yAxis = reactive<yAxisForm>({
|
||
|
|
// type: 'value',
|
||
|
|
// scale: true, // 开启自适应刻度
|
||
|
|
|
||
|
|
// })
|
||
|
|
watch(
|
||
|
|
() => props.data,
|
||
|
|
() => {
|
||
|
|
console.log(props.data)
|
||
|
|
const yAxis = ref<YAXisOption[]>([])
|
||
|
|
const series = ref<any[]>([])
|
||
|
|
const title = ref<any>({})
|
||
|
|
|
||
|
|
for (let i = 0; i < props.data.length; i++) {
|
||
|
|
title.value = {
|
||
|
|
left: 'left',
|
||
|
|
text: props.title,
|
||
|
|
show: true,
|
||
|
|
textStyle: { // 设置主标题的文字风格
|
||
|
|
fontFamily: 'sans-serif', // 字体系列
|
||
|
|
fontWeight: 350,
|
||
|
|
color: 'black', // 字体颜色
|
||
|
|
fontSize: 16, // 文字大小
|
||
|
|
},
|
||
|
|
|
||
|
|
}
|
||
|
|
yAxis.value.push({
|
||
|
|
type: 'value',
|
||
|
|
show: false,
|
||
|
|
scale: true, // 开启自适应刻度
|
||
|
|
})
|
||
|
|
series.value.push({
|
||
|
|
name: props.name[i],
|
||
|
|
type: 'line',
|
||
|
|
smooth: true,
|
||
|
|
showSymbol: false,
|
||
|
|
data: props.data[i],
|
||
|
|
yAxisIndex: i,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
// const aa = getInstance()
|
||
|
|
|
||
|
|
setOptions({
|
||
|
|
// 网格
|
||
|
|
grid: {
|
||
|
|
x: '2%',
|
||
|
|
y: '5%',
|
||
|
|
x2: '2%',
|
||
|
|
y2: '30%',
|
||
|
|
containLabel: false,
|
||
|
|
// width: {totalWidth} - x - x2,
|
||
|
|
// height: {totalHeight} - y - y2,
|
||
|
|
backgroundColor: 'rgba(0,0,0,0)',
|
||
|
|
borderWidth: 1,
|
||
|
|
borderColor: '#ccc',
|
||
|
|
},
|
||
|
|
|
||
|
|
tooltip: {
|
||
|
|
trigger: 'axis',
|
||
|
|
position(pt) {
|
||
|
|
return [pt[0], '10%']
|
||
|
|
},
|
||
|
|
},
|
||
|
|
title: title.value,
|
||
|
|
toolbox: {
|
||
|
|
feature: {
|
||
|
|
dataZoom: {
|
||
|
|
yAxisIndex: 'none',
|
||
|
|
},
|
||
|
|
restore: { show: false },
|
||
|
|
saveAsImage: {},
|
||
|
|
/* 自定义事件,注意:自定义事件必须以my开头 */
|
||
|
|
myTool2: {
|
||
|
|
show: true,
|
||
|
|
title: '下载csv文件', /* 鼠标停留时的提示文字 */
|
||
|
|
// icon: 'image://../0IMG/tool.png', /* 显示图标,必须以image://为开头显示后面是图表的路径 */
|
||
|
|
icon: 'path://M18 20.288L21.288 17l-.688-.688l-2.1 2.1v-4.887h-1v4.887l-2.1-2.1l-.688.688zM14.5 23.5v-1h7v1zm-10-4v-17H13L18.5 8v3.14h-1V8.5h-5v-5h-7v15h6.615v1zm1-1v-15z',
|
||
|
|
/* 点击时触发的事件 */
|
||
|
|
onclick() {
|
||
|
|
setTimeout(() => {
|
||
|
|
// 使用这个函数转换数据为CSV格式
|
||
|
|
const csv = convertToCSV(props.data)
|
||
|
|
console.log(props.data)
|
||
|
|
// 如果你想提供下载链接
|
||
|
|
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })
|
||
|
|
const link = document.createElement('a')
|
||
|
|
link.href = URL.createObjectURL(blob)
|
||
|
|
link.download = 'data.csv'
|
||
|
|
link.click()
|
||
|
|
function convertToCSV(data) {
|
||
|
|
let csv = ''
|
||
|
|
// 添加列头
|
||
|
|
const name = props.name.join(',')
|
||
|
|
csv += `时间,${name}\n`
|
||
|
|
// 遍历数据并添加到CSV字符串中
|
||
|
|
for (let i = 0; i < props.data[0].length; i++) {
|
||
|
|
let data = ''
|
||
|
|
for (let j = 0; j < props.data.length; j++)
|
||
|
|
data += `,${props.data[j][i][1]}`
|
||
|
|
|
||
|
|
csv += `${moment(props.data[0][i][0]).format('YYYY-MM-DD HH:mm:ss')}${data}\n`
|
||
|
|
// props.data[i].map((item, index) => {
|
||
|
|
// csv += 'x值' + ',' + 'y值' + '\n'
|
||
|
|
// })
|
||
|
|
}
|
||
|
|
return csv
|
||
|
|
}
|
||
|
|
}, 10)
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
},
|
||
|
|
xAxis: {
|
||
|
|
type: 'time',
|
||
|
|
axisTick: {
|
||
|
|
length: 6,
|
||
|
|
lineStyle: {
|
||
|
|
type: 'dashed',
|
||
|
|
// ...
|
||
|
|
},
|
||
|
|
},
|
||
|
|
// boundaryGap: false,
|
||
|
|
},
|
||
|
|
yAxis: yAxis.value,
|
||
|
|
legend: {
|
||
|
|
|
||
|
|
},
|
||
|
|
dataZoom: [
|
||
|
|
{
|
||
|
|
type: 'slider',
|
||
|
|
start: 0,
|
||
|
|
end: 100,
|
||
|
|
},
|
||
|
|
// 没有下面这块的话,只能拖动滚动条,
|
||
|
|
// 鼠标滚轮在区域内不能控制外部滚动条
|
||
|
|
// {
|
||
|
|
// start: 0,
|
||
|
|
// end: 100,
|
||
|
|
// },
|
||
|
|
],
|
||
|
|
series: series.value,
|
||
|
|
})
|
||
|
|
},
|
||
|
|
{ immediate: true },
|
||
|
|
)
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<template>
|
||
|
|
<div ref="chartRef" :style="{ width, height }" />
|
||
|
|
</template>
|