当前位置: 首页 > news >正文

vue后台系统管理项目-echarts柱状图实现订单统计

echarts柱状图实现订单统计

主要功能

  • 不同订单状态切换显示不同的柱状图数据;
  • 根据条件切换选择年度视图、月度视图;
  • 根据条件切换指定年份、指定月份显示当前的数据;
  • 根据搜索条件查询查看柱状图数据;
  • 柱状图数据导出功能,可导出Excel、导出PDF;
  • 柱状图实现,属性配置、页面自适应;

目录

echarts柱状图实现订单统计

页面布局

获取数据方法

1. 已完成订单、运输中tab切换,数据获取

2.getOrderFirstAP调用接口,获取柱状图图标数据

3.获取年份

4.获取默认月份

5.查询方法

6.重置功能

7.导出功能

8.柱状图数据配置


实现效果 

 

 

页面布局

本项目使用的element-ui框架,可根据需求自行修改,功能都是都是一样的,通用。

<div class="main mt30">
      <!-- 已完成订单 -->
      <!-- 第一个图表 -->
      <div class="ordersed">
        <!-- tab 切换栏 -->
        <el-row>
          <el-col :span="24">
            <div class="grid-content bg-purple">
              <el-menu :default-active="activeIndex" class="el-menu-demo" mode="horizontal" text-color='black'
                @select="handleSelect1">
                <el-menu-item index="complete">已完成订单</el-menu-item>
                <!-- <el-menu-item index="waiting">待签约订单</el-menu-item> -->
                <el-menu-item index="transit">运输中</el-menu-item>
              </el-menu>
            </div>
          </el-col>
        </el-row>
        <el-row>
          <el-form :model="ruleForm" ref="ruleForm" class="demo-ruleForm" size="35">
            <el-col :span="18">
              <!-- 已完成订单搜索表单 -->
              <!-- 条件选择 -->
              <div class="mt20">
                <el-row :gutter="20">
                  <!-- 选择查询条件 - 视图 -->
                  <el-col :span="3">
                    <el-form-item prop="period">
                      <el-select v-model="ruleForm.period" clearable placeholder="请选择" @change='selectChange1'>
                        <el-option label="年视图" value="year"></el-option>
                        <!-- <el-option label="半年视图" value="halfYear"></el-option> -->
                        <!-- <el-option label="季度视图" value="quarter"></el-option> -->
                        <el-option label="月度视图" value="month"></el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <!-- 选择年份 -->
                  <el-col :span="3">
                    <el-form-item prop="year">
                      <el-select v-model="ruleForm.year" clearable placeholder="请选择年份">
                        <el-option v-for="(item,index) in yearList" :key="index" :label="item+'年'" :value='item'>
                        </el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <el-col :span="3">
                    <!-- 第三个选框 -->
                    <!-- 选择了年视图时 -->
                    <!-- 默认月份 -->
                    <el-form-item prop="month" v-if="isChooseMonth">
                      <el-select v-model="ruleForm.month" clearable placeholder="请选择" :disabled="shouSearch">
                        <el-option v-for="item in modelList" :key="item.value" :label="item.label+'月'" :value="item.value">
                        </el-option>
                      </el-select>
                    </el-form-item>
                    <!--  -->
                    <el-form-item prop="states" v-else>
                      <el-select v-model="ruleForm.states" clearable placeholder="请选择" :disabled="shouSearch">
                        <el-option v-for="item in modelList" :key="item.value" :label="item.label+'月'" :value="item.value">
                        </el-option>
                      </el-select>
                    </el-form-item>
                  </el-col>
                  <!-- button 查询按钮 -->
                  <el-col :span="7">
                    <el-button type="primary" @click="submitForm1('ruleForm')">查找</el-button>
                    <el-button plain @click="resetForm1('ruleForm')">重置</el-button>
                    <!-- <el-button plain>导出</el-button> -->
                    <el-dropdown @command="handleCommand1" class="pl10">
                      <el-button plain>
                        导出<i class="el-icon-arrow-down el-icon--right"></i>
                      </el-button>
                      <el-dropdown-menu slot="dropdown">
                        <el-dropdown-item command="1">导出为 Excel</el-dropdown-item>
                        <el-dropdown-item command="2">导出为 PDF</el-dropdown-item>
                      </el-dropdown-menu>
                    </el-dropdown>
                  </el-col>
                </el-row>
              </div>
              <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
              <div id="order_base" :style="{width: '100%', height: '350px'}"></div>
            </el-col>
          </el-form>
          
        </el-row>
      </div>
</div>

接口引入

import {
  baseUrl,
  getOrderCount,//图表数据
  getPeriodList,//获取年份

  exportPDF,//导出pdf
  exportExcel//导出excel
} from "../../api/userMG";

获取数据方法

1. 已完成订单、运输中tab切换,数据获取

    // 切换 已完成订单tab 的回调
    handleSelect1(index) {
      console.log(index,"切换");
      this.ruleForm.orderStatus = index;
      this.getOrderFirstAPI();
    },

