ECharts接收dataset类型数据封装各类型图形组件

news2025/1/16 7:57:58

数据平台整合matabase图表,调用matabase已有接口使用echarts实现图表展示

目标

将各类型图形独立封装为组件
将多个组件整体封装成一个组件
使用时只需传入组件名和对应数据即可

展示

在这里插入图片描述

数据格式

ECharts中dataset配置
在这里插入图片描述

公共组件

在这里插入图片描述

示例饼图 pie-chart

在这里插入图片描述

pie-chart common.js

let commonOption = {
  title: {
    text: '标题',
  },
  legend: {},
  tooltip: {
    trigger: 'item',
  },
  toolbox: {
    show: true,
    feature: {
      saveAsImage: { show: true },
    },
  },
  dataset: {
    dimensions: [],
    source: [],
  },
  // grid: {
  //   top:"0",
  //   bottom: '0',
  //   containLabel: true,
  // },
  series: [
    {
      type: 'pie',
      radius: ['40%', '70%'],
      // center: ['50%', '25%'],
      // label: {
      //   formatter: '{b}: {@2013} ({d}%)',
      // },
      encode: {
        itemName: 'product',
        value: '2013',
        tooltip: [0, 1],
      },
    },
  ],
}
export { commonOption }

pie-chart options.js

import { commonOption } from './common'
import { deepCopy } from '@utils/index'
function getOption(requestData, cardData) {
  console.log('饼图CbnPieChart')
  console.log('requestData', requestData)
  console.log('cardData', cardData)
  let option = deepCopy(commonOption)
  // 数组数据对应字段名
  option.dataset.dimensions = requestData.cols
  // 二维数组数据
  option.dataset.source = requestData.rows
  // 左上角标题
  option.title.text = cardData.name
  // 维度
  let itemName = cardData.visualization_settings['pie.dimension']
  // 衡量标准
  let value = cardData.visualization_settings['pie.metric']
  // 设置series
  option.series = [
    {
      type: 'pie',
      radius: ['40%', '70%'],
      encode: {
        itemName: itemName,
        value: value,
        tooltip: Array.from(Array(requestData.cols.length), (v, k) => k),
      },
    },
  ]
  return option
}
export { getOption }

pie-chart index.vue

<template>
  <div class="chart-box">
    <div class="chart" ref="chart"></div>
  </div>
</template>

