【前端】Vue+Element UI案例:通用后台管理系统-Echarts图表:折线图、柱状图、饼状图

news2024/11/26 20:31:08

文章目录

    • 目标
    • 代码
      • 数据改写为动态
      • Echarts引入与html结构
      • 折线图:orderData
      • 柱状图:userData
      • 饼状图:videoData
    • 总效果
    • 总代码:Home.vue

上一篇:【前端】Vue+Element UI案例:通用后台管理系统-Echarts图表准备:axios封装、mock数据模拟实战

目标

在这里插入图片描述

  • 左边:把代码中写死的数据改成mock模拟的数据
  • 右边三个图:折线图,柱状图,饼状图

代码

数据改写为动态

上一篇中我们在mockData中有一个tableData,就是它了!
在这里插入图片描述

export default {
    data() {
        return {
            TableData:[],
            TableLabel,
            CountData
        }
    },
    mounted(){
        getData().then((data)=>{
            console.log(data);
            this.TableData=data.data.getStatisticalData.data.tableData
        })
    }
}

效果:
在这里插入图片描述

Echarts引入与html结构

文档:echarts文档

安装:

npm i echarts@5.1.2

引入:

import * as echarts from 'echarts'

html结构:

  • 三个图标都是卡片,所以都在el-card
  • 用ref引入echarts图表,且里面一定要有height或width,否则不显示
  • 注意向左的间距
  • 柱状图和饼状图的横向排列:flex+space between
<!-- echarts图表 -->
<div style="margin-left:20px">
   <!-- 折线图 -->
   <el-card style="height:280px">
       <div ref="echarts1" style="height:280px"></div>
   </el-card>
   <div class="graph">
       <!-- 柱状图 -->
       <el-card style="height:260px">
           <div ref="echarts2" style="height:260px"></div>
       </el-card>
       <!-- 饼状图 -->
       <el-card style="height:260px">
           <div ref="echarts3" style="height:260px"></div>
       </el-card>
   </div>
</div>

css:

.graph {
    display: flex;
    // 两个靠边
    justify-content: space-between;
    margin-top: 20px;

    .el-card {
        width: 49%;
    }
}

效果:就是这样~
在这里插入图片描述

折线图:orderData

文档中模板的代码如下:虽然模板的代码是柱状图,而我们这里要做的事折线图,但我们可以通过模板来了解配置与其对应的效果。

// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));

// 指定图表的配置项和数据
var option = {
  title: {
    text: 'ECharts 入门示例'
  },
  tooltip: {},
  legend: {
    data: ['销量']
  },
  xAxis: {
    data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
  },
  yAxis: {},
  series: [
    {
      name: '销量',
      type: 'bar',
      data: [5, 20, 36, 10, 10, 20]
    }
  ]
};

// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);

效果如下 :
在这里插入图片描述
配置关系如下:具体可以看文档。
在这里插入图片描述
而series对应的是鼠标悬浮在柱上时的显示:
在这里插入图片描述

接下来写折线图。

观察一下数据:红框内的是x轴,也就是xAxis,series.name,1013这样的每一个数据都是series.data。
在这里插入图片描述

已经配置好的属性:

const order = {
    legend: {
        // 图例文字颜色
        textStyle: {
            color: "#333",
        },
    },
    grid: {
        left: "20%",
    },
    // 提示框
    tooltip: {
        trigger: "axis",
    },
    xAxis: {
        type: "category", // 类目轴
        data: [],
        axisLine: {
            lineStyle: {
                color: "#17b3a3",
            },
        },
        axisLabel: {
            interval: 0,
            color: "#333",
        },
    },
    yAxis: [
        {
            type: "value",
            axisLine: {
                lineStyle: {
                    color: "#17b3a3",
                },
            },
        },
    ],
    color: ["#2ec7c9", "#b6a2de", "#5ab1ef", "#ffb980", "#d87a80", "#8d98b3"],
    series: [],
}

export default order

我们这里必须配置(自己配置)的属性有:legendxAxisyAxisseries