2.getOrderFirstAP调用接口,获取柱状图图标数据

getOrderFirstAPI() {
      this.ruleForm.year = parseInt(this.ruleForm.year).toString();
      getOrderCount(this.ruleForm)
          .then(res => {
            if (res.code == 200) {
              console.log(res, "订单统计--获取首行图表数据");
              this.dataX1 = res.data.XData;
              this.dataValue1 = res.data.YData;
              this.tableData = res.data.XData;
              this.drawLine();
            } else {
              this.$message({
                type: "error",
                text: res.msg
              });
            }
          })
          .catch(error => {});
    },

3.获取年份

getPeriodListAPI() {
      this.yearList = [];
      getPeriodList()
        .then(res => {
          if (res.code == 200) {
            console.log(res, "年份");
            // 运营年份赋值
            this.yearList = res.data;
            this.yearList.push("2020");
          }
        })
        .catch(err => {
          this.loading = false;
          this.$message.error("运营年份加载失败,请稍后再试!");
        });
    },

4.获取默认月份

created页面进来就要获取到

// 月份视图列表
      monthList: [
        {
          value: "01",
          label: "01"
        },
        {
          value: "02",
          label: "02"
        },
        {
          value: "03",
          label: "03"
        },
        {
          value: "04",
          label: "04"
        },
        {
          value: "05",
          label: "05"
        },
        {
          value: "06",
          label: "06"
        },
        {
          value: "07",
          label: "07"
        },
        {
          value: "08",
          label: "08"
        },
        {
          value: "09",
          label: "09"
        },
        {
          value: "10",
          label: "10"
        },
        {
          value: "11",
          label: "11"
        },
        {
          value: "12",
          label: "12"
        }
      ],
let aData = new Date();
// 默认月份列表
    this.modelList = this.monthList;
    this.ruleForm.year = aData.getFullYear() + "年"; //获取当前年份

5.查询方法

//点击查询
    submitForm1(ruleForm) {
      if(!this.ruleForm.year){
        this.$message.warning("请选择年份");
        return;
      }
      this.$refs[ruleForm].validate(valid => {
        if (valid) {
          // 发送请求
          this.getOrderFirstAPI();
          console.log(this.ruleForm);
        } else {
          console.log("error submit!!");
          return false;
        }
      });
    },

6.重置功能

//图表重置数据
    resetForm1(ruleForm) {
      this.$refs[ruleForm].resetFields();
      // 重置后重新获取默认数据
      this.shouSearch = false;
      this.ruleForm.period = "month";
      this.modelList = this.monthList;
      this.ruleForm.year = globalVariable.yearValue;
      this.ruleForm.month = globalVariable.monthValue;
      this.ruleForm.orderStatus = "complete";
      this.ruleForm.states = "";
      this.getOrderFirstAPI();
    },

7.导出功能

    //导出
    handleCommand1(command) {
      if (command == 1) {
        console.log("导出为excel");
        this.exportExcelFUN();
        // this.downExcel();
      } else {
        console.log("导出为pdf");
        this.exportPDFFUN();
      }
    },

 导出excel

这里实现了获取后台定义的文件名字的功能,一般情况只能前端自定义或者导出文件名是一串字符。

