原文地址:使用Vue+DataV+ECharts打造新冠肺炎疫情数据大屏(可动态刷新)

源码

查看:https://blog.lanweihong.com/posts/29267/

GithHb: https://github.com/lanweihong/data-visualization-with-covid-19

效果图

演示

仅适配 1080P 屏幕,使用浏览器访问后按 F11 进入全屏可看最佳显示效果。

  1. 疫情真实数据演示地址:演示地址-真实数据
  2. 模拟数据演示地址:演示地址-模拟数据

前端框架和类库

  • Vue.js
  • Apache ECharts
  • DataV
  • axios
  • Element
  • Mock

代码实现

创建项目

使用 Vue Cli 创建 Vue 项目,没有 Vue Cli 的使用以下命令安装:

npm install -g @vue/cli

创建项目:

vue create datav-covid-19

安装依赖

# 安装 DataV
npm install @jiaminghi/data-view# 安装 echarts
npm install echarts -S# 安装 element-ui
npm i element-ui -S# 安装 vue-router
npm install vue-router# 安装 mockjs
npm install mockjs --save-dev# 安装 axios
npm install axios# 安装 echarts-liquidfill
npm i echarts-liquidfill

引入注册

在项目中引入,编辑 main.js

import Vue from 'vue'
import App from './App.vue'
import dataV from '@jiaminghi/data-view'
import * as echarts from 'echarts'
import 'element-ui/lib/theme-chalk/index.css';
import axios from 'axios'
// 引入 echarts 水球图
import 'echarts-liquidfill'
import VueRouter from 'vue-router'import { Icon, Row, Col,  Table, TableColumn, Button, Dialog, Link
} from 'element-ui';// 注册 echarts
Vue.prototype.$echarts = echarts
Vue.config.productionTip = false// 注册 axios
Vue.prototype.axios = axios// 注册 dataV
Vue.use(dataV)// 注册路由
Vue.use(VueRouter)// 按需注册其他 element-ui 组件
Vue.use(Icon)
Vue.use(Row)
Vue.use(Col)
Vue.use(Table)
Vue.use(TableColumn)
Vue.use(Button)
Vue.use(Dialog)
Vue.use(Link)new Vue({render: h => h(App),
}).$mount('#app')

编写组件

因为篇幅有限,为了阅读体验,这里以 累计排名 组件为例,其他的组件请看 Github 上的代码。

累计排名组件

效果图

累计排名组件采用 ECharts 的柱状图来显示,实现代码如下:

<template><divref="provinceRankingBarChart"style="width: 100%; height: 100%"/>
</template>
<script>
import * as echarts from 'echarts'
let chart = null
export default {props: {data: {type: Object,default () {return {provinceList: [],valueList: []}}}},methods: {initChart () {if (null != chart && undefined != chart) {chart.dispose()}chart = this.$echarts.init(this.$refs.provinceRankingBarChart)this.setOptions()},setOptions() {var salvProValue = this.data.valueList;var salvProMax = [];for (let i = 0; i < salvProValue.length; i++) {salvProMax.push(salvProValue[0])}let option = {grid: {left: '2%',right: '2%',bottom: '2%',top: '2%',containLabel: true},tooltip: {trigger: 'axis',axisPointer: {type: 'none'},formatter: function (params) {return params[0].name + ' : ' + params[0].value}},xAxis: {show: false,type: 'value'},yAxis: [{type: 'category',inverse: true,axisLabel: {show: true,textStyle: {color: '#fff'},},splitLine: {show: false},axisTick: {show: false},axisLine: {show: false},data: this.data.provinceList}, {type: 'category',inverse: true,axisTick: 'none',axisLine: 'none',show: true,axisLabel: {textStyle: {color: '#ffffff',fontSize: '12'},},data: salvProValue}],series: [{name: '值',type: 'bar',zlevel: 1,itemStyle: {normal: {barBorderRadius: 30,color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{offset: 0,color: 'rgb(2,163,254,1)'}, {offset: 1,color: 'rgb(125,64,255,1)'}]),},},barWidth: 20,data: salvProValue},{name: '背景',type: 'bar',barWidth: 20,barGap: '-100%',data: salvProMax,itemStyle: {normal: {color: 'rgba(24,31,68,1)',barBorderRadius: 30,}},},]}chart.setOption(option)}},watch: {data: {handler(newList, oldList) {if (oldList != newList) {this.setOptions()}},deep: true}}
}
</script>

