动态渲染 echarts 饼图(vue 2 + axios + Springboot)

2023-11-19

前言

因为上文中提到的需求就是在 vue2 里面绘制echarts,所以,这里就搭建一个 vue2 的脚手架了。

想要深入了解 echarts 属性,请到此篇文章:如何用echarts画一个好看的饼图

至于如何在 vue2 中使用 echarts,请见这篇文章:https://blog.csdn.net/m0_54355172/article/details/131960527

1. 项目搭建

1.1. 前端

  1. 先搭建一个 vue2.0 的脚手架

    • 安装vue-cli

      1. 卸载老版本

        npm uninstall vue-cli -g
        
      2. 安装脚手架

        npm install -g @vue/cli
        
    • 新建一个 vue2 的项目

      vue create pie_front
      
  2. 引入 echarts 依赖:见博客:https://blog.csdn.net/m0_54355172/article/details/131960527

  3. MyPie.vue 初始代码如下:

    <template>
        <div>
          <div class="charts">
            <div id="comPie" style="height: 400px; width: 44em" />
          </div>
        </div>
      </template>
      
      <script>
      export default {
        name: 'myPie',
        data () {
          return {
            pieOption : {
                tooltip: {
                    trigger: 'item'
                },
                legend: {
                    top: '5%',
                    left: 'center'
                },
                series: [
                    {
                    name: 'Access From',
                    type: 'pie',
                    radius: ['40%', '70%'],
                    avoidLabelOverlap: false,
                    itemStyle: {
                        borderRadius: 10,
                        borderColor: '#fff',
                        borderWidth: 2
                    },
                    label: {
                        show: false,
                        position: 'center'
                    },
                    emphasis: {
                        label: {
                        show: true,
                        fontSize: 40,
                        fontWeight: 'bold'
                        }
                    },
                    labelLine: {
                        show: false
                    },
                    data: [
                        { value: 1048, name: 'Search Engine' },
                        { value: 735, name: 'Direct' },
                        { value: 580, name: 'Email' },
                        { value: 484, name: 'Union Ads' },
                        { value: 300, name: 'Video Ads' }
                    ]
                    }
                ]
                },
          }
        },
        mounted () {
          this.showPie()
        },
        methods: {
          showPie () {
            // 指定 echarts 图表初始化的容器
            const pieCharts = this.$echarts.init(document.querySelector('#comPie'))
            // 渲染 echarts
            pieCharts.setOption(this.pieOption, true)
          },
        },
      }
      </script>
      
      <style scoped type="text/less">
        #channelPie {
          margin-top: 1em;
        }
        button {
          width: 80px;
          height: 30px;
          border: 1px solid #2a69ee;
          border-radius: 5px;
          font: normal normal 14px 微软雅黑;
          color: #2a69ee;
          background-color: white;
        }
        .charts {
          display: flex;
          justify-content: center;
        }
      </style>
    
  4. App.vue 原始代码

    <template>
      <div id="app">
        <myPie msg="Welcome to Your Vue.js App"/>
      </div>
    </template>
    
    <script>
    import myPie from './components/MyPie.vue'
    
    export default {
      name: 'App',
      components: {
        myPie
      }
    }
    </script>
    
    <style>
    
    </style>
    
  5. 初始页面

1.2. 后端

postgreSQL 表数据:

后端接口:http://127.0.0.1:8099/pie/getPieData

依赖:

application.yml

spring:
 datasource:
   type: com.alibaba.druid.pool.DruidDataSource
   url: jdbc:postgresql://localhost:5432/study?useUnicode=true&characterEncoding=UTF-8&useSSL=false
   username: postgres
   password: admin
   driver-class-name: org.postgresql.Driver
server:
 port: 8099

PieReadMapper.java

@Repository
public interface PieReadMapper extends BaseMapper<Commodity> {

}

Commodity.java 实体类

@TableName("t_commodity")
@Data
public class Commodity {

    @TableId("cid")
    private String id;
    @TableField("cname")
    private String name;
    private Integer count;
    private BigDecimal income;
}

PieController.java

@Slf4j
@RestController
@RequestMapping("/pie")
public class PieController {

    @Resource
    private PieReadMapper pieReadMapper;


