管理后台项目-08-首页使用echarts展示图表数据

news2024/11/20 15:40:20

目录

1-需求页面

 2-头部需求分析

3-中间部分需求分析

3.1-mock数据

3.2-动态渲染数据

4-底部需求分析


1-需求页面

 

 2-头部需求分析

 上面头部有四个card,card分为上中下三部分,其中上都是文字描述和一个小图标;中间部分有文字,折线图,柱状图和类似进度条之类的,中间部分不一样,使用插槽slot进行;下面结构有文字和上下箭头,我们也使用插槽进行。我们将单个card封装为一个组件。

结构代码:

 js和样式代码如下:
 

<script>
export default {
  name: '',
  props:['title','count']
}
</script>

<style scoped>
 .card-header{
    display: flex;
    justify-content: space-between;
    color:#d9d9d9;
 }
.card-content{
  font-size: 30px;
  padding: 10px 0px;
}
.card-charts{
  height: 50px;
}
.card-footer{
  border-top: 1px solid #eee;
  padding-top: 10px;
}
</style>

父组件中使用

card里面使用detail子组件

 第二个card里面需要插入折线图

中间部分折线图,柱状图和进度条使用子组件的形式。

 

 折线图组件:src\views\dashboard\Card\lineChart\index.vue
 

<template>
  <!-- 容器 -->
  <div class="charts" ref="charts"></div>
</template>

<script>
//引入echarts
import echarts from "echarts";
export default {
  name: "",
  mounted() {
    //初始化echarts实例
    let lineCharts = echarts.init(this.$refs.charts);
    //配置数据
    lineCharts.setOption({
      xAxis: {
        //隐藏x轴
        show: false,
        type: "category",
      },
      yAxis: {
        //隐藏y轴
        show: false,
      },
      //系列
      series: [
        {
          type: "line",
          data: [10, 7, 33, 12, 48, 9,29,10,44],
          //拐点的样式的设置
          itemStyle: {
            opacity: 0,
          },
          //线条的样式
          lineStyle: {
            color: "purple",
          },
          //填充颜色设置
          areaStyle: {
            color: {
              type: "linear",
              x: 0,
              y: 0,
              x2: 0,
              y2: 1,
              colorStops: [
                {
                  offset: 0,
                  color: "purple", // 0% 处的颜色
                },
                {
                  offset: 1,
                  color: "#fff", // 100% 处的颜色
                },
              ],
              global: false, // 缺省为 false
            },
          },
        },
      ],
      //布局调试
      grid: {
        left: 0,
        top: 0,
        right: 0,
        bottom: 0,
      },
    });
  },
};
</script>

<style scoped>
.charts {
  width: 100%;
  height: 100%;
}
</style>

柱状图组件:src\views\dashboard\Card\barCharts\index.vue
 

<template>
  <!-- 容器 -->
  <div class="charts" ref="charts"></div>
</template>

<script>
//引入echarts
import echarts from "echarts";
export default {
  name: "",
  mounted() {
    //初始化echarts实例
    let lineCharts = echarts.init(this.$refs.charts);
    //配置数据
    lineCharts.setOption({
      xAxis: {
        //隐藏x轴
        show: false,
        //均分
        type: "category",
      },
      yAxis: {
        //隐藏y轴
        show: false,
      },
      //系列
      series: [
        {
          //图标形式-柱状图
          type: "bar",
          data: [10, 7, 33, 12, 48, 9,29,10,44,33,22,8],
          color:'cyan'
        },
      ],
      //布局调试
      grid: {
        left: 0,
        top: 0,
        right: 0,
        bottom: 0,
      },
      tooltip:{}
    });
  },
};
</script>

<style scoped>
.charts {
  width: 100%;
  height: 100%;
}
</style>

进度条组件:src\views\dashboard\Card\progressCharts\index.vue

<template>
  <!-- 容器 -->
  <div class="charts" ref="charts"></div>
</template>

<script>
//引入echarts
import echarts from "echarts";
export default {
  name: "",
  mounted() {
    //初始化echarts实例
    let lineCharts = echarts.init(this.$refs.charts);
    //配置数据
    lineCharts.setOption({
      xAxis: {
        //隐藏x轴
        show: false,
        //最小值与最大值的设置
        min: 0,
        max: 100,
      },
      yAxis: {
        //隐藏y轴
        show: false,
        //均分
        type: "category",
      },
      //系列
      series: [
        {
          //图标形式-柱状图
          type: "bar",
          data: [78],
          color: "cyan",
          //柱状图的宽度
          barWidth: 10,
          color: "yellowgreen",
          //背景颜色设置
          showBackground: true,
          //设置背景颜色
          backgroundStyle: {
            color: "#eee",
          },
          //文本标签
          label:{
             show:true,
             //改变文本内容
             formatter:'|',
             //文本标签位置调试
             position:'right'
          }
        },
      ],
      //布局调试
      grid: {
        left: 0,
        top: 0,
        right: 0,
        bottom: 0,
      },
    });
  },
};
</script>

