楼宇能效监测控制系统
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.
 
 
 
 
 

293 lines
8.7 KiB

<template>
<div style="width: 100%; height: 100%">
<div class="right-table">
<div class="choice">
<div
class="mr20"
v-for="(item, index) in energyTypes"
:key="index"
@click="handleEnter(index, item.name)"
:class="{ timeStyle: sharedIndex == index }"
>
{{ item.name }}
</div>
</div>
<div class="charts" ref="chart_ref"></div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { viewYearEnergy } from "@/api/index";
export default {
data() {
return {
energyTypes: [],
sharedIndex: 0,
chartInstance: null,
option: {},
colorList: [
{
color: "#00CED1",
offsetColor1: "rgba(0, 206, 209, 0.5)",
offsetColor2: "rgba(0, 206, 209, 0)",
},
{
color: "#ffe21e",
offsetColor1: "rgba(255,226,30, 0.5)",
offsetColor2: "rgba(255,226,30, 0)",
},
{
color: "#1a69f1",
offsetColor1: "rgba(26, 105, 241, 0.5)",
offsetColor2: "rgba(26, 105, 241, 0)",
},
{
color: "#2df499",
offsetColor1: "rgba(45,244,153, 0.5)",
offsetColor2: "rgba(45,244,153, 0)",
},
{
color: "#e87b4b",
offsetColor1: "rgba(232, 123, 75, 0.5)",
offsetColor2: "rgba(232, 123, 75, 0)",
},
],
};
},
mounted() {
this.initChart();
window.addEventListener("resize", this.screenAdapter);
this.screenAdapter();
this.echartsData();
},
destroyed() {
//取消监听器
window.removeEventListener("resize", this.screenAdapter);
},
methods: {
// 选择日月年
handleEnter(index, event) {
console.log("index", index);
console.log("event", event);
this.chartInstance.dispose();
this.initChart();
this.sharedIndex = index;
// 使用 find 方法查找符合条件的对象
const chartsObj = this.energyTypes.find((item) => item.name === event);
const colorObj = this.colorList.find(
(_, currentIndex) => currentIndex === index
);
console.log("当前要渲染的数据对象", chartsObj);
console.log("当前要渲染的颜色对象", colorObj);
let adapterOption = {};
// 添加折线的配置
adapterOption = {
tooltip: {
trigger: "axis",
// 自定义 tooltip 内容
formatter: function (params) {
var res = params[0].name + "<br/>";
for (var i = 0, l = params.length; i < l; i++) {
var seriesName = params[i].seriesName;
var value = params[i].value;
var marker =
'<span style="display:inline-block;margin-right:5px;border-radius:10px;width:9px;height:9px;background-color:' +
params[i].color +
'"></span>';
// 根据不同德seriesName 返回不同的单位
if (chartsObj.unit) {
res +=
marker +
seriesName +
":" +
'<span style="color: #000000; font-weight: bold;margin-left:5px">' +
value +
chartsObj.unit +
"</span><br>";
} else {
res +=
marker +
seriesName +
":" +
'<span style="color: #000000; font-weight: bold;margin-left:5px">' +
value +
"</span><br>";
}
}
return res;
},
},
xAxis: {
data: chartsObj.timeStr,
},
yAxis: {
name: chartsObj.unit,
},
series: [
{
data: chartsObj.data,
name: event,
//折线颜色
itemStyle: {
color: colorObj.color, //折线的颜色
},
lineStyle: {
color: colorObj.color, //折线点的颜色
},
areaStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0,
color: colorObj.offsetColor1, // 渐变起始颜色
},
{
offset: 1,
color: colorObj.offsetColor2, // 渐变结束颜色
},
],
global: false, // 缺省为 false
},
},
},
],
};
//记得重新给配置项给实例对象。只要实例对象.chartInstance不变,option就可以多次配置不同的条件。也可以配置一个dataoption只写需要从后台请求的数据相关
this.chartInstance.setOption(adapterOption);
//手动的调用图标对象的resize才能产生效果
this.chartInstance.resize();
},
// 折线图自适应+ 根据按钮切换图例仅限一条且不可点击+ 折线图数据
screenAdapter() {
//自己定义的比较合适的适配大小,2.6 mes_ref是图表盒子
const titleFontSize = this.$refs.chart_ref.offsetWidth / 130;
//因为option可以多次配置的,所以这里的option只需要写 需要配置大小的相关数据
const adapterOption = {};
//记得重新给配置项给实例对象。只要实例对象.chartInstance不变,option就可以多次配置不同的条件。也可以配置一个dataoption只写需要从后台请求的数据相关
this.chartInstance.setOption(adapterOption);
//手动的调用图标对象的resize才能产生效果
this.chartInstance.resize();
},
//初始化chartInstance对象
initChart() {
this.chartInstance = echarts.init(this.$refs.chart_ref);
this.option = {
tooltip: {
trigger: "item",
},
legend: {
show: false,
},
grid: {
top: "10%",
left: "4%",
right: "6%",
bottom: "3%",
containLabel: true,
},
xAxis: {
type: "category",
//设置为true代表离零刻度间隔一段距离
boundaryGap: true,
// 修饰刻度标签的颜色即x坐标数据
axisLabel: {
// interval: 0, //强制显示所有x轴数据
// rotate: 30, //x轴坐标字体倾斜30度
color: "rgba(255, 255, 255, 1)",
},
axisTick: {
show: false, // 不显示坐标轴刻度线
},
// x坐标轴的颜色
axisLine: {
show: true,
lineStyle: {
color: "#365576",
},
},
splitLine: {
lineStyle: {
color: "#e2e6f0",
},
}, //x轴分割线
},
yAxis: {
min: 0,
// max:20,
// // // min:'dataMin',
// // // max:'dataMax',
// name: "kwh", // 第一个 y 轴的单位描述
// 设置 name 的样式
nameTextStyle: {
color: "rgba(255, 255, 255, 1)",
fontSize: 12,
},
miniInterval: 5,
type: "value",
// 修饰刻度标签的颜色即y坐标数据
axisLabel: {
color: "rgba(255, 255, 255, 1)",
},
// 显示y坐标轴
axisLine: {
show: true,
lineStyle: {
color: "#365576", // 设置 y 轴线的颜色
},
},
//y轴分割线段数
// splitNumber: 10,
// 修改y轴分割线的颜色
splitLine: {
lineStyle: {
color: "#1a3d62", // 设置分割线的颜色
type: "dashed", // 设置分割线为虚线
},
},
},
series: [
{
type: "line",
// 拐点大小
symbolSize: 8,
},
],
};
//把配置项给实例对象
this.chartInstance.setOption(this.option, true);
},
echartsData() {
viewYearEnergy().then((res) => {
console.log("折线图返回值", res);
this.energyTypes = res.rows;
// 处理值
// 在组件挂载完成后调用 handleEnter 方法
if (this.energyTypes.length > 0) {
this.handleEnter(0, this.energyTypes[0].name);
}
});
},
},
};
</script>
<style lang="scss" scoped>
.right-table {
padding: 27px 15px 35px 15px;
}
.mr20 {
width: 92px;
padding: 2px;
}
.charts {
margin-top: 20px;
width: 100%;
height: 300px;
}
</style>