    @PostMapping("getPieData")
    public JSONArray getPieData(String param) {
        log.info("前端参数===>{}", param);
//        QueryWrapper<Commodity> wrapper = new QueryWrapper<>();
//        wrapper.setEntity(new Commodity());
        List<Commodity> commodities = pieReadMapper.selectList(null);
        String s = JSONObject.toJSONString(commodities);
        return JSONArray.parseArray(s);
    }
}

PieBackApplication.java 启动类

@MapperScan("com.chenjy.pie_back.mapper.**")
@SpringBootApplication
public class PieBackApplication {
    public static void main(String[] args) {
        SpringApplication.run(PieBackApplication.class, args);
    }

}

2. 后端数据渲染前端

2.1 补充1:在 vue 中使用 axios

  1. 引入依赖

    npm install axios
    
  2. main.js 全局引入 axios

    import axios from 'axios'
    
    Vue.prototype.$axios = axios
    
  3. 使用 axios 发送 post 请求

          getPieData() {
            const url = 'http://127.0.0.1:8099/pie/getPieData'
            this.$axios({
                method: 'post',
                url: url,
                data: null
            }).then(res => {
                console.log(res.data)
            }, err => {
                console.log('错误信息:', err.message)
            })
          }
    

    那如何用 axios 发送 GET 请求呢?如下:

          testGet() {
            const url = 'http://127.0.0.1:8099/pie/testGet'
            this.$axios({
                // method: 'get', 默认 get,可不写
                url: url,
                params: {
                    str: '前端发起一次 get 请求'
                }
            }).then(res => {
                console.log(res.data)
            }, err => {
                console.log('错误信息:', err.message)
            })
          }
    

2.2. 补充2:Springboot 处理跨域问题

  1. 解决跨域问题

    在后台新加一个配置类

    @Configuration
    public class config implements WebMvcConfigurer {
    
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
                    .allowedOriginPatterns("*")
                    .allowCredentials(true)
                    .allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH")
                    .maxAge(3600);
        }
    
    }
    

2.3. 修改前端代码

2.3.1 修改饼图样式

假数据先不去掉,后续把方法加上了再去掉。

        pieOption : {
            title: {
                show: true,
                text: '商品收益',
                x: 'left',
                y: 'top'
            },
            tooltip: {
                trigger: 'item'
            },
            legend: {
                orient: 'vertical',
                x: 'right',
                y: 'center',
                align: 'left',
                icon: 'circle',
            },
            series: [
                {
                type: 'pie',
                radius: ['60%', '70%'],
                roseType: 'area',
                avoidLabelOverlap: false,
                itemStyle: {
                    borderRadius: 10,
                    borderColor: '#fff',
                    borderWidth: 2
                },
                label: {
                    show: false,
                    position: 'center'
                },
                labelLine: {
                    show: false
                },
                data: [
                    { value: 1048, name: 'Search Engine' },
                    { value: 735, name: 'Direct' },
                    { value: 580, name: 'Email' },
                    { value: 484, name: 'Union Ads' },
                    { value: 300, name: 'Video Ads' }
                ]
                }
            ]
            },
      }

2.3.2 调用后台数据渲染饼图

<template>
    <div>
      <div class="charts">
        <div id="comPie" style="height: 400px; width: 44em" />
      </div>
    </div>
  </template>
  
  <script>


  export default {
    name: 'myPie',
    data () {
      return {
        pieOption : {
            title: {
                show: true,
                text: '商品收益',
                left: 100,
            },
            tooltip: {
                trigger: 'item',
                formatter: '{b}&emsp;&emsp;{d}% <br> 商品收益}&emsp;&emsp;{c}',
            },
            legend: {
                orient: 'vertical',
                right: 80,
                top: 100,
                align: 'left',
                icon: 'circle',
                data:[],
            },
            series: [
                {
                type: 'pie',
                radius: ['60%', '70%'],
                roseType: 'area',
                avoidLabelOverlap: false,
                itemStyle: {
                    borderRadius: 10,
                    borderColor: '#fff',
                    borderWidth: 2
                },
                label: {
                    show: false,
                    position: 'center'
                },
                labelLine: {
                    show: false
                },
                data: []
                }
            ]
            },
      }
    },
    mounted () {
      this.getPieData()
    },
    methods: {
      // 每次给饼图传入新的数据之后都要调用这个函数来重新渲染饼图
      showPie () {
        // 指定 echarts 图表初始化的容器
        const pieCharts = this.$echarts.init(document.querySelector('#comPie'))
        // 渲染 echarts
        pieCharts.setOption(this.pieOption, true)
      },
      // 调用后台获取饼图数据,并重新渲染饼图
      getPieData() {
        const url = 'http://127.0.0.1:8099/pie/getPieData'
        this.$axios({
            method: 'post',
            url: url,
            data: null
        }).then(res => {
            const datas = res.data
            this.setPieData(datas)
            this.showPie()
        }, err => {
            console.log('错误信息:', err.message)
        })
      },
      // 根据传入数据给饼图参数赋值
      setPieData(datas) {
        // 根据 arrays 配置 option 的 legend 和 series.data 的数据
        const data = Array.from(datas)
        const legendArr = []
        const seriesArr = []
        for (let i = 0; i < data.length; i++) {
           const seriesObj = {}
           legendArr.push(data[i].name)
           seriesObj.value = data[i].income
           seriesObj.name = data[i].name
           seriesArr.push(seriesObj)
        }
        this.pieOption.legend.data = legendArr
        this.pieOption.series[0].data = seriesArr
      }
    },
  }
  </script>
  
  <style scoped type="text/less">
    #channelPie {
      margin-top: 1em;
    }
    button {
      width: 80px;
      height: 30px;
      border: 1px solid #2a69ee;
      border-radius: 5px;
      font: normal normal 14px 微软雅黑;
      color: #2a69ee;
      background-color: white;
    }
    .charts {
      display: flex;
      justify-content: center;
    }
  </style>

