Vue中Echarts获取后端动态数据(历史记录)画图(前端统计24小时、七天、三十天的数据画图)

780 阅读2分钟

功能介绍

后端传给前端用户每天的历史记录,需要前端统计近24小时、近七天、近三十天的数据画出Echarts柱形图,柱形图x轴为近24小时、近七天、近三十天的时间,画图数据为统计的数量。

逻辑梳理

  1. 获取并引入Echarts(略)
  2. 为了切换不同时间的柱形图,需要在template中添加三个按钮,并定义有宽度和高度的父容器(画图的位置)
  3. 在data中定义画图所需要的数据
  4. 获取当前时间的近24小时作为x轴数据,处理后端传来的数据,找出近24小时的数据并统计数量,将数量作为画图所需要的数据,七天、三十天类似
  5. 使用Echarts设置动态数据的柱状图

代码部分

在template中:

 <div class="button">
    <el-button @click="changeDay()">24h</el-button>
    <el-button @click="changeWeek()">7days</el-button>
    <el-button @click="changeMonth()">30days</el-button>
 </div>
 <div id="chart" class="grid-content bg-purple-dark"></div>

在data中定义数据,DayData代表近24小时的所需要的x轴数据和画图数据的集合,sDAxisData代表近24小时的画图数据集合,xDAxisData代表近24小时的时间集合:

      DayData: [],
      WeekData: [],
      MonthData: [],
      sDAxisData: [],
      xDAxisData: [],
      sWAxisData: [],
      xWAxisData: [],
      sMAxisData: [],
      xMAxisData: [],

获取近24小时、近七天、近三十天的时间:

//生成两位数的时间格式,如9:01变成09:01
  add0(m) {
      return m < 10 ? "0" + m : m;
    },
   // 获取近24小时
    getDayDate() {
      var myDate = new Date(); // 获取今天日期
      myDate.setDate(myDate.getDate());
      var dateTemp1 =
        myDate.getFullYear() +
        "-" +
        this.add0(myDate.getMonth() + 1) +
        "-" +
        this.add0(myDate.getDate()) +
        "\xa0";
      for (var i = 0; i <= 24; i++) {
        var dateTemp2 = this.add0(i);
        var key = dateTemp1 + dateTemp2;
        var value = 0;
        this.DayData[key] = value;
      }
      this.xDAxisData = Object.keys(this.DayData);
      // console.log(this.DayData);
    },
    // 获取当前日期的前7天
    getWeekDate() {
      var myDate = new Date(); // 获取今天日期
      myDate.setDate(myDate.getDate() - 6);
      var dateTemp;
      var flag = 1;
      for (var i = 0; i < 7; i++) {
        dateTemp =
          myDate.getFullYear() +
          "-" +
          this.add0(myDate.getMonth() + 1) +
          "-" +
          this.add0(myDate.getDate());
        var key = dateTemp;
        var value = 0;
        this.WeekData[key] = value;
        // console.log(this.WeekData)
        myDate.setDate(myDate.getDate() + flag);
      }
      this.xWAxisData = Object.keys(this.WeekData);
    },
    getMonthDate() {
      var mDate = new Date(); // 获取今天日期
      mDate.setDate(mDate.getDate() - 29);
      var dateTempM;
      var flag = 1;
      for (var i = 0; i < 30; i++) {
        dateTempM =
          mDate.getFullYear() +
          "-" +
          this.add0(mDate.getMonth() + 1) +
          "-" +
          this.add0(mDate.getDate());
        var key = dateTempM;
        var value = 0;
        this.MonthData[key] = value;
        // console.log(this.MonthData,"this.MonthData")
        mDate.setDate(mDate.getDate() + flag);
      }
      this.xMAxisData = Object.keys(this.MonthData);
    },

生成的数据格式:

image.png

image.png

image.png 根据后端传入的数据格式获取用户使用的时间

             // 后端传的时间精确到时 如2023-03-07 17
              var timeH =
                resultData[i].createOn.split("T")[0] +
                "\xa0" +
                resultData[i].createOn.split("T")[1].substr(0, 2);
              // console.log(timeH);
              // 画图数据,匹配近24小时每个小时和后端传来的每个小时                           // 若后端的使用时间和近24小时的每个时间匹配,则数量加一
              if (Object.keys(this.DayData).indexOf(timeH) > -1) {
                this.DayData[timeH]++;
              }
              //画图数据即数量
              this.sDAxisData = Object.values(this.DayData);
              // console.log("this.DayData", this.DayData);
              // 后端传的时间精确到日,如 2023-03-07
              var time = resultData[i].createOn.split("T")[0];
              if (Object.keys(this.WeekData).indexOf(time) > -1) {
                this.WeekData[time]++;
              }
              this.sWAxisData = Object.values(this.WeekData);
              if (Object.keys(this.MonthData).indexOf(time) > -1) {
                this.MonthData[time]++;
              }
              this.sMAxisData = Object.values(this.MonthData);
    

若获取总使用量:

            // 今天总使用量
            this.today = this.WeekData[todate];
            // 7天总使用量
            this.week = this.sum(Object.values(this.WeekData));
            // console.log(this.sum(Object.values(this.WeekData)));
            // 30天总使用量
            this.month = this.sum(Object.values(this.MonthData));
            // console.log(this.MonthData);
            // 相加
            sum(arr) {
               let sum = 0;
               arr.forEach(function (item) {
               sum += item;
               });
               return sum;
            },

Echarts柱形图:

    // 柱状图
    getEchartData(x, s) {
      var myChart = this.$echarts.init(document.getElementById("chart"));
      const option = {
        title: {
          text: "visits",
          left: "center",
        },
        // 提示框
        tooltip: {
          trigger: "axis",
          axisPointer: {
            type: "shadow",
          },
        },
        // 工具箱
        toolbox: {
          show: true,
          feature: {
            magicType: { type: ["line", "bar"] },
            restore: {},
            saveAsImage: {},
          },
        },
        // 图表的位置
        grid: {
          left: "5%",
          bottom: "5%",
          top: "12%",
        },
        // 放大缩小
        dataZoom: [
          {
            id: "dataZoomX",
            type: "inside",
            xAxisIndex: [0],
            filterMode: "none",
            start: 0,
            end: 100,
          },
        ],
        // x轴数据
        xAxis: {
          type: "category",
          data: x,
        },
        yAxis: {
          type: "value",
          // splitLine:false
        },
        // 画图数据
        series: [{ name: "visits", data: s || 0, type: "bar" }]
      };
      myChart.setOption(option, true);
      window.addEventListener("resize", function () {
        myChart.resize();
      });
      this.$on("hook:destroyed", () => {
        window.removeEventListener("resize", function () {
          myChart.resize();
        });
      });
    },

按钮点击事件,将画图需要用到的数据传入Echarts设置柱形图的方法中即可

    // 点击button触发
    changeDay() {
      this.getDayDate();
      //在时后面加了个“00”,由13改为了13:00
      for (var i = 0; i < this.xDAxisData.length; i++) {
        this.xDAxisData[i] = this.xDAxisData[i].split("\xa0")[1] + ":00";
      }
      this.getEchartData(this.xDAxisData, this.sDAxisData);
    },
    changeWeek() {
      this.getEchartData(this.xWAxisData, this.sWAxisData);
    },
    changeMonth() {
      this.getEchartData(this.xMAxisData, this.sMAxisData);
    },

成果展示(默认近七天):

image.png image.png image.png 不全面的地方欢迎指出~