2025-04-02 17:32:13 +08:00

236 lines
6.1 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="market-charts" :style="{ height: height }">
<custom-echart-line-line :chart-data="chartsData.valData" height="100%" :option="chartsData.option" />
</div>
</template>
<script setup>
import { ref, reactive, onMounted, computed } from 'vue';
const props = defineProps({
height: {
type: String,
default: '200px',
},
});
const legendData = reactive(['苹果', '小麦', '白菜']);
let linearColors = reactive([
[
{ offset: 0, color: 'rgba(15, 155, 179,0.1)' },
{ offset: 0.6, color: 'rgba(15, 155, 179,0.5)' },
{ offset: 1, color: 'rgba(15, 155, 179,1)' },
],
[
{ offset: 0, color: 'rgba(106, 202, 55,0.1)' },
{ offset: 0.6, color: 'rgba(106, 202, 55,0.5)' },
{ offset: 1, color: 'rgba(106, 202, 55,1)' },
],
[
{ offset: 0, color: 'rgba(141, 76, 181,0.1)' },
{ offset: 0.6, color: 'rgba(141, 76, 181,0.5)' },
{ offset: 1, color: 'rgba(141, 76, 181,1)' },
],
]);
const lineColors = reactive(['#0f9bb3', '#6aca37', '#8d4cb5']);
const currentYear = ref(new Date().getFullYear() + 1);
const xPoint = computed(() => {
let list = [];
console.info('111', currentYear.value);
let minYear = currentYear.value - 10;
for (let i = minYear; i < currentYear.value; i++) {
list.push(i);
}
return list;
});
let numList = reactive([10, 100, 80]);
const dataNum = (num) => {
let data = [];
if (xPoint.value && xPoint.value.length && xPoint.value.length > 0 && num) {
xPoint.value.forEach((n) => {
let numVal = Number(Number(n) * 0.1 + num + Math.random() * 100).toFixed(2);
data.push(numVal);
});
}
return data;
};
const series = () => {
let list = [];
if (legendData && legendData.length && legendData.length > 0) {
// console.info('legendData', legendData);
legendData.forEach((m, index) => {
let val = {
name: m,
type: 'line',
symbol: 'none', // 默认是空心圆(中间是白色的),改成实心圆
smooth: true,
lineStyle: {
normal: {
width: 1,
color: lineColors[index], // 线条颜色
},
},
areaStyle: {
normal: {
//线性渐变前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是true则该四个值是绝对像素位置。
color: {
type: 'linear', // 线性渐变
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: linearColors[index],
global: false, // 默认为 false
},
},
},
data: [],
};
val.data = dataNum(numList[index]);
list.push(val);
});
}
return list;
};
const chartsData = reactive({
option: {
backgroundColor: 'transparent',
grid: {
left: 20,
right: 20,
bottom: '5%',
top: '20%',
containLabel: true,
},
tooltip: {
trigger: 'axis',
borderWidth: 1,
borderColor: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: 'rgba(85, 149, 233, .6)', // 0% 处的颜色
},
{
offset: 1,
color: 'rgba(85, 149, 233, 0)', // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
padding: [0, 8, 0, 8],
textStyle: {
color: '#fff',
},
axisPointer: {
lineStyle: {
type: 'dashed',
color: 'rgba(255, 255, 255, .6)',
},
},
extraCssText: 'box-shadow: 2px 2px 16px 1px rgba(0, 39, 102, 0.16)',
formatter: function (params) {
let content = `<div style='font-size: 14px; color: #666;text-align:left'>${params[0].name}</div>`;
if (Array.isArray(params)) {
for (let i = 0; i < params.length; i++) {
content += `
<div style='display: flex; align-items: center;color: #666;'>
<div style='width: 10px; height: 10px;border-radius:4px;background: ${params[i].color}; margin-right: 8px;'></div>
<div style='font-size: 12px; margin-right: 8px;'>${params[i].seriesName}</div>
<div style='font-size: 14px;'>${params[i].value}</div>
</div>
`;
}
}
return content;
},
},
legend: {
show: true,
data: Array.from(legendData),
left: 'center', // 距离左侧10%的位置
top: '0', // 垂直居中
itemWidth: 15, // 图例标记的宽度
itemHeight: 8, // 图例标记的高度
textStyle: {
fontSize: 10, // 图例文字的字体大小
color: '#333', // 图例文字的颜色
},
},
xAxis: {
type: 'category',
boundaryGap: false,
axisLabel: {
interval: 0, // 设置为 1表示『隔一个标签显示一个标签』
textStyle: {
color: '#666',
fontStyle: 'normal',
fontSize: 10,
},
},
axisTick: {
show: false,
},
axisLine: {
// 坐标轴轴线相关设置
lineStyle: {
color: 'rgba(77, 128, 254, 1)',
},
},
splitLine: {
show: false,
},
data: xPoint.value,
},
yAxis: {
type: 'value',
name: ' ',
nameTextStyle: {
color: '#666',
fontSize: 14,
padding: [0, 0, 0, -30],
},
axisLabel: {
interval: 0, // 设置为 1表示『隔一个标签显示一个标签』
textStyle: {
color: '#666',
fontStyle: 'normal',
fontSize: 12,
},
},
axisTick: {
show: false,
},
axisLine: {
// 坐标轴轴线相关设置
lineStyle: {
color: 'rgba(77, 128, 254, 0.2)',
},
},
splitLine: {
show: false,
},
},
series: series(),
},
});
onMounted(() => {});
</script>
<style lang="scss" scoped>
.market-charts-charts {
height: 100%;
}
</style>