在页面中引入使用:

<template><div class="demo"><province-ranking-bar-chartref="rankChart":data="dataList"style="width: 100%; height: 380px"/></div>
</template>
<script>
// 引入组件
import ProvinceRankingBarChart from '../components/ProvinceRankingBarChart'
export default {components: {ProvinceRankingBarChart},data () {return {// 定义数据dataList: {provinceList: ['湖北', '台湾'],valueList: [68188, 15379]}}},mounted() {// 创建图表并初始化this.$refs.rankChart.initChart()}
}
</script>
<style>
.demo {width: 500px;height: 600px;
}
</style>

其他组件的代码就不在这里写了,完整代码已上传 Github ,需要的可以去查看。

完整的组件结构如下:

准备模拟数据

项目中提供了两种数据提供方式,一是请求真实后台地址,返回的数据格式参考 data 目录下的 json 文件;二是在本地使用 Mock 生成模拟数据。这里仅介绍使用 Mock 生成模拟数据方式。

使用 Mock 生成模拟数据

在项目根目录下创建文件夹 mock,分别创建 covid19.jsindex.js

编写 mock 服务

covid19.js 代码如下,代码中使用到一些 Mock 的语法,具体使用方法请查看 Mock 的文档。

// 从本地读取 json 数据
const provinceData = require('../data/covid19-province.json')
const dailyData = require('../data/covid19-daily-list.json')
// 引入 mockjs
const Mock = require('mockjs')
// 使用 mockjs 的 Random 生成随机数据
const Random = Mock.Randommodule.exports = [{url: '/api/covid-19/overall',type: 'get',response: config => {return {success: true,code: 200,message: "操作成功",data: {confirmedCount: Random.integer(110000, 120000),confirmedIncr: 72,curedCount: Random.integer(100000, 110000),curedIncr: 173,currentConfirmedCount: Random.integer(3000, 4000),currentConfirmedIncr: -110,deadCount: Random.integer(4000, 6000),deadIncr: 12,importedCount: Random.integer(6000, 8000),importedIncr: 23,noInFectCount: Random.integer(400, 600),noInFectIncr: 8,suspectIncr: 0,suspectCount: 2,updateTime: "2021-07-15 20:39:11",curedRate: Random.float(90, 95, 0, 9),deadRate: Random.float(1, 5, 0, 9)}}}},{url: '/api/covid-19/area/latest/list',type: 'get',response: config => {return provinceData}},{url: '/api/covid-19/list',type: 'get',response: config => {return dailyData}}
]
注册 mock 服务

编辑 index.js,这里主要是注册 mock 服务,调用方法 initMockData() 完成注册;

const Mock = require('mockjs')
// 引入写好的 mock 服务
const covid19 = require('./covid19')const mocks = [...covid19
]function param2Obj(url) {const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')if (!search) {return {}}const obj = {}const searchArr = search.split('&')searchArr.forEach(v => {const index = v.indexOf('=')if (index !== -1) {const name = v.substring(0, index)const val = v.substring(index + 1, v.length)obj[name] = val}})return obj
}const initMockData = () => {Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.sendMock.XHR.prototype.send = function() {if (this.custom.xhr) {this.custom.xhr.withCredentials = this.withCredentials || falseif (this.responseType) {this.custom.xhr.responseType = this.responseType}}this.proxy_send(...arguments)}function XHR2ExpressReqWrap(respond) {return function(options) {let result = nullif (respond instanceof Function) {const { body, type, url } = optionsresult = respond({method: type,body: JSON.parse(body),query: param2Obj(url)})} else {result = respond}return Mock.mock(result)}}for (const i of mocks) {Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))}
}module.exports = {mocks,initMockData
}
使用 mock 服务

main.js 中引入:

const { initMockData } = require('../mock')
// 完成注册
initMockData()

然后在页面中使用 request.get('/api/covid-19/list') 就能请求获取到数据,这里的 request.get() 是我用 axios 封装写的方法。

封装数据接口

封装 axios

项目中的数据请求都是使用 axios 为方便使用,我简单封装了一个工具类 request.js