2.3.3 改造成内外两个圈

如果要弄成内外两个圈的饼图,可以在 series 中再加一个数组:

series: [
                {
                name: '商品收益',
                type: 'pie',
                radius: ['60%', '70%'],
                roseType: 'area',
                avoidLabelOverlap: false,
                itemStyle: {
                    borderRadius: 10,
                    borderColor: '#fff',
                    borderWidth: 2
                },
                label: {
                    show: false,
                    position: 'center'
                },
                labelLine: {
                    show: false
                },
                data: []
                },
                {
                name: '商品收益',
                type: 'pie',
                radius: '35%',
                // roseType: 'area',
                avoidLabelOverlap: false,
                itemStyle: {
                    borderRadius: 10,
                    borderColor: '#fff',
                    borderWidth: 2
                },
                label: {
                    show: false,
                    position: 'center'
                },
                labelLine: {
                    show: false
                },
                data: []
                }
            ]
            },
      setPieData(datas) {
        // 根据 arrays 配置 option 的 legend 和 series.data 的数据
        const data = Array.from(datas)
        const legendArr = []
        const seriesArr = []
        for (let i = 0; i < data.length; i++) {
           const seriesObj = {}
           legendArr.push(data[i].name)
           seriesObj.value = data[i].income
           seriesObj.name = data[i].name
           seriesArr.push(seriesObj)
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态渲染 echarts 饼图(vue 2 + axios + Springboot) 的相关文章

随机推荐

  • 怎么用vscode进行单步调试

    1 修改launch文件 version 0 2 0 configurations name gdb Launch type cppdbg request launch program workspaceFolder build my cm
  • springcloud学习记录一、了解微服务

    此学习通过查阅相关资料 自己理解的方式进行总结 没有用太多的官方语言 官方语言一直不喜欢 搞得高大上 其实很简单 就是能装那个啥 看的人头疼 尤其是对新手 如果有人发现有问题请指正 谢谢 一 单机结构 对于一个小项目 并且使用人数不多时 开
  • @注解学习总结

    RestController 相当与 Controller ResponseBody组合使用 其作用均是将方法的结果转化为JSON 格式返回给前端 这点可以从 Postman 中体现 RequestMapping value 和 path
  • QT调试详细操作步骤及案例分析

    目录 QT调试详细操作步骤及案例分析 QT调试详细步骤 1 手动调试 1 1 输入备调试的代码 1 2 设置断点 1 3 单步调试简单介绍 1 4 调试案例 1 4 1 纯C 代码的调试 1 4 2 QT程序的调试 2 使用QDebug进行
  • 在centos中配置linux网络ping时碰到destination host unreachable的问题

    最近装了个VM VirtualBox和CentOS玩Linux 在配置完网络后 只能ping 127 0 0 1 无法ping出本机IP和外网 出现 destination host unreachable 的报错 From 192 168
  • 如何写一篇简洁易懂的测试报告?

    一 什么是测试报告 测试报告是指把测试的过程和结果写成文档 对发现的问题和缺陷进行分析 为纠正软件的存在的质量问题提供依据 同时为软件验收和交付打下基础 二 测试报告的内容 测试报告的内容可以总结为以下目录 首页 引言 目的 背景 缩略语
  • 【C++】通过栈/队列/优先级队列/反向迭代器了解适配器及仿函数

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 stack 实现一个stack 二 queue 实现一
  • C/C++尾插法建立单链表

    思路 一个s指针指向新建节点 一个节点指向尾节点 C 中有引用 写出来很简单 下面给出的是天勤数据结构高分笔记上面的写法 疯狂吐槽这种C和C 混用的方法 include
  • StoreUpgrader$UnexpectedUpgradingStoreVersionException: Not possible to upgrade a store with version

    Caused by org neo4j kernel impl storemigration StoreUpgrader UnexpectedUpgradingStoreVersionException Not possible to up
  • 【IT】计算机体系结构

    https edu 51cto com center course user get study course 解释型语言 在计算机资源受限制的嵌入式计算机上 单片机等 效果不好 因此在嵌入式开发中 更多的还是使用c c 这种 解释型语言
  • 过河卒 蓝桥杯 755

    题目描述 如图 A 点有一个过河卒 需要走到目标 B 点 卒行走规则 可以向下 或者向右 同时在棋盘上的 C 点有一个对方的马 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 例如上图 C 点上的马可以控制 99 个点 图中的 P1
  • java实现rabbitmq消息队列

    1 rabbitmq常用的五种模型 基本消息模型 基本消息模型就是 一个生产者丶默认交换机丶一个队列丶一个消费者 work消息模型 work消息模型就是 一个生产者丶默认交换机丶一个队列丶多个消费者 fanout广播模式 发布 订阅模式 f
  • Powershell无法使用conda activate的问题

    主要引起的原因是Powershell使用Conda init失败 问题主要出现在中文系统中 特别与onedrive开启了 文档同步 有关 可以看到 最后两行生成了配置文件 用以启动conda 并在onedrive上 但是 onedrive中
  • 搭建prometheus+grafana监控系统

    prometheus简介 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 自2012年成立以来 许多公司和组织都采用了Prometheus 该项目拥有非常活跃的开发人员和用户社区 现在 它是一个独立的开源项
  • 计算机相关专业结业课题推荐及答辩技巧,加关喔!

    计算机相关专业结业课题推荐及答辩技巧 是不是还在为选题而烦恼 本文是提供一些计算机 软件 通信 电子等 相关专业大四选题推荐及一些答辩技巧 供给大家学习和参考 预祝各位看官学业进步 前程似锦 创作不易 帮忙点赞 收藏 好评哦 一 整个学年设
  • @JsonProperty注解解析

    1 概述 来源 JsonPrpperty是jackson包下的一个注解 详细路径 com fasterxml jackson annotation JsonProperty 作用 JsonProperty用在属性上 将属性名称序列化为另一个
  • 华为OD机试真题- 统计匹配的二元组个数【2023Q2】【JAVA、Python、C++】

    题目描述 给定两个数组A和B 若数组A的某个元素A i 与数组B中的某个元素B j 满足 A i B j 则寻找到一个值匹配的二元组 i j 请统计在这两个数组A和B中 一共存在多少个这样的二元组 输入描述 第一行输入数组A的长度M 第二行
  • 深度学习--Pytorch构建栈式自编码器实现以图搜图任务(以cifar10数据集为例)

    Pytorch构建栈式自编码器实现以图搜图任务 搞清楚pytorch与tensorflow区别 pytorch tensorflow 搞清楚栈式自编码器的内部原理 效果图 代码及效果图 欠完备编码器 卷积栈式编码器 栈式编码器 本文旨在使用
  • ssm项目tomcat正常启动,首页不能访问的问题分析

    遇到这种情况的我们可以从以下几方面进行问题的排查 1 首先出现这种问题一般都是springmvc xml不能正常读取 也就是说文件路径不正确 是否打了war包 lib包是否存在 web xml路径是否正确
  • 动态渲染 echarts 饼图(vue 2 + axios + Springboot)

    目录 前言 1 项目搭建 1 1 前端 1 2 后端 2 后端数据渲染前端 2 1 补充1 在 vue 中使用 axios 2 2 补充2 Springboot 处理跨域问题 2 3 修改前端代码 2 3 1 修改饼图样式 2 3 2 调用