<style scoped>
.charts {
  width: 100%;
  height: 100%;
}
</style>


 

3-中间部分需求分析

中间部分分为左侧和右侧两部分,默认展示销售额数据,切换tab的时候要展示访问量的数据;这部分数据我们通过mock来获取,动态展示。

3.1-mock数据

之前的数据我们都是通过请求后端服务器来获取的,现在首页这块数据我们需要通过mock来获取。
1-准备需要mock的数据;新建文件:mock\data.json;
2-由于首页组件嵌套比较多,我们父子传输数据层次多,我们采用vuex来从仓库获取数据。src\store\modules\home.js新建仓库;注册仓库;

 我们发送请求是发送到mock里面
 

 首页挂载完成的时候发送action

3.2-动态渲染数据

销售组件:src\views\dashboard\Sale\index.vue
组件中我们分左右两侧内容,柱状图和排名宽度大小分别占18和6,因为一共是24。默认展示销售额。通过计算和监听来动态渲染数据是销售额还是访问量。

<template>
  <el-card class="box-card" style="margin: 10px 0px">
    <div slot="header" class="clearfix">
      <!--  @tab-click="handleClick" -->
      <!-- 头部左侧内容 -->
      <el-tabs class="tab" v-model="activeName">
        <el-tab-pane label="销售额" name="sale"></el-tab-pane>
        <el-tab-pane label="访问量" name="visite"></el-tab-pane>
      </el-tabs>
      <!-- 头部右侧内容 -->
      <div class="right">
        <span @click="setDay">今日</span><span @click="setWeek">本周</span>
        <span @click="setMonth">本月</span><span @click="setYear">本年</span>
        <!--    v-model="value1" -->
        <el-date-picker
          v-model="date" class="date" type="daterange" range-separator="-"
          start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd">
        </el-date-picker>
      </div>
    </div>
    <div>
      <el-row :gutter="10">
        <el-col :span="18">
          <!-- 容器 -->
          <div class="charts" ref="charts"></div>
        </el-col>
        <el-col :span="6" class="right">
          <h3>门店{{ title }}排名</h3>
          <ul>
            <li>
              <span class="rindex">1</span><span>门店1</span><span class="rvalue">123950</span>
            </li>
            <li>
              <span class="rindex">2</span><span>门店2</span><span class="rvalue">123850</span>
            </li>
            <li>
              <span class="rindex">3</span><span>门店3</span><span class="rvalue">123750</span>
            </li>
            <li>
              <span>4</span><span>门店4</span><span class="rvalue">123650</span>
            </li>
            <li>
              <span>5</span><span>门店5</span><span class="rvalue">123550</span>
            </li>
            <li>
              <span>6</span><span>门店6</span><span class="rvalue">123450</span>
            </li>
            <li>
              <span>7</span><span>门店7</span><span class="rvalue">123350</span>
            </li>
          </ul>
        </el-col>
      </el-row>
    </div>
  </el-card>
</template>