import axios from "axios"
import sysConst from '../libs/const'
const fetch = (method = 'GET', url, param = '') => {// 处理 urlurl = `${sysConst.baseUrl}${url}`return new Promise((resolve, reject) => {axios({method: method,url: url,changeOrigin: true,data: JSON.stringify(param)}).then((res) => {resolve(res.data)}, error => {reject(error)}).catch((error) => {reject(error)})})
}const get = (url) => {return fetch('GET', url)
}const post = (url, data) => {return fetch('POST', url, data)
}const put = (url, data) => {return fetch('PUT', url, data)
}const remove = (url, data) => {return fetch('DELETE', url, data)
}export {get,post,put,remove
}

这里引入的 const.js 代码如下:

let baseUrl = ''
if (process.env.NODE_ENV === 'development') {// 修改你的 API 地址baseUrl = ''
} else {// 你的 API 地址baseUrl = ''
}export default {baseUrl
}

封装数据接口

在项目根目录下新建文件夹 api ,用于保存编写数据接口,在该目录下新增文件 covid19.js,用于封装请求获取数据:

import * as request from '@/utils/request'/*** 接口封装*/
export default {getOverall() {let url = `/api/covid-19/overall?_=${Math.random()}`return request.get(url)},getProvinceDataList() {let url = `/api/covid-19/area/latest/list?_=${Math.random()}`return request.get(url)},getDailyList() {let url = `/api/covid-19/list?t=${Math.random()}`return request.get(url)}
}

调用数据接口获取数据并更新图表展示

// 引入
import covid19Service from '../api/covid19'// 使用
let self = this
covid19Service.getOverall().then((res) => {if (!res.success) {console.log('错误:' + res.info)return}// 修改数据,图表组件检测到数据变化会触发 setOptions() 方法更新显示( setOptions() 在图表组件中已定义好)self.basicData = res.data
})

项目结构

完整的项目结构如下:

├─build
├─data                                   # 本地模拟数据目录
├─mock                                   # mock 配置
├─public
└─src├─api                                # 接口封装目录├─assets├─components                         # 组件目录│  ├─About                           # 关于│  ├─BasicDataItemLabel              # 基本数据显示标签│  ├─BasicProportionChart            # 占比图表│  ├─BasicTrendChart                 # 趋势图表│  ├─ChartCard                       # 图表面板│  ├─CuredAndDeadRateChart           # 治愈率和死亡率图表│  ├─CurrentConfirmedCompareBarChart # 最近一周累计治愈图表│  ├─DataMap                         # 数据地图│  └─ProvinceRankingBarChart         # 累计排名图表├─libs                               # 一些常用的配置├─router                             # 路由配置├─utils                              # 工具类└─views                              # 视图

详细结构:

总结

  1. 采用组件化封装各个展示图表,能更好的图表展示及复用;
  2. 使用 axios 请求后台服务或本地 mock 服务获取数据,然后重新赋值图表中指定的数据;

项目源码:本项目源码已上传至 Github,在我的博客中可查看到地址:使用Vue+DataV+Echarts打造新冠肺炎疫情数据大屏(可动态刷新)

这个项目是个人学习作品,能力有限,难免会有 BUG 和错误,敬请谅解。如有更好的建议或想法,请指出,谢谢

使用Vue+DataV+ECharts打造新冠肺炎疫情数据大屏(可动态刷新)相关推荐

  1. 每日一练:Python爬虫爬取全国新冠肺炎疫情数据实例详解,使用beautifulsoup4库实现

    Python 爬虫篇 - 爬取全国新冠肺炎疫情数据实例详解 效果图展示 第一章:疫情信息的下载与数据提取 ① 爬取页面数据到本地 ② json 字符串正则表达式分析 ③ 提取数据中的 json 字符串 ...

  2. 爬取并处理中国新冠肺炎疫情数据

    项目名称: 爬取并处理中国新冠肺炎疫情数据 目的: 通过Python爬取中国新冠肺炎疫情数据,存入Excel,对此数据分析并进行可视化,制作查询中国疫情情况的GUI界面. 具体内容: 通过Python ...

  3. 新冠肺炎疫情数据爬取以及几种简单的地图可视化方法

    众所周知,新冠肺炎疫情是一次很流行的全球性公共卫生事件.如今我国疫情已经好了许多,但世界各国的疫情依然严峻.特殊时期,正好尝试一下疫情网络数据的抓取,并用几种python库对数据进行简单的地图可视化( ...

  4. 新冠肺炎疫情数据可视化分析-FineBI

    目录 一.实验(实训)目的 二.实验(实训)原理或方法 三.仪器设备.材料 四.实验(实训)步骤 五.实训记录及结果 <------------------------------------- ...

  5. 抗击肺炎:新冠肺炎疫情数据可视化及疫情预测分析

    疫情当前,共克时艰. 在新型冠状病毒感染的肺炎疫情牵动社会人心的关键时刻,本文将利用数据分析.数据挖掘.机器学习相关方法,围绕疫情态势展示.疫情走势预测进行分析,挖掘复杂异构多源数据之间的关联关系,以 ...

  6. 含最新数据! 使用Python检测新冠肺炎疫情拐点

    注:本文案例仅供技术学习,不代表研究性观点. 本文对应代码.数据及文献资料已上传至Github仓库https://github.com/CNFeffery/DataScienceStudyNotes ...

  7. 【大数据平台】基于Spark的美国新冠肺炎疫情数据分析及预测

    (本实验系中国地质大学(武汉)2022年秋期大数据平台及应用课程设计) 一.选题背景 新型冠状病毒疫情是由严重急性呼吸系统综合征冠状病毒2(SARS-CoV-2)导致的2019冠状病毒病(COVID- ...

  8. 【Python】2020年美国新冠肺炎疫情数据分析

    2020年美国新冠肺炎疫情数据分析 一. 需求描述 二. 环境介绍 三. 数据来源描述 四. 数据上传及上传结果查看 五.数据处理过程描述 1.数据集下载 2.格式转换 3.启动Hadoop集群 4. ...

  9. 【实战篇】39 # 如何实现世界地图的新冠肺炎疫情可视化?

    说明 [跟月影学可视化]学习笔记. 世界地图新冠肺炎疫情可视化 下面将实现世界地图新冠肺炎疫情可视化.数据用的是从 2020 年 1 月 22 日到 3 月 19 日这些天的新冠肺炎疫情进展.效果类似 ...

  10. 新冠肺炎疫情引发空前应用需求,Dynatrace助企业轻松应对

    数字化团队充分利用持续自动化和人工智能辅助技术,实现以高效率.高性价比的方式交付必要的业务成果 2020 年 5 月 14日--软件智能公司Dynatrace(纽交所代码:DT)指出,在新冠肺炎疫情( ...

最新文章

  1. git 你get了吗(git命令日常使用)
  2. Install 802.1x In Fedora
  3. Unity3D研究院之C#使用Socket与HTTP连接服务器传输数据包
  4. Linux ubuntu对于cmake的版本更新
  5. Xcode模版生成文件头部注释
  6. Android 属性动画(三)
  7. 全世界云计算宕机和中断[2013年-2014年集锦]
  8. 用html实现学生考勤系统,学生考勤管理信息系统的设计与实现最终版(样例3)...
  9. USB数据采集卡:labjack T7、T7 Pro系列的技术特点
  10. 【2G模组Air202开发】Lua脚本编程实现MQTT协议连接Tlink平台(二)
  11. 恢复希捷硬盘丢失数据的方法
  12. python获取交互式ssh shell
  13. ubuntu git clone 报错error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected
  14. Qt示例解析 【Callout】
  15. php反序列化--字符串逃逸
  16. 进程间通信和线程间通信的几种方式
  17. 鼠标滚轮调节音量 (含程序和源程序下载)
  18. centos 安装gcc9及配置
  19. 2020年末的一些职业规划思考
  20. 申宝投资-A股震荡下行

热门文章

  1. Effect Size
  2. android 自定义锁屏api,如何设置Android锁屏图像
  3. 每个前端工程师都应该了解的图片知识
  4. 如何查看电脑系统版本
  5. 空气质量指数月统计历史数据爬取
  6. linux bind日志级别,Bind日志配置。
  7. c语言之sizeof与strlen全
  8. word打开老是配置进度_电脑打开Word文档弹出配置进度窗口怎么解决
  9. JQuery解析二维码
  10. 第三方配件查验苹果MFi认证