vue3+Echarts+Nodejs实现动态数据可视化

news/2024/11/15 6:11:39/

最近在做毕设的后台管理系统,刚好需要做数据动态可视化的功能,就来记录一下具体的实现方式吧!

在开始之前就不阐述用vue创建项目的具体步骤了,主要详细讲解一下vue3、echarts和nodejs三者之间是如何实现数据的动态显示的,我这边项目是使用的vite创建的。

一、安装echarts

在vscode的终端利用npm进行以下命令

npm install echarts

二、引用、使用echarts

(1)在需要使用的组件中引入echarts

import * as echarts from 'echarts'

(2)接下来就是如何使用该组件了,这里通过一个案例来展示

<template><div class="food-sale"><h4>美食占比情况</h4><div class="food-cahrt" ref="foodChart"></div></div>
</template><script setup>
import {ref,onMounted,onBeforeMount} from 'vue'
import * as echarts from 'echarts'
import { fontSize } from '@/utils/fontSize'
const foodChart=ref(null)  
let myfoodChart=null
//定义数据变量
const foodData=ref([{name:'',value:''}
])
const initChart=()=>{myfoodChart=echarts.init(foodChart.value)const option={tooltip: {trigger: 'item',backgroundColor:'rgba(62, 177, 52, .6)',textStyle:{color:'#cfd',}},legend: {orient: 'vertical',//设置图例的方向right: '5%',top: "center",itemWidth: 10, // 图标宽设置itemHeight: 10, // 图标长设置itemGap:20,//设置图例的间距textStyle: {fontSize: fontSize(35),fontFamily: 'sy-m',}},series: [{// name: '实时设备',type: 'pie',radius: ['40%', '60%'],avoidLabelOverlap: false,label: {show: false,position: 'center'},emphasis: {label: {show: true,// fontSize:12,fontSize:fontSize(30),fontWeight:600,lineHeight: 18,color:'rgb(122, 170, 236)',formatter: '{b}\n{d}%',rich: {    // 显示出的内容,设置样式b: {fontSize: fontSize(16),color:'rgb(66, 127, 212)',align: 'center'},d: {fontSize: fontSize(20),padding: 0,}}}},labelLine: {show: false},data:foodData.value}]}myfoodChart.setOption(option)//设置饼图自动转动let count = 0;setInterval(() => {myfoodChart.dispatchAction({type: 'downplay',seriesIndex: 0,dataIndex: count});count++;if (count === 5) {count = 0;}myfoodChart.dispatchAction({type: 'highlight',seriesIndex: 0,dataIndex: count});}, 2000);
}
// 图表自适应
const resizeChart = () => {myfoodChart.resize()
}
onMounted(() => {initChart()window.addEventListener('resize', resizeChart)
})
onBeforeMount(()=>{window.removeEventListener('resize', resizeChart)
})
</script><style lang='less' scoped>
.food-sale{width: 43%;height: 16.5vw;background: #fff;margin-top: 1vw;border-radius:0.5vw;h4{font-size: 16px;padding-left: 0.8vw;padding-top: 0.5vw;}.food-cahrt{width: 80%;height: 17vw;}
} 
</style>

三、利用nodejs模拟数据

上述是前端需要实现的页面部分,接下来是如何利用nodejs来模拟页面所需的后端数据

(1)在cmd上输入以下命令,注意此命令只可安装一次

npm install express-generator -g

(2)然后进入你自己创建的项目目录输入下面的命令,此步骤是在cmd中操作

express --view=ejs server

(3)打开服务文件夹

cd server

(4)在server文件中的routes中会有一个index.js文件,在此文件中进行模拟数据

router.get("/api/home/food",function(req, res, next){return res.json({"code":200,"data":{list:[{name:'炒米粉',value:10840},{name:'拉条子拌面',value:9840},{name:'大盘鸡',value:8560},{name:'烤全羊',value:8060},{name:'手抓饭',value:7060},]}});
})

四、获取数据

(1)在src文件夹下新建一个名为api的文件夹,里面新建一个名为homeData.js的文件获取数据

import { get, post} from "@/utils/http.js";
//获取用户信息数据
export const getFoodList = (params) => get('/api/home/food',params);

(2)在上述需要用到该数据的组件中引入此文件

import {getFoodList} from '@/api/homeData'

(3)获取数据

获取图表数据
const getChartData=()=>{return new Promise((resolve, reject) =>{getFoodList().then(res=>{if(res.code===200&&res.data){// console.log(res,'shuju')foodData.value=[]res.data.forEach((item,index)=>{foodData.value[index]={name:item.name,value:item.value}})// console.log(chartData.xAxis,'xshuju')}// console.log(res.data,'shuju')resolve(res.data)}).catch(error=>{reject(error)})})
}

(4)挂载数据

onMounted(async() => {await getChartData()
})

五、结果展示


http://www.ppmy.cn/news/1431448.html

相关文章

统计单词数量(文件)(*)

请编写函数&#xff0c;统计英文文章的单词数量。 函数原型 int CountWord(FILE *f); 说明&#xff1a;参数 f 为文件指针。函数值为该文件的单词数量。 裁判程序 #include <stdio.h> #include <stdlib.h> #include <ctype.h>int CountWord(FILE *f);in…

在React Router 6中使用useRouteLoaderData钩子获取自定义路由信息

在 React Router 6 中怎么像vueRouter一样&#xff0c;可以在配置路由的时候&#xff0c;定义路由的元信息(附加信息)&#xff1f;答案是可以的。稍有些复杂。核心是通过为每个路由定义了一个 loader 函数,用于返回自定义的路由信息&#xff0c;然后通过useRouteLoaderData 钩子…

【设计模式】9、facade 外观模式

文章目录 九、外观模式9.1 player9.1.1 player_test.go9.1.2 player.go 9.2 login_register9.2.1 account_test.go9.2.2 account.go 九、外观模式 https://refactoringguru.cn/design-patterns/facade 如果有一个复杂的系统, 内部有很多子系统, 可以用 facade 封装一层, 只暴…

MongoDB分片部署(windows)

OS&#xff1a;win10 MongoDB&#xff1a;4.4.24 分片架构 从图中可以看出&#xff0c;分片集群中主要由三个部分组成&#xff0c;即分片服务器&#xff08; Shard &#xff09;、路由服务器 &#xff08; Mongos &#xff09;以及配置服务器&#xff08; Config Server &am…

李沐动手学深度学习-优化和深度学习

优化和深度学习 对于深度学习问题&#xff0c;我们通常会先定义损失函数。一旦有了损失函数&#xff0c;就可以使用优化算法来尝试最小化损失。在优化中&#xff0c;损失函数通常被称为优化问题的目标函数。按照传统惯例&#xff0c;大多数优化算法都关注的是最小化。 优化的…

C# 中的策略模式:从基础到高级

概述&#xff1a;策略模式是一种行为设计模式&#xff0c;支持在运行时选择算法的实现。代码不是直接实现单个算法&#xff0c;而是接收运行时指令&#xff0c;说明要使用一系列算法中的哪种算法。在这篇博客文章中&#xff0c;我们将探讨 C# 中的策略模式&#xff0c;从基础知…

【配电网故障定位】基于二进制矮猫鼬优化算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#82】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制矮猫鼬优化算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络发生…

Spring5深入浅出篇:AOP底层实现原理

Spring5深入浅出篇:AOP底层实现原理 很多粉丝私信我这个Spring5的课程在哪看,这边是在B站免费观看欢迎大家投币支持一下. https://www.bilibili.com/video/BV1hK411Y7zf 核⼼问题 1. AOP如何创建动态代理类(动态字节码技术) 2. Spring⼯⼚如何加⼯创建代理对象通过原始对象的i…