exportExcelFUN() {
      let params = {
        orderStatus: this.ruleForm.orderStatus,
        period: this.ruleForm.period,
        year: this.ruleForm.year,
        month: this.ruleForm.month,
      };
      axios({
        headers: {
          Authorization: JSON.parse(localStorage.getItem("userdata")).token
        },
        method:"post",
        url:`${this.baseUrl}/ordermanagement/exportExcel`,
        data:params,
        responseType:"blob"
      }).then(res=>{
        console.log(res);
        const link = document.createElement("a");
          let blob = new Blob([res.data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
          link.style.display = "none";
          link.href = window.URL.createObjectURL(blob);
          // 解码filename
          let name = res.headers['content-disposition'];
          let nameSplit = name.split(";")[1];
          let filename = decodeURI(nameSplit.split("=")[1]);
          console.log(filename,"filename");
          link.download = filename;

          document.body.appendChild(link);
          link.click();
          document.body.removeChild(link);
      }).catch(()=>{

      })
      // exportExcel(params).then(res => {
      //   // 创建一个隐藏的 a 链接
      //   if(res){
      //     const link = document.createElement("a");
      //     // { type: "application/vnd.ms-excel" } {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}
      //     let blob = new Blob([res], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
      //     link.style.display = "none";
      //     link.href = window.URL.createObjectURL(blob);
      //     link.download = "订单统计";
      //     document.body.appendChild(link);
      //     link.click();
      //     document.body.removeChild(link);
      //   }else{
      //     this.$message.warning("导出失败");
      //   }
      // }).catch(err => {
      //   console.log(err);
      // });
    },

导出pdf

前端封装方法,这里直接使用封装的方法调用即可。

本项目使用了html2canvas    jspdf两个插件来实现,需要先进行安装,主要通过生成的canvas转化成pdf,这里封装的方法代码较多,后续会更新实现这个方法详细代码,请关注后续博客更新

import html2canvas from 'html2canvas'
import JsPDF from 'jspdf'
exportPDFFUN() {
      // let params = {
      //   base64Info:this.$echarts.init(document.getElementById("order_base")).getDataURL()
      // };
      // exportPDF(params).then(res => {
      //   // if (res) {
      //   //   console.log("调用了导出PDF方法");
      //   // } else {
      //   //   this.$message.warning("导出失败");
      //   // }
      // }).catch(err => {});
      // console.log(this.$echarts.init(document.getElementById("order_base")).getDataURL())
      this.$util.downloadPDF(document.querySelector('#order_base'), '订单统计');
    },

8.柱状图数据配置

每项配置查看官方文档

drawLine() {
      // 基于准备好的dom,初始化echarts实例
      let order_base = this.$echarts.init(
        document.getElementById("order_base")
      );
      // 第一个 绘制图表
      order_base.setOption({
        title: { text: this.echartsText },
        tooltip: {
          trigger: 'axis',
          axisPointer: {
            type: 'shadow'
          },
        },
        // 图表位置调整
        grid: [
          {
            left: "3%",
            bottom: "10%",
            top: "15%",
            right: "10%",
          }
        ],
        xAxis: {
          data: this.dataX1,
          splitLine: {}, //网格线
          axisLine: {
            // x轴线颜色及轴线文字颜色,但有单独设置文字颜色的,可以覆盖这个颜色
          },
          lineStyle: {
            type: "dashed"
            // color: "#b3b3af"
          },
          // 轴字体颜色
          axisLabel: {
            // color: "#b3b3af"
          }
        },
        yAxis: {
          //y轴刻度线
          axisLine: {
            show: true
          },
          // 网格线
          splitLine: {
            // lineStyle: {
            //   type: "dashed"
            // },
            // show: true
          },
          minInterval: 1 //设置y轴最小刻度为1,保证y轴以正整数显示
        },
        series: [
          {
            name: this.ruleForm.orderStatus == "complete"
                ? "已完成订单"
                : this.ruleForm.orderStatus == "waiting"
                ? "待签约订单"
                : this.ruleForm.orderStatus == "transit"
                ? "运输中订单"
                : this.ruleForm.orderStatus == "exception"
                ? "异常订单"
                : "新增订单",
            type: "bar", //柱状体的类型
            data: this.dataValue1, //每个柱体对应的数据
            // 每个柱状体样式
            itemStyle: {
              normal: {
                color: "#3ba1ff"
              },
            },
            stack: 'Total',
            label: {
              show: true,
              position: 'inside'
            },
          }
        ]
      });
    },

 

⭐️⭐️⭐️  作者:船长在船上
🚩🚩🚩  主页:来访地址船长在船上的博客
🔨🔨🔨  简介:CSDN前端领域博客专家,CSDN前端领域优质创作者,资深前端开发工程师,专注web前端领域开发,在CSDN分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。

相关文章:

  • 2022年博客之星排行榜 日榜 2023-01-01 博客之星总榜
  • 一名普通Java程序员的2022的总结和2023的展望
  • 【寒假每日一题】洛谷 P1079 [NOIP2012 提高组] Vigenère 密码
  • 【概率论】期末复习笔记:参数估计
  • k-means算法进行数据分析应用
  • 【数据结构】单链表(线性表)的实现
  • JavaScript 入门基础 - 流程控制(四)
  • 剑指offer----C语言版----第五天
  • 使用python实现跨年烟花代码
  • 【Linux】Linux下基本指令(三)
  • Pyinstaller - 你的“神”队友
  • 【nowcoder】笔试强训Day15
  • 计算机基础知识(基础入门小白专属)七
  • Vue3详细讲解
  • Docker+Nginx打包部署前后端分离项目
  • 07.Android之多媒体问题
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • cookie和session
  • GitUp, 你不可错过的秀外慧中的git工具
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • leetcode-27. Remove Element
  • Shadow DOM 内部构造及如何构建独立组件
  • SQLServer之创建数据库快照
  • 对JS继承的一点思考
  • 前端工程化(Gulp、Webpack)-webpack
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 详解移动APP与web APP的区别
  • 一起参Ember.js讨论、问答社区。
  • 智能合约开发环境搭建及Hello World合约
  • k8s使用glusterfs实现动态持久化存储
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​卜东波研究员:高观点下的少儿计算思维
  • #{} 和 ${}区别
  • #13 yum、编译安装与sed命令的使用
  • #Linux(Source Insight安装及工程建立)
  • #pragma once与条件编译
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (WSI分类)WSI分类文献小综述 2024
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • *1 计算机基础和操作系统基础及几大协议
  • .naturalWidth 和naturalHeight属性,