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

news2024/12/26 23:27:25

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分享工作中遇到的问题以及问题解决方法和对项目开发的实际案例总结以及新技术的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#,核心基础算法——完整全面、简单易用、稳定可靠的统计学常用算法之原理介绍、算法精粹与完整的源代码

1、统计学常用算法 统计分析科学 在“政治算术”阶段出现的统计与数学的结合趋势逐渐发展形成了“统计分析科学”。 十九世纪末&#xff0c;欧洲大学开设的“国情纪要”或“政治算数”等课程名称逐渐消失&#xff0c;代之而起的是“统计分析科学”课程。当时的“统计分析科学”…

MongoDB:安装配置

MongoDB有两个服务器版本 &#xff1a;MongoDB 社区版 和 MongoDB 企业版。此篇主要介绍 MacOS 下 MongoDB 社区版的安装&#xff0c;在 “版本” 下拉列表中&#xff0c;选择要下载的 MongoDB 版本&#xff1b;在平台下拉列表中&#xff0c;选择 MacOS。在包下拉列表中&#x…

mysql一主双从环境搭建--docker-compose

mysql一主双从环境搭建–docker-compose 一、工作目录结构 ├── cluster01 │ ├── msql-master01 │ │ └── volumes │ │ ├── conf │ │ │ └── my.cnf │ │ ├── data │ │ ├── initdb │ │ │ …

基础数学(六)——非线性方程求根的数值解法

文章目录期末考核方式求解的一般步骤二分法求根二分法计算样例二分法的优缺点不动点迭代法全局收敛准则收敛性证明样例局部收敛性收敛阶数的定义迭代法具体例题&#xff08;考试必考&#xff09;牛顿迭代法例题&#xff08;使用牛顿法近似目标解&#xff09;&#xff08;考过&a…

Gem5模拟器,FS模式运行自定义程序(九)

FS模拟和SE模拟最大的区别是&#xff1a;FS模拟会启动Linux操作系统&#xff0c;会模拟系统的所有组件。因此需要给系统配置相应的Linux内核以及磁盘镜像&#xff0c;镜像文件作为Linux系统的文件系统。在FS模拟下&#xff0c;使用gem5自带的python脚本configs/example/fs.py。…

从umati 看德国人如何玩OPCUA的

到目前为止&#xff0c;机器的联网标准缺乏统一的协议和语义标准。比较知名的要数每个的MTConnect。fanuc机床的focas协议。未来的发展方向是OPCUA协议。但是实现这个目标并非一日之功。德国的umati 社区也许给我们一些启发。 为了推进机床行业的数字化进程&#xff0c;VDW&…

从2022看2023年发展趋势

前言 时光荏苒&#xff0c;回望即将过去的2022年&#xff0c;前端领域在这一年中整体还是保持平稳向前&#xff0c;但对整个IT产业链路及互联网行业来说&#xff0c;变化还是很大的&#xff0c;下面我将简单分享一下个人对整个行业领域的一些观点与思考。鄙人才疏学浅&#xf…

Linux | 从头开始理解Linux以及工作日常常用命令

Linux的版本 分很多种&#xff0c;家庭用途版本有&#xff1a;Linux Mint、Ubuntu、OpenSUSE、Fedora、PC-BSD&#xff1b;商业用途版本有&#xff1a;Debian、RHEL、CentOS&#xff1b;还有其他版本&#xff1a;FreeBSD、OpenBSD、Solaris、OpenSolaris等。 目录 1.操作系统…

QT学习 控件(三)输入文本类与快捷键:QPlainText;QKeySequenceEdit

文章目录QPlainTextQKeySequenceEdit前情回顾&#xff1a; QLineEit QTextEdit文本输入类 QPlainTextEdit是一个简略版本的类&#xff0c;它的性能优于QTextEdit, 主要是因为在文本文档中使用QPlainTextDocumentLayout简化文本布局 QPlainText QPlainText和QTextEdit大致功能…

Dijkstra求最短路(堆优化)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从1 号点走到 n 号点&#xff0c;则输出 −1。 输入格式 第一行包含整数 n 和 m。 接下来 m 行每行包含三个整…

力扣刷题记录——205.同构字符串、217. 存在重复元素、283. 移动零

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《205.同构字符串、217. 存在重复元素、283. 移动零》。 目…

(十四)大白话磁盘文件中, 40个bit位的数据头以及真实数据是如何存储的?

文章目录 1、前情回顾2、详解40个bit位数据头1、前情回顾 之前我们已经给大家讲到了在磁盘上存储数据的时候, 每一行数据都会有变长字段长度列表,逆序存放这行数据里的变长字段的长度,然后会有NULL值列表,对于允许为NULL的字段都会有一个bit位标识那个字段是否为NULL,也是…

shell第五天作业——函数与数组

题目 一、编写函数&#xff0c;实现打印绿色OK和红色FAILED 二、编写函数&#xff0c;实现判断是否有位置参数&#xff0c;如无参数&#xff0c;提示错误 三、编写函数实现两个数字做为参数&#xff0c;返回最大值 四、编写函数&#xff0c;实现两个整数为参数&#xff0c;…

状态压缩DP——最短Hamilton路径

状态压缩DP——最短Hamilton路径一、题目描述二、思路分析1、状态转移方程&#xff08;1&#xff09;状态表示——状态压缩&#xff08;2&#xff09;状态转移2、循环和初始化&#xff08;1&#xff09;循环设计&#xff08;2&#xff09;初始化三、代码实现一、题目描述 二、思…

(day1)自学java基础

非原创&#xff0c;记录学习过程&#xff0c;为方便自己后期复习 目录 1.Java基础概念 2.运算符 3.判断 4.循环 5.循环高级 6.数组 7.数组的内存图 8.方法 ctrlaltL 自动格式化代码 为什么要配置环境变量&#xff1f; 我们想在任意目录都可以打开指定软件&#xff0c;就…

DDR3 数据传输(四)

目录 引言 AXI从侧接口参数 AXI从侧接口信号 参考说明 引言 前文链接&#x

巧用网络指数

哈喽&#xff0c;好久不见&#xff01;今天我们来一起聊聊网络指数。网络指数平台是以网民在线使用行为数据为基础&#xff0c;借助关键词表达的重要信息检索渠道&#xff0c;一定程度上可以反映某一话题的关注度&#xff0c;也可以帮助我们抓住所谓的“热点”。这里&#xff0…

源码编译mindspore,利用云服务器与wsl

文章目录tmux的使用利用WSL2设置交换空间通过编译产生的output安装tmux的使用 参考&#xff1a;https://blog.csdn.net/weixin_43922901/article/details/89230499 参考&#xff1a;http://www.ruanyifeng.com/blog/2019/10/tmux.html tmux用于远程编译&#xff0c;开启一个会…

2023第一天,给你们展示一下用Python实现自动答题

前言 python实现自动答题&#xff1f; 别管&#xff0c;我这就给你们展示一下 &#xff08;效果图看不了 不知道为什么说我违gui&#xff09;&#x1f625; 话不多说&#xff0c;咱就直接看代码吧 代码 准备模块 import requests import parsel from selenium import webd…

create-vite 源码解析它来喽

create-vite的源码很简单&#xff0c;只有一个文件&#xff0c;代码总行数400左右&#xff0c;但是实际需要阅读的代码大约只有200行左右&#xff0c;废话不多说&#xff0c;直接开始吧。 代码结构 create-vite的代码结构非常简单&#xff0c;直接将index.ts拉到最底下&#…