<script>
import { getOption } from './option'
import ChartShow from '@mixins/chart-show'
export default {
  name: 'CbnPieChart',
  mixins: [ChartShow(getOption)],
}
</script>
<style lang="scss" scoped>
.chart-box {
  width: 100%;
  height: 100%;

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

展示饼图

<div style="width: 100%; height: 800px">
      <cbn-chart :myComponent="myComponent8"></cbn-chart>
</div>
    
import CbnChart from '@components/cbn-chart'
import { data as data8, cardData as cardData8 } from './pieData'
components: {
    CbnChart,
  },
myComponent8: {
        componentName: 'CbnPieChart',
        requestData: data8.data,
        cardData: cardData8,
 },

pieData.js

let data = {
  data: {
    rows: [
      [42, 'Doohickey'],
      [51, 'Gizmo'],
      [53, 'Gadget'],
      [54, 'Widget'],
    ],
    cols: [
      {
        display_name: 'NUM',
        source: 'native',
        field_ref: ['field', 'NUM', { 'base-type': 'type/BigInteger' }],
        name: 'NUM',
        base_type: 'type/BigInteger',
        effective_type: 'type/BigInteger',
      },
      {
        display_name: 'CATEGORY',
        source: 'native',
        field_ref: ['field', 'CATEGORY', { 'base-type': 'type/Text' }],
        name: 'CATEGORY',
        base_type: 'type/Text',
        effective_type: 'type/Text',
      },
    ],
    native_form: {
      query: 'select count(id) num, category from products group by category',
      params: null,
    },
    results_timezone: 'Asia/Shanghai',
    results_metadata: {
      columns: [
        {
          display_name: 'NUM',
          field_ref: ['field', 'NUM', { 'base-type': 'type/BigInteger' }],
          name: 'NUM',
          base_type: 'type/BigInteger',
          effective_type: 'type/BigInteger',
          semantic_type: null,
          fingerprint: {
            global: { 'distinct-count': 4, 'nil%': 0.0 },
            type: {
              'type/Number': {
                min: 42.0,
                q1: 46.5,
                q3: 53.5,
                max: 54.0,
                sd: 5.477225575051661,
                avg: 50.0,
              },
            },
          },
        },
        {
          display_name: 'CATEGORY',
          field_ref: ['field', 'CATEGORY', { 'base-type': 'type/Text' }],
          name: 'CATEGORY',
          base_type: 'type/Text',
          effective_type: 'type/Text',
          semantic_type: null,
          fingerprint: {
            global: { 'distinct-count': 4, 'nil%': 0.0 },
            type: {
              'type/Text': {
                'percent-json': 0.0,
                'percent-url': 0.0,
                'percent-email': 0.0,
                'percent-state': 0.0,
                'average-length': 6.5,
              },
            },
          },
        },
      ],
    },
    insights: null,
  },
  database_id: 1,
  started_at: '2023-01-14T14:53:22.235+08:00',
  json_query: {
    constraints: { 'max-results': 10000, 'max-results-bare-rows': 2000 },
    type: 'native',
    middleware: { 'js-int-to-string?': true, 'ignore-cached-results?': false },
    native: {
      query: 'select count(id) num, category from products group by category',
      'template-tags': {},
    },
    database: 1,
    'async?': true,
    'cache-ttl': null,
  },
  average_execution_time: null,
  status: 'completed',
  context: 'dashboard',
  row_count: 4,
  running_time: 5,
}
let cardData = {
  description: null,
  archived: false,
  collection_position: null,
  table_id: null,
  result_metadata: [
    {
      display_name: 'CATEGORY',
      field_ref: [
        'field',
        'CATEGORY',
        {
          'base-type': 'type/Text',
        },
      ],
      name: 'CATEGORY',
      base_type: 'type/Text',
      effective_type: 'type/Text',
      semantic_type: null,
      fingerprint: {
        global: {
          'distinct-count': 4,
          'nil%': 0.0,
        },
        type: {
          'type/Text': {
            'percent-json': 0.0,
            'percent-url': 0.0,
            'percent-email': 0.0,
            'percent-state': 0.0,
            'average-length': 6.5,
          },
        },
      },
    },
    {
      display_name: 'NUM',
      field_ref: [
        'field',
        'NUM',
        {
          'base-type': 'type/BigInteger',
        },
      ],
      name: 'NUM',
      base_type: 'type/BigInteger',
      effective_type: 'type/BigInteger',
      semantic_type: null,
      fingerprint: {
        global: {
          'distinct-count': 4,
          'nil%': 0.0,
        },
        type: {
          'type/Number': {
            min: 42.0,
            q1: 46.5,
            q3: 53.5,
            max: 54.0,
            sd: 5.477225575051661,
            avg: 50.0,
          },
        },
      },
    },
  ],
  database_id: 1,
  enable_embedding: false,
  collection_id: null,
  query_type: 'native',
  name: 'product-bing',
  query_average_duration: 3,
  creator_id: 5,
  moderation_reviews: [],
  updated_at: '2023-01-14T17:26:07.853',
  made_public_by_id: null,
  embedding_params: null,
  cache_ttl: null,
  dataset_query: {
    type: 'native',
    native: {
      query: 'select category ,count(id) num from products group by category',
      'template-tags': {},
    },
    database: 1,
  },
  id: 37,
  display: 'pie',
  visualization_settings: {
    'pie.show_legend_perecent': true,
    'pie.colors': {
      Doohickey: '#509EE3',
      Gadget: '#F9D45C',
      Gizmo: '#A989C5',
      Widget: '#F2A86F',
    },
    'pie.dimension': 'CATEGORY',
    'pie.metric': 'NUM',
    'table.pivot_column': 'CATEGORY',
    'table.cell_column': 'NUM',
  },
  dataset: false,
  created_at: '2023-01-14T14:11:42.502',
  public_uuid: null,
}
export { data, cardData }

公共index.js

批量获取组件导入整体组件

// 自动加载
const componentsContext = require.context('./', true, /(index\.vue)$/)

let components = {}

componentsContext.keys().forEach((component) => {
  const componentConfig = componentsContext(component)
  components[componentConfig.default.name] = componentConfig.default
})

export const importComponents = components

整体组件index.vue

<template>
  <div class="charts">
    <component v-if="myComponent" :is="myComponent.componentName" v-bind="myComponent" />
  </div>
</template>

<script>
import { importComponents } from './components/index'
export default {
  name: 'Chart',
  components: {
    ...importComponents,
  },
  props: {
    myComponent: {
      type: Object,
      default: function () {
        return null
      },
    },
  },
}
</script>
<style lang="scss" scoped>
.charts {
  width: 100%;
  height: 100%;
}
</style>

mixins写一个混入方法,将公共代码提取出来 chart-show.js

import '@components/cbn-chart/theme-walden.js'
export default function (getOption) {
  return {
    props: {
      requestData: {
        type: Object,
        default: () => {
          return {}
        },
      },
      cardData: {
        type: Object,
        default: () => {
          return {}
        },
      },
    },
    data() {
      return {
        myChart: null,
        option: null,
      }
    },
    mounted() {
      this.reloadChart()
      window.addEventListener('resize', () => {
        this.reloadChart()
      })
    },
    beforeDestroy() {
      this.disposeChart()
    },
    methods: {
      drawChart() {
        this.option = getOption(this.requestData, this.cardData)
        let chartDom = this.$refs.chart
        this.$nextTick(() => {
          this.myChart = this.$echarts.init(chartDom, 'walden')
          this.myChart.setOption(this.option)
          this.myChart.resize()
        })
      },
      // 重新加载图表
      reloadChart() {
        this.disposeChart()
        this.drawChart()
      },
      // 销毁图表以及重置各个数据
      disposeChart() {
        if (this.myChart) {
          this.myChart.dispose()
        }
      },
    },
  }
}

相关代码

链接:https://pan.baidu.com/s/1Ca34Xzp7jtE3nbzpJyNliw
提取码:ozbk

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

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

相关文章

AcWing 1083. Windy数(数位DP)

AcWing 1083. Windy数&#xff08;数位DP&#xff09;一、问题二、分析状态表示状态转移初末状态循环设计注意事项三、代码一、问题 二、分析 这道题考察的是数位DP的知识&#xff0c;对于数位DP的分析方法作者在之前的文章中做过详细地介绍&#xff1a;AcWing 1081. 度的数量…

java面试题(九)集合篇

2.1 Java中有哪些容器&#xff08;集合类&#xff09;&#xff1f; 参考答案 Java中的集合类主要由Collection和Map这两个接口派生而出&#xff0c;其中Collection接口又派生出三个子接口&#xff0c;分别是Set、List、Queue。所有的Java集合类&#xff0c;都是Set、List、Qu…

【LeetCode】Day206-二叉树着色游戏

题目 1145. 二叉树着色游戏【中等】 题解 官解说的实在是抽象了&#xff0c;看了下高赞题解&#xff0c;果然很清晰易懂 以 x 为根&#xff0c;它的三个邻居&#xff08;左儿子、右儿子和父节点&#xff09;就对应着三棵子树&#xff1a; 左子树右子树父节点子树 哪棵子树…

微服务项目框架及多模块开发

目录 项目模式 技术栈 项目架构图 模块 案例演示 主模块 zmall-common子模块 zmall-user子模块 项目模式 电商模式&#xff1a;市面上有5种常见的电商模式&#xff0c;B2B、B2C、 C2B、 C2C、O2O; 1、B2B模式 B2B (Business to Business)&#xff0c;是指 商家与商家…

java递归-八皇后问题(回溯算法)

1.八皇后问题介绍 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都…

Day04-数据分析模型

文章目录数据分析模型数据分析流程第一&#xff1a;定性法第二&#xff1a;定量法一、数据分析要解决什么问题&#xff1f;1. 研究历史2. 解释现状4. 洞察商机5. 寻求最佳方案二、数据分析师的工作三、数据分析流程1. 数据分析框架2. 数据获取3. 数据处理4. 数据分析5. 撰写报告…

大数据技术架构(组件)18——Hive:FileFormats(1)

1.5、FileFormats1.5.1、FileFormat对比&#xff1a;1.5.1.1、Text File每一行都是一条记录&#xff0c;每行都以换行符&#xff08;\ n&#xff09;结尾。数据不做压缩&#xff0c;磁盘开销大&#xff0c;数据解析开销大。可结合Gzip、Bzip2使用&#xff08;系统自动检查&…

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是小熊猫 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…

Redis实现分布式锁

基于Redis实现分布式锁。分为单Redis节点实现和Redis集群实现。 基于单个Redis节点实现分布式锁 作为分布式锁实现过程中的共享存储系统&#xff0c;Redis可以使用键值对来保护锁变量&#xff0c;在接收和处理不同客户端发送的加锁的操作请求。 客户端A、C同时请求加锁&#…

【Linux】基本开发工具的使用-yumvimgcc/g++git

文章目录Linux 软件包管理器-yum什么是软件包window和Linux互传文件的工具: lrzszyum注意事项查看软件包注意事项如何安装软件注意事项如何卸载软件好玩的指令sl 小火车cowsay 打印一只说话的小牛boxes 打印一个ASCII的动画linux_logo 显示linux系统的logocurl http://wttr.in …

2021美赛D题艺术家思路整理

问题整理 使用influence_data数据集或其部分创建音乐影响力的&#xff08;多个&#xff09;定向网络&#xff0c;其中影响者与关注者相连。开发捕捉此网络中“音乐影响的参数”。通过创建定向影响网络的子网络来探索音乐影响力的子集。描述这个子网络。你的“音乐影响”指标在…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第3天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有64天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

PMP知识点1

根据PMBOK和参考书籍自己总结的一些不熟悉知识点&#xff0c;当做笔记放这复习。 1. 项目战略管理、组合管理、项目及管理、项目管理区别 战略管理项目组合管理项目集管理项目管理工作内容明确组织战略目标选择有利于实现战略目标的项目分析并利用各项目之间有机联系规范有序…

RAS《Research on Offense and Defense of DDos Based on Evolutionar Game Theory》

Read abstract and personal Summary of《Research on Offense and Defense of DDos Based on Evolutionar Game Theory》Ⅰ&#xff1a;Read abstract(阅读摘要)0&#xff1a;Proper noun interpretation&#xff08;专有名词解释&#xff09;1&#xff1a;The question raise…

windows 休眠后风扇狂转的解决方法

windows 休眠后风扇狂转的解决方法 问题描述&#xff1a; 在Windows电脑接入usb设备后进入休眠状态时&#xff0c;风扇立刻最大功率运行&#xff0c;在拔出usb/唤醒电脑后风扇会恢复正常。 解决方法&#xff1a; 使用powercfg 查询唤醒电脑的设备&#xff0c;然后移除此设备…

C语言基础(五)—— 数组、数组地址(步长+1)、字符串输入输出、随机数

1. 概述在程序设计中&#xff0c;为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组。数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型&#xff0c;同时所有的成员在内存中的地址是连续的。数组属于构造数据类型&am…

从Manifold到SNE再到t-SNE再回到Manifold

在介绍t-SNE之前&#xff0c;要从流形开始讲起。 流形Manifold 将流形引入到机器学习领域主要有两个用途&#xff1a; 改进原本欧式空间中的算法&#xff0c;使它能作用到流形上&#xff0c;直接或者间接地利用和流行的性质和构造。将流形映射到欧式空间中&#xff0c;令欧式…

软件测试面试:年后就拿到了5个offer,希望也能助你拿下满意的offer

求职&#xff0c;就像打仗&#xff0c;不仅是一场挑战自己的战斗&#xff0c;也是一场与用人单位的较量。 而求职者只有准备足够充分&#xff0c;才能在这场毫无硝烟的“战场”上取得胜利。 那么软件测试面试需要做哪些准备以及软件测试面试需要哪些技巧呢&#xff1f; 1、熟…

ThreadLocal 适合用在哪些实际生产的场景中?

在通常的业务开发中&#xff0c;ThreadLocal有两种典型的使用场景 场景1&#xff0c;ThreadLocal 用作保存每个线程独享的对象&#xff0c;为每个线程都创建一个副本&#xff0c;这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本&#xff0c;确保线程安全 …

【内网安全-隧道搭建】内网穿透_Frp上线、测试

目录 Frp&#xff08;简易上线&#xff09; 1、简述&#xff1a; 2、工具&#xff1a; 3、使用&#xff1a; 1、准备&#xff1a; 2、服务端&#xff08;公网&#xff09;&#xff1a; 2、客户端&#xff08;内网&#xff09;&#xff1a; 3、测试方法&#xff1a; 4、…