<script>
//引入echarts
import echarts from "echarts";
import dayjs from "dayjs";
import { mapState } from "vuex";
export default {
  name: "",
  data() {
    return {
      activeName: "sale",
      mycharts: null,
      //收集日历数据
      date: [],
    };
  },
  mounted() {
    //初始化echarts实例
    this.mycharts = echarts.init(this.$refs.charts);
    //配置数据
    this.mycharts.setOption({
      title: {
        text: this.title + "趋势",
      },
      tooltip: {
        trigger: "axis",
        axisPointer: {
          type: "shadow",
        },
      },
      grid: {
        left: "3%",
        right: "4%",
        bottom: "3%",
        containLabel: true,
      },
      xAxis: [
        {
          type: "category",
          data: [],
          axisTick: {
            alignWithLabel: true,
          },
        },
      ],
      yAxis: [
        {
          type: "value",
        },
      ],
      series: [
        {
          name: "Direct",
          type: "bar",
          barWidth: "60%",
          data: [],
          color: "yellowgreen",
        },
      ],
    });

    //顶部是mounted:为什么第一次没有数据,没有数据因此不显示
  },
  computed: {
    //计算属性-标题
    title() {
      //重新设置配置项
      return this.activeName == "sale" ? "销售额" : "访问量";
    },
    ...mapState({
      listState: (state) => state.home.list || {},
    }),
  },
  //监听属性
  watch: {
    title() {
      console.log("修改配置数据");
      //重新修改图标的配置数据
      //图标配置数据可以再次修改,如果有新的数值,新的数值,没有新的数值,还是用以前的
      this.mycharts.setOption({
        title: {
          text: this.title,
        },
        xAxis: {
          data:
            this.title == "销售额"
              ? this.listState.orderFullYearAxis
              : this.listState.userFullYearAxis,
        },
        series: [
          {
            name: "Direct",
            type: "bar",
            barWidth: "60%",
            data:
              this.title == "销售额"
                ? this.listState.orderFullYear
                : this.listState.userFullYear,
            color: "yellowgreen",
          },
        ],
      });
    },
    listState(){
     this.mycharts.setOption({
      title: {
        text: this.title + "趋势",
      },
      tooltip: {
        trigger: "axis",
        axisPointer: {
          type: "shadow",
        },
      },
      grid: {
        left: "3%",
        right: "4%",
        bottom: "3%",
        containLabel: true,
      },
      xAxis: [
        {
          type: "category",
          data: this.listState.orderFullYearAxis,
          axisTick: {
            alignWithLabel: true,
          },
        },
      ],
      yAxis: [
        {
          type: "value",
        },
      ],
      series: [
        {
          name: "Direct",
          type: "bar",
          barWidth: "60%",
          data: this.listState.orderFullYear,
          color: "yellowgreen",
        },
      ],
    });

    }
  },
  methods: {
    //本天
    setDay() {
      const day = dayjs().format("YYYY-MM-DD");
      this.date = [day, day];
    },
    //本周
    setWeek() {
      const start = dayjs().day(1).format("YYYY-MM-DD");
      const end = dayjs().day(7).format("YYYY-MM-DD");
      this.date = [start, end];
    },
    //本月
    setMonth() {
      const start = dayjs().startOf("month").format("YYYY-MM-DD");
      const end = dayjs().endOf("month").format("YYYY-MM-DD");
      this.date = [start, end];
    },
    //本年
    setYear() {
      const start = dayjs().startOf("year").format("YYYY-MM-DD");
      const end = dayjs().endOf("year").format("YYYY-MM-DD");
      this.date = [start, end];
    },
  },
};
</script>

<style scoped>
.clearfix {
  position: relative;
  display: flex;
  justify-content: space-between;
}
.tab {
  width: 100%;
}
.right {
  position: absolute;
  right: 0px;
}
.date {
  width: 250px;
  margin: 0px 20px;
}
.right span {
  margin: 0px 10px;
}
.charts {
  width: 100%;
  height: 300px;
}
ul {
  list-style: none;
  width: 100%;
  height: 300px;
  padding: 0px;
}
ul li {
  height: 8%;
  margin: 10px 0px;
}
.rindex {
  float: left;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: black;
  color: white;
  text-align: center;
}
.rvalue {
  float: right;
}
</style>

4-底部需求分析

由于底部左侧的折线图,我们上面已经实现了类似的功能,左侧我们忽略;主要看右侧的饼状图。首先需要展示饼状图,然后鼠标移动上去,显示对应的数据。并且圆圈内部显示对应的文本标题。子组件:src\views\dashboard\Observe\Category\index.vue;

<template>
  <el-card>
    <div slot="header" class="header">
      <div class="category-header">
        <span>销售额类别占比</span>
        <el-radio-group v-model="value">
          <el-radio-button label="全部渠道"></el-radio-button>
          <el-radio-button label="线上"></el-radio-button>
          <el-radio-button label="门店"></el-radio-button>
        </el-radio-group>
      </div>
    </div>
    <div>
      <div class="charts" ref="charts"></div>
    </div>
  </el-card>
</template>