mounted() {
   getData().then((data) => {
       console.log(data);
       this.TableData = data.data.getStatisticalData.data.tableData

       // echarts图表

       // 折线图

       // 基于准备好的dom,初始化echarts实例
       const echarts1 = echarts.init(this.$refs.echarts1)
       var echarts1Option = {}
       // ES6解构语法
       var { orderData, userData, videoData } = data.data.getStatisticalData.data

       // 获取x轴:要求是一个对象
       const xAxis = Object.keys(orderData.data[0])
       const xAxisData = {
           data: xAxis
       }

       // 配置
       echarts1Option.legend = xAxisData
       echarts1Option.xAxis = xAxisData
       echarts1Option.yAxis = {}
       echarts1Option.series = []

       // 配置series
       xAxis.forEach(key => {
           echarts1Option.series.push({
               name: key,
               type: 'line',
               // key对应的orderData的所有值
               data: orderData.data.map(item => item[key])
           })
       })

       // 使用刚指定的配置项和数据显示图表。
       echarts1.setOption(echarts1Option);
   })
}

效果:
在这里插入图片描述

柱状图:userData

接下来的操作就很类似了。

基础代码:

// 柱状图
const echarts2 = echarts.init(this.$refs.echarts2)
var echarts2Option = user
echarts2.setOption(echarts2Option);

已经配置好的属性:

const user = {
    legend: {
        // 图例文字颜色
        textStyle: {
            color: "#333",
        },
    },
    grid: {
        left: "20%",
    },
    // 提示框
    tooltip: {
        trigger: "axis",
    },
    xAxis: {
        type: "category", // 类目轴
        data: [],
        axisLine: {
            lineStyle: {
                color: "#17b3a3",
            },
        },
        axisLabel: {
            interval: 0,
            color: "#333",
        },
    },
    yAxis: [
        {
            type: "value",
            axisLine: {
                lineStyle: {
                    color: "#17b3a3",
                },
            },
        },
    ],
    color: ["#2ec7c9", "#b6a2de"],
    series: [],
}

export default user

user缺什么,我们这里就配置什么:xAxis.dataseries.

显然xAxis.data是date的value:series会有两个,分别是new和active。
在这里插入图片描述

// 柱状图
const echarts2 = echarts.init(this.$refs.echarts2)
var echarts2Option = user

// 配置
echarts2Option.xAxis.data = userData.map(item => item.date)
echarts2Option.series = [
    {
        name: '新增用户',
        data: userData.map(item => item.new),
        // 类型:bar是柱状图 
        type:'bar'
    }
    ,
    {
        name: '活跃用户',
        data: userData.map(item => item.active),
        type:'bar'
    }
]

echarts2.setOption(echarts2Option);

效果:
在这里插入图片描述

饼状图:videoData

配置:

const video = {
    tooltip: {
        trigger: "item",
    },
    color: [
        "#0f78f4",
        "#dd536b",
        "#9462e5",
        "#a6a6a6",
        "#e1bb22",
        "#39c362",
        "#3ed1cf",
    ],
    series: [],
}

export default video

我们只需要自己配series

// 饼状图
const echarts3 = echarts.init(this.$refs.echarts3)
var echarts3Option = video
echarts3Option.series = {
    data: videoData,
    type: 'pie'
}
echarts3.setOption(echarts3Option);

效果:
在这里插入图片描述

总效果

在这里插入图片描述

总代码:Home.vue

本篇新建的文件和文件夹如红框所示,代码已放在文中。
有更改的问价如橙框所示,代码如下。
在这里插入图片描述

