动态渲染 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 调用后台数据渲染饼图
      • 2.3.3 改造成内外两个圈

前言

因为上文中提到的需求就是在 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'))// 渲染 echartspieCharts.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.DruidDataSourceurl: jdbc:postgresql://localhost:5432/study?useUnicode=true&characterEncoding=UTF-8&useSSL=falseusername: postgrespassword: admindriver-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 {@Resourceprivate 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 {@Overridepublic 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'))// 渲染 echartspieCharts.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.datathis.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].incomeseriesObj.name = data[i].nameseriesArr.push(seriesObj)}this.pieOption.legend.data = legendArrthis.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].incomeseriesObj.name = data[i].nameseriesArr.push(seriesObj)}

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

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

相关文章

内网隧道代理技术(二十五)之 ICMP隧道反弹SHELL

ICMP隧道反弹SHELL ICMP隧道原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性。把数据隐藏在ICMP数据包包头的data字段中,建立隐蔽通道,可以实现绕过防火墙和入侵检测系统的阻拦。 ICMP隧道有以下的优点: ICMP…

腾讯云4核8G服务器选CVM还是轻量比较好?价格对比

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

博客系统(升级(Spring))(四)(完)基本功能(阅读,修改,添加,删除文章)(附带项目)

博客系统 (三&#xff09; 博客系统博客主页前端后端个人博客前端后端显示个人文章删除文章 修改文章前端后端提取文章修改文章 显示正文内容前端后端文章阅读量功能 添加文章前端后端 如何使用Redis项目地点&#xff1a; 博客系统 博客系统是干什么的&#xff1f; CSDN就是一…

数字化转型对企业有哪些优势?

数字化转型为企业提供了众多优势&#xff0c;帮助他们在日益数字化的世界中保持竞争力、敏捷性和响应能力。以下是一些主要优势&#xff1a; 1.提高效率和生产力&#xff1a; 重复性任务和流程的自动化可以减少人为错误&#xff0c;并使员工能够专注于更具战略性的任务。简化…

Apache Linki 1.3.1+DataSphereStudio+正常启动+微服务+端口号

我使用的是一键部署容器化版本&#xff0c;官方文章 默认会启动6个 Linkis 微服务&#xff0c;其中下图linkis-cg-engineconn服务为运行任务才会启动,一共七个 LINKIS-CG-ENGINECONN:38681 LINKIS-CG-ENGINECONNMANAGER:9102 引擎管理服务 LINKIS-CG-ENTRANCE:9104 计算治理入…

Vue开发小注意点

改bug 更改了配置项啥的&#xff0c;保存刷新发现没变&#xff0c;那就重启项目&#xff01;&#xff01;&#xff01;&#xff01; binding.value 和 e.target.value binding.value Day5 指令的值 e.target.value Day4 表单组件封装 binding.value 和 e.target.valu…

plt函数显示图片 在图片上画边界框 边界框坐标转换

一.读取图片并显示图片 %matplotlib inline import torch from d2l import torch as d2l读取图片 image_path ../data/images/cat_dog_new.jpg # 创建画板 figure d2l.set_figsize() image d2l.plt.imread(image_path) d2l.plt.imshow(image);二.给出一个(x左上角,y左上角,…

使用Git把项目上传到Gitee的详细步骤

1.到Git官网下载并安装 2.到Gitee官网进行注册&#xff0c;然后在Gitee中新建一个远程仓库 3.设置远程仓库的参数 4.返回Gitee查看仓库是否生成成功 5.新建一个文件夹作为你的本地仓库 6.将新建好的文件夹初始化成本地仓库 第一步&#xff1a;右键点击刚创建的本地仓库&#…

小程序实现一个 倒计时组件

小程序实现一个 倒计时组件 需求背景 要做一个倒计时&#xff0c;可能是天级别&#xff0c;也可能是日级别&#xff0c;时级别&#xff0c;而且每个有效订单都要用&#xff0c;就做成组件了 效果图 需求分析 需要一个未来的时间戳&#xff0c;或者在服务度直接下发一个未来…

NeuroFlash:AI文章写作与生成工具

【产品介绍 ​ 】 名称 NeuroFlash 上线时间 2015 具体描述 Neuroflash是一款基于人工智能的文本和图像生成器&#xff0c;可以帮助用户快速创建高质量的内容。Neuroflash拥有超过100种短文和长文的文本类型&#xff0c;涵盖了各种营销场景和需求。只需要输入简单的指示&#…

最新ChatGPT网站源码+支持GPT4.0+支持Midjourney绘画+支持国内全AI模型

一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&…

Debian12系统下LAMP环境中Nubuilder4.5的安装

一、环境搭建 按照官方的说法&#xff0c;Apache2和Nginx都可以的&#xff0c;实际上&#xff0c;你最好直接按照 Mariadb\Apache2\Php8.2 这个顺序&#xff0c;搭建LAMP环境较好。不然各种调试&#xff0c;还不一定能够成功。 相关搭建方法&#xff0c;属于一般操作&#xf…

js中如何判断一个变量是否为数字类型?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐使用Number.isNaN()方法⭐使用正则表达式⭐使用isNaN()函数⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

C++ - map 的 例题

前言 本博客在 一下文章关于 map 和 set 讲解之下&#xff0c;对 map 当中的 operator[] &#xff08;&#xff09;函数的功能运用&#xff0c;感受 map 功能强大。 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 给定两个数组 nums1 和 nums2 &#xff0c;返回…

AWT中常用组件

笔记&#xff1a;https://www.yuque.com/huangzhanqi/rhwoir/repuodh23fz01wiv 仓库&#xff1a;Java图形化界面: Java图形化界面学习demo与资料 (gitee.com) 基本组件 组件名 功能 Button Button Canvas 用于绘图的画布 Checkbox 复选框组件&#xff08;也可当做单选…

Java 使用 EMQX 实现物联网 MQTT 通信

一、介绍 1、MQTT MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议)&#xff0c;是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议&#xff0c;该协议构建于TCP/IP协议上&#xff0c;由IBM在1999年发布。MQTT最大优点在于&#xff…

第37章_瑞萨MCU零基础入门系列教程之DAC数模转换模块

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

MATLAB基础-MAT文件的读写操作

简介 MAT文件是MATLAB格式的双精度二进制数据文件&#xff0c;由MATLAB软件创建&#xff0c;可以使用MATLAB软件再其他计算机上以其他浮点格式读取&#xff0c;同时也可以使用其他软件通过MATLAB的应用程序接口来进行读写操作。如果只是再MATLAB环境中处理数据&#xff0c;使用…

【深度学习】树莓派Zero w深度学习模型Python推理

在机器学习开发过程中&#xff0c;当模型训练好后&#xff0c;接下来就要进行模型推理了&#xff0c;根据部署环境可分为三类场景&#xff1a; 边缘计算&#xff1a;一般指手机&#xff0c;嵌入式设备&#xff0c;直接在数据生成的设备上进行推理&#xff0c;因为能避免将采集…

SkyWalking安装部署

一、概念 1、什么是 APM 系统&#xff1f; APM&#xff08;Application Performance Management&#xff09;即应用性能管理系统&#xff0c;是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。应用性能管理&#xff0c;主要指对企业的关键业务应用…