<script>
import echarts from "echarts";
export default {
  name: "",
  data() {
    return {
      value: "全部渠道",
    };
  },
  mounted() {
    //饼图
    let mychart = echarts.init(this.$refs.charts);
    mychart.setOption({
      title: {
        text: "视频",
        subtext: 1048,
        left: "center",
        top: "center",
      },
      tooltip: {
        trigger: "item",
      },
      series: [
        {
          name: "Access From",
          type: "pie",
          radius: ["40%", "70%"],
          avoidLabelOverlap: false,
          itemStyle: {
            borderRadius: 10,
            borderColor: "#fff",
            borderWidth: 2,
          },
          label: {
            show: true,
            position: "outsize",
          },
          labelLine: {
            show: true,
          },
          data: [
            { value: 1048, name: "视频" },
            { value: 735, name: "Direct" },
            { value: 580, name: "Email" },
            { value: 484, name: "Union Ads" },
            { value: 300, name: "Video Ads" },
          ],
        },
      ],
    });
    //绑定事件

    mychart.on("mouseover",(params)=>{
        //获取鼠标移上去那条数据
        const {name,value} = params.data;
        //重新设置标题
        mychart.setOption({
          title:{
            text:name,
            subtext:'value'
          }
        })
    });
  },
};
</script>

<style scoped>
.category-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.header {
  border-bottom: 1px solid #eee;
}
.charts {
  width: 100%;
  height: 300px;
}
</style>


 

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

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

相关文章

达梦数据库管理系统 DM8

检查数据库版本及服务状态 //查看达梦数据库运行状态 SELECT status$ as 状态 FROM v$instance; //查看达梦数据库版本 SELECT banner as 版本信息 FROM v$version;创建用户 //创建用户 CREATE USER DM IDENTIFIED BY "dameng123";授予用户基本权限 使用 GRANT 语…

重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)

重大问题&#xff0c;Windows11出现重大BUG 这种Windows11操作系统出现BUG已经可以说是非常常见的&#xff0c;但是&#xff0c;今天我将代表所有微软用户&#xff0c;解决一个关于UI设计非常不舒服的功能 关闭多平面覆盖 事情叙述问题 微软社区解决方案自己发现的解决方案解决…

[链表OJ题 2] 链表的中间结点 -- 快慢指针找链表的中间节点

目录 题目来源&#xff1a; 代码实现 思路分析&#xff1a; 1.当链表个数为奇数 2.当链表个数为偶数 总结&#xff1a; 题目来源&#xff1a; 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; (leetcode-cn.com) 题目描述&#xff1a; 代码实现 struct Li…

Dart中的factory关键字用法

factory简介 在Dart中,factory关键字用于定义工厂构造函数。它与普通的构造函数有以下几个区别: factory构造函数的调用可以返回子类型或其它类型的实例。普通构造函数总是返回其包含的类型的实例。factory构造函数可以有返回值。普通构造函数的返回值永远是其包含的类型的实…

服务器中了勒索病毒,malox勒索病毒的加密方式及如何应对勒索病毒攻击

随着计算机技术的发展&#xff0c;计算机成为现代人工作和生活中必不可少的电子产品。但随着很多企业和个人用户的信息化建设不断升级&#xff0c;也经常会出现许多恶意软件。其中包括malox勒索病毒&#xff0c;malox勒索病毒是mallox勒索病毒新升级的加密程序&#xff0c;下面…

使用 NutUI 搭建「自定义业务风格」的组件库 | 京东云技术团队

作者&#xff1a;京东零售 佟恩 本文介绍&#xff0c;如何使用 NutUI 组件库&#xff0c;搭建一套为专属业务风格的业务组件库。 NutUI 是一款京东风格的移动端组件库。NutUI 目前支持 Vue 和 React技术栈&#xff0c;支持Taro多端适配。 当下的实现方式 一般组件库&#xff…

Vue最新状态管理工具Pinia——彻底搞懂Pinia是什么

Pinia从了解到实际运用——彻底搞懂什么是Pinia 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现什么是piniapinia相比vuex的优势为什么要使用pinia&#xff1f;基本示例 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09; 知识专栏专栏链接Vuex知…

Nginx 静态文件、反向代理、负载均衡、缓存、SSL/TLS 加密、gzip 压缩 等等

Nginx的功能 1. 静态文件服务器2. 反向代理服务器3. 负载均衡4. 缓存5. SSL/TLS 加密6. URL 重写7. HTTP/28. WebSocket9. 反向代理缓存10. 安全限制11. gzip 压缩12. 请求限速13. 日志记录14. SSL 证书续订 Nginx 是一个高性能的开源 Web 服务器和反向代理服务器&#xff0c;它…

ASEMI代理ADI亚德诺LTC3309AEV#TRMPBF车规级芯片

编辑-Z LTC3309AEV#TRMPBF特点&#xff1a; 与 LTC3307(3A) 和 LTC3308(4A) 引脚兼容 高效率&#xff1a;8mΩ NMOS、31mΩ PMOS 可编程频率 1MHz 至 3MHz 微型电感器和电容器 峰值电流模式控制 22ns 最短接通时间 宽带宽&#xff0c;快速瞬态响应 Silent Switcher 架…

虹科荣誉 | 虹科工业物联网产品荣获中国自动化产业年会用户信赖产品奖!

2023 虹科荣获2021年度中国自动化产业年会用户信赖产品奖 近日&#xff0c;2023中国自动化产业年会于北京隆重举行。虹科工业物联网的产品“OPC UA Tunneller软件”凭借其产品优势和市场美誉度&#xff0c;通过层层选拔&#xff0c;在本次大会中荣获2021年度用户信赖产品奖。…

【c语言】字符串计算长度 | API仿真

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …

AB跳转轮询,让支付收款更加安全

伴随跨境电商行业对出海用户运营精细化的要求愈发严格&#xff0c;移动支付作为一个快速发展的领域&#xff0c;很快就进入了“高台期”&#xff0c;这也意味着市场对于支付环节提出了更多新的要求——不只是能收款&#xff0c;还要收款更智能、服务更全面。 但事实上&#xff…

数据链路层的重点协议

数据链路层的重点协议 &#x1f50e;认识以太网以太网帧格式 &#x1f50e;认识MTU&#x1f50e;结尾 &#x1f50e;认识以太网 “以太网” 不是一种具体的网络, 而是一种技术标准. 既包含了数据链路层的内容, 也包含了一些物理层的内容(例如规定了网络拓扑结构, 访问控制方式…

Windows平台下把Julia语言的程序编译打包为.exe可执行文件

一、创建工程 1.在D盘(其它盘亦可)目录新建一个工程文件&#xff1a;Julia Projects&#xff08;自定义名称&#xff09; 目录即 D:\Julia Projects 2.打开Atom IDE编辑器 --->File--->Add Project Folder...--->选择刚刚新建的文件夹Julia Projects 3.右键Julia P…

评判需求优先级5大规则和方法(纯干货):

在划分用户需求时&#xff0c;需秉承需求任务紧跟核心业务指标&#xff0c;按照一定的规则和方法进行优先级的划分。 常见评判需求优先级规则有&#xff1a;四象限法则、KANO模型、二八原则、产品生命周期法、ROI评估法。 一、四象限法则 四象限法则是以【重要】和【紧急】程度…

OPC UA/DA协议库open62541的win10下,cmake+MinGW/VC编译

目录 一、下载源码 二、编译源码 三、案例编译 3.1 工程目录 3.2 server端 3.3 client端 3.4 程序运行 一、下载源码 win10系统&#xff0c;安装git工具 下载open62541库源码&#xff0c;该源码是MPLv2的License git clone --recursive https://github.com/open62541/open6…

MobileNet(V1、V2、V3)入门

MobileNet 良好的移植性 可以很好的使用在移动设备上做分类、检测、分割等任务 深度可分离卷积&#xff08;v1核心&#xff09; 经典卷积算法中&#xff0c;输入的通道数要和过滤器的保持一致&#xff0c;这样很耗费参数 深度可分离卷积 第一步&#xff1a;有多少个输入&a…

Linux学习记录——이십이 进程信号(1)

文章目录 1、了解信号2、了解信号处理3、信号产生1、键盘按键产生2、系统接口产生3、软件条件产生4、硬件异常 4、Core和Term的区别5、信号保存1、在系统中的表现形式2、信号集操作函数1、sigprocmask2、sigpending 6、重谈地址空间7、信号处理与捕捉sigaction 1、了解信号 信…

数据挖掘、数据分析——异常值处理、归一化处理

数据&#xff1a; # 下载需要用到的数据集 !wget http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/Industrial_Steam_Forecast/zhengqi_test.txt !wget http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/Industrial_Steam_Forecast/zhengqi_train.txt数据异常值分…

【Python】flask实现登录注册

一、jinjia2 1、控制结构 控制结构 Flask中的Jinja2模板提供了多种控制结构&#xff0c;通过这些控制结构可以改变模板的渲染过程。例如&#xff0c;下面展示的条件控制语句。 2、使用flask成功渲染到模板 【首先你要】 首先要创建一个templates目录&#xff0c;这里面放想要渲…