<template>
    <el-row>
        <el-col :span="8">
            <!-- user卡片 -->
            <el-card>
                <div class="user">
                    <img src="../assets/images/user.png" alt="">
                    <div class="userInfo">
                        <p div class="name">Admin</p>
                        <p div class="access">超级管理员</p>
                    </div>
                </div>
                <div class="loginInfo">
                    <p>上次登录时间:<span>2021-7-19</span></p>
                    <p>上次登陆地点:<span>武汉</span></p>
                </div>
            </el-card>
            <!-- table卡片 -->
            <el-card style="margin-top: 20px;">
                <el-table :data="TableData" style="width: 100%">
                    <!-- 这里的val,key对应的是对象里的 -->
                    <el-table-column v-for="(value, key) in TableLabel" :prop="key" :label="value">
                    </el-table-column>
                </el-table>
            </el-card>
        </el-col>
        <el-col :span="16">
            <div class="num">
                <el-card v-for="item in CountData" :key="item.name" :body-style="{ display: 'flex', padding: 0 }">
                    <i class="icon" :class="`el-icon-${item.icon}`" :style="{ backgroundColor: item.color }"></i>
                    <div class="details">
                        <p class="price">{{ priceFormate(item.value) }}</p>
                        <p class="desc">{{ item.name }}</p>
                    </div>
                </el-card>
            </div>
            <!-- echarts图表 -->
            <div style="margin-left:20px">
                <!-- 折线图 -->
                <el-card style="height:280px">
                    <div ref="echarts1" style="height:280px"></div>
                </el-card>
                <div class="graph">
                    <!-- 柱状图 -->
                    <el-card style="height:280px">
                        <div ref="echarts2" style="height:280px"></div>
                    </el-card>
                    <!-- 饼状图 -->
                    <el-card style="height:320px">
                        <div ref="echarts3" style="height:320px"></div>
                    </el-card>
                </div>
            </div>
        </el-col>
    </el-row>
</template>

<script>
import TableLabel from '../data/TableLabel'
import CountData from '../data/CountData'
import { getData } from '../api/index'
import * as echarts from 'echarts'

// echarts的配置数据
import order from '../data/echartsData/order'
import user from '../data/echartsData/user'
import video from '../data/echartsData/video'

export default {
    data() {
        return {
            TableData: [],
            TableLabel,
            CountData
        }
    },
    methods: {
        priceFormate(price) {
            return "¥" + price
        }
    },
    mounted() {
        getData().then((data) => {
            console.log(data);
            this.TableData = data.data.getStatisticalData.data.tableData

            // echarts图表

            // 折线图

            // 基于准备好的dom,初始化echarts实例
            const echarts1 = echarts.init(this.$refs.echarts1)
            var echarts1Option = order
            // ES6解构语法
            var { orderData, userData, videoData } = data.data.getStatisticalData.data

            // 获取x轴:要求是一个对象
            const xAxis = Object.keys(orderData.data[0])
            const xAxisData = {
                data: xAxis
            }

            // 配置
            echarts1Option.legend = xAxisData
            echarts1Option.xAxis = xAxisData
            echarts1Option.yAxis = {}
            echarts1Option.series = []

            // 配置series
            xAxis.forEach(key => {
                echarts1Option.series.push({
                    name: key,
                    type: 'line',
                    // key对应的orderData的所有值
                    data: orderData.data.map(item => item[key])
                })
            })

            // 使用刚指定的配置项和数据显示图表。
            echarts1.setOption(echarts1Option);

            // 柱状图
            const echarts2 = echarts.init(this.$refs.echarts2)
            var echarts2Option = user

            // 配置
            echarts2Option.xAxis.data = userData.map(item => item.date)
            echarts2Option.series = [
                {
                    name: '新增用户',
                    data: userData.map(item => item.new),
                    // 类型:bar是柱状图 
                    type: 'bar'
                }
                ,
                {
                    name: '活跃用户',
                    data: userData.map(item => item.active),
                    type: 'bar'
                }
            ]

            echarts2.setOption(echarts2Option);

            // 饼状图
            const echarts3 = echarts.init(this.$refs.echarts3)
            var echarts3Option = video
            echarts3Option.series = {
                data: videoData,
                type: 'pie'
            }
            echarts3.setOption(echarts3Option);
        })
    }
}
</script>

<style lang="less" scoped>
.user {
    // 垂直居中
    display: flex;
    align-items: center;

    // 外边距:分割线距离loginInfo的距离
    margin-bottom: 20px;
    // 内边距:分割线距离User的距离
    padding-bottom: 20px;
    border-bottom: 1px solid #ccc;

    img {
        width: 150px;
        height: 150px;
        border-radius: 50%;
        margin-right: 40px;
    }

    .userInfo {
        .name {
            font-size: 32px;
            margin-bottom: 10px;
        }

        .access {
            color: #999999;
        }
    }
}

.loginInfo {
    p {
        line-height: 28px;
        font-size: 14px;
        color: #999999;

        span {
            color: #666666;
            margin-left: 60px;
        }
    }
}

.num {
    display: flex;
    // 要换行
    flex-wrap: wrap;
    // 从头到尾均匀排列
    justify-content: space-between;
    margin-left: 20px;

    .el-card {
        width: 32%;
        margin-bottom: 20px;

        .icon {
            width: 80px;
            height: 80px;
            line-height: 80px;
            text-align: center;
            font-size: 30px;
            color: #fff;
        }

        .details {
            // 竖着排且居中
            display: flex;
            flex-direction: column;
            justify-content: center;

            margin-left: 15px;

            .price {
                font-size: 30px;
                margin-bottom: 10px;
                line-height: 30px;
                height: 30px;
            }

            .desc {
                font-size: 14px;
                color: #999;
                text-align: center;
            }
        }
    }
}

.graph {
    display: flex;
    // 两个靠边
    justify-content: space-between;
    margin-top: 20px;

    .el-card {
        width: 49%;
    }
}
</style>

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

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

相关文章

公司缺人自己搞了vue又搞koa,熬夜把架子搭起来

如果有一天&#xff0c;人手紧缺&#xff0c;自己搞了前端还要搞服务端&#xff0c;今天我们把这个项目架子搭起来&#xff0c;让前端同学也可以轻松全栈开火。 技多不压身&#xff0c;活儿多了可压身啊 目录 一、上午写VUE 1、 新建一个我们的伟大项目文件夹 2、用vscode打…

程序中断方式

中断的基本概念 程序中断是指在计算机执行现行程序的过程中&#xff0c;出现某些急需处理的异常情况或特殊请求&#xff0c;CPU暂时中止现行程序&#xff0c;而转去对这些异常情况或特殊请求进行处理&#xff0c;在处理完毕后CPU又自动返回到现行程序的断点处&#xff0c;继续…

c语言之“数组”初级篇

前言 牛牛又和大家见面了&#xff0c;本篇牛牛要讲的内容是c语言中有关数组的内容。 欢迎大家一起学习&#xff0c;共同进步。 目录前言数组一、一维数组1.1 一维数组的创建1.2 一维数组的初始化1.3 一维数组的应用1.4 一维数组的存储二、二维数组2.1 二维数组创建2.2 二维数…

MySQL的select语句

SQL概述 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展起来的互联网已经自成江湖。在这几十年里&#xff0c;无数的技术、产业在这片江湖里沉浮&#xff0c;有的方兴未艾&#xff0c;有的已经几幕兴衰。但在这片浩荡的波…

基于android的车辆违章停放执法移动APP(ssm+uinapp+Mysql)-计算机毕业设计

车辆违章停放执法移动APP的功能已基本实现&#xff0c;主要实现首页&#xff0c;个人中心&#xff0c;市民管理&#xff0c;警察管理&#xff0c;罚单信息管理&#xff0c;缴费通知管理&#xff0c;系统管理等功能的操作系统。 论文主要从系统的分析与设计、数据库设计和系统的…

【机器学习】回归的原理学习与葡萄酒数据集的最小二乘法线性回归实例

文章目录一&#xff0c;回归1.1回归分析的基本概念1.2线性回归1.3最小二乘法1.4一元(简单)线性回归模型1.4.1随机误差项(线性回归模型)的假定条件1.4.2参数的普通最小二乘估计(0LS)1.5葡萄酒数据集的最小二乘法线性回归实例一&#xff0c;回归 1.1回归分析的基本概念 回归分析…

前端一面经典vue面试题总结

一般在哪个生命周期请求异步数据 我们可以在钩子函数 created、beforeMount、mounted 中进行调用&#xff0c;因为在这三个钩子函数中&#xff0c;data 已经创建&#xff0c;可以将服务端端返回的数据进行赋值。 ​ 推荐在 created 钩子函数中调用异步请求&#xff0c;因为在…

受激拉曼散射计量【Stimulated-Raman-Scattering Metrology】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

单元测试的时候读不到resources.test中配置

背景 接手了几个老工程&#xff0c;跑单元测试的时候&#xff0c;发现数据库的配置总是走了dev环境&#xff0c; 原因是工程中分环境进行了db的配置 历史经验 指定本地环境 ActiveProfiles(“test”) 没有生效 解决 在pom文件中 新加如下配置 <build><!--单元测…

Java—类加载机制

类加载机制 我们多次提到了类加载器ClassLoader&#xff0c;本章就来详细讨论Java中的类加载机制与ClassLoader。 类加载器ClassLoader就是加载其他类的类&#xff0c;它负责将字节码文件加载到内存&#xff0c;创建Class对象。与之前介绍的反射、注解和动态代理一样&#xf…

奶制品数据可视化,去年全国奶制品产量高达3778万吨,同比增长7.1%

奶制品是生活中很常见的一种补充人体所需维生素和矿物质元素的重要食品&#xff0c;在生活中奶制品也是很常见的&#xff0c;食用最多的是牛奶。牛奶中含有非常丰富的钙质&#xff0c;睡前适当给孩子食用&#xff0c;可以补充孩子所需的钙质从而达到长高的效果。 很多小伙伴经常…

C++ 类和对象以及内存管理 练习错题总结

作者&#xff1a;小萌新 专栏&#xff1a;C初阶作业 简介&#xff1a;大二学生 希望能和大家一起进步 本篇博客介绍&#xff1a;对于我们上一周学的知识做一个总结 查缺补漏 C 类和对象以及内存管理练习类和对象 (上)拷贝构造函数类和对象&#xff08;中&#xff09;重载函数运…

MySQL 主从复制与读写分离

一 概念 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) &#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要读写分离 因为数据库的“写…

刷题笔记之九(查找输入整数二进制中1的个数+完全数计算+杨辉三角的变形+计算某字符出现次数)

目录 1. 聚合查询是进行行与行的运算合并&#xff0c;是不能和别的列放在一块查询 2. PHP数据库查询语句 3. 有group by时先执行where&#xff0c;后执行having 4. join常用两张表内连接和外连接&#xff0c;用一张表可以自连接 5. 删除数据用delete&#xff0c;删除表时…

python基于PHP+MySQL汽车展览会系统

随着我国交通事业的发展,汽车已经逐渐的成为了人们主要的代步工具之一,但是如何从众多品牌和型号的车海中选择最适合自己的那款车是很多购车人士一直以来关系的问题。为了方便车主更好的选择自己的车辆很多汽车经销商会不定期的举办一些车展来展销自己的车辆,同时也给购车用户提…

2022 “行业寒冬”,给在座的测试人一些涨薪建议

10 月 24 日&#xff0c;Python 官方发布了最新的 3.11 版本&#xff0c;新的版本速度提升2倍&#xff0c;以弥补与其他编程语言在速度上的缺陷。可以预见Python语言在未来的应用范围会越来越广。 会Python语言能细分出许多从业方向&#xff0c;其中随着互联网的发展&#xff…

Python_Numpy库的ndarray对象的属性有哪些?如何获取它们的值?

Python_Numpy库的ndarray对象的属性有哪些?如何获取它们的值? Python_Numpy库的ndarray对象的常用属性有如下这些&#xff1a; ndim—矩阵的维度&#xff1b; shape—矩阵的形状&#xff1b; size—矩阵的元素个数&#xff1b; dtype—矩阵元素的数据类型&#xff1b; T-矩阵…

【Transformers】第 1 章 :Hello Transformers

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Stream流总结

前言 在Java中&#xff0c;涉及到对数组、Collecction等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的方式进行逐个处理&#xff0c;或者使用Stream流的方式进行处理 例子 从给定句子中返回单词长度大于5的单词列表&#xff0c;按长度倒序输出&#xff0c;最多返…

算法入门 | 分治策略

目录 分治策略 1.分治法可以解决的问题特征 2.分治法解题步骤 3.分治法编程举例 递归求阶乘 求斐波那契数列 小练习&#xff1a;给出一个数n&#xff0c;打印其每一位 分治策略 1.分治法可以解决的问题特征 &#xff08;1&#xff09;问题规模缩小到一定程度就可以轻易…