基于Vue3+ECharts5+datav的疫情数据可视化大屏/地图项目

news/2025/1/11 6:14:42/

本项目是一个基于Vue3+ECharts5+datav打造的一个每日疫情数据大屏可视化开源项目;通过nginx部署在阿里云服务器上

效果展示

在线预览地址http://lj520zz.top/ 服务器已过期
请大家动动手点点star
项目前台源码地址:https://github.com/qdfudimo/vue3-screen
项目后台源码地址:https://github.com/qdfudimo/serve-screen

技术栈添加链接描述

前台技术栈

  1. vue3

  2. vite

  3. echarts5 官方社区停用 以下几个社区链接
    社区链接 http://www.ppchart.com/#/
    https://www.isqqw.com/#/homepage
    http://chart.majh.top/
    http://analysis.datains.cn/finance-admin/index.html#/chartLib/all
    https://www.isqqw.com/

  4. datav datav组件库地址

大屏适配方案

案例中采用了css3的缩放transform: scale(X,y)属性,改变分辨率时,scale的值是变化的。 通过获取当前屏幕大小screen和当前窗口大小,我们只要监听浏览器窗口大的小,同时控制变化的比例就可以了。
项目中通过创建一个ScaleBox缩放组件包裹住所有组件
在这里插入图片描述
scalebox组件采用css3的缩放transform: scale(X,y)

const { width, height } = screenconst w = window.innerWidth / widthconst h = window.innerHeight / height
this.style.transform = 'scale(' + x +"," + y ') translate(-50%, -50%)'

后续添加了屏幕宽度小于800高度小于600时的完整显示

let getScale = () => {// const wh = window.innerHeight / height;// const ww = window.innerWidth / width;// return [wh,ww];const w = window.innerWidth / widthconst h = window.innerHeight / heightif (window.innerWidth <= 800 || window.innerHeight <= 600) {let scale = w < h ? w : h;return [scale, scale]}return [h, w]
}
let setScale = (e) => {// 缩放比scale.h = getScale()[0];scale.w = getScale()[1];
}
let reCalc = debounce(setScale)
onMounted(() => {setScale();window.addEventListener("resize", reCalc);
})
onUnmounted(() => {window.removeEventListener("resize", reCalc)
})

在这里插入图片描述
在这里插入图片描述

也可以使用vue3的css样式绑定 https://cn.vuejs.org/api/sfc-css-features.html#v-bind-in-css

<script setup>
const theme = {color: 'red'
}
</script>
<style scoped>
p {color: v-bind('theme.color');
}
</style>

也使用了阿里的字体图标
通过vite-plugin-svg-icons 使用SVG图片

  1. 安装 vite-plugin-svg-icons
npm i vite-plugin-svg-icons -D
// 或者
yarn add vite-plugin-svg-icons -D
  1. main.js引入
import 'virtual:svg-icons-register';
  1. 创建svg图片文件夹
    在这里插入图片描述
  2. 在vite.config.js中配置
import {createSvgIconsPlugin
} from 'vite-plugin-svg-icons'
import path from 'path'
defineConfig({server: {//反向代理proxy: {// 选项写法// '/api': {//   target: 'http://jsonplaceholder.typicode.com',//   changeOrigin: true,//   rewrite: (path) => path.replace(/^\/api/, '')// },// // 选项写法[config.VITE_API_BASE_URL]: {target: config.VITE_APP_BASE_SERVER,changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, '')},// Proxying websockets or socket.io// '/socket.io': {//   target: 'ws://localhost:3000',//   ws: true// }}},plugins: [createSvgIconsPlugin({// Specify the icon folder to be cachediconDirs: [path.resolve(process.cwd(), 'src/icons')],// Specify symbolId formatsymbolId: 'icon-[dir]-[name]',})],
})

5.新建svg组件

<template><svg :class="svgClass" v-bind="$attrs"><use :xlink:href="iconName"></use></svg>
</template><script setup lang="ts">
import { computed } from 'vue'
const props = defineProps({name: {type: String,required: true},color: {type: String,default: '#e6e6e6'}
})
const iconName = computed(() => `#icon-${props.name}`)
const svgClass = computed(() => {if (props.name) return `svg-icon icon-${props.name}`return 'svg-icon'
})
</script><style scoped>
.svg-icon {width: 1em;height: 1em;fill: currentColor;vertical-align: middle;
}
</style>
  1. main.js全局引入使用
import SvgIcon from '@/components/SvgIcon.vue'
const app = createApp(App)
app.component("svg-icon",SvgIcon)

组件中使用

//name svg文件名
<svg-icon name="empty" style="fontSize:120px"></svg-icon>

后台数据

koa2+axios 将爬取网易新闻的每日接口
通过定时任务每日爬取网易新闻的接口数据,保存为json文件,然后读取文件数据,请求数据时返回给前台。
每天定时下午先判断今日是否有数据,有则删除前一日的json数据,无则不删除

const schedule = require('node-schedule');
const {getData
} = require("../api")
const {formatBeforetTime,formatTime
} = require("../util/moment")
const {checkDirFile,emptyDir,
} = require("../util/index")
/*** 定时任务调接口*/
function scheduleCronstyle() {schedule.scheduleJob('30 0 10 * * *', function () {console.log('scheduleCronstyle:' + new Date());getData()});schedule.scheduleJob('30 0 14 * * *', function () {console.log('scheduleCronstyle:' + new Date());getData()});
}
/*** 定时任务删除上一天json文件*/
function scheduleDelFile() {schedule.scheduleJob('30 3 16 * * *', function () {let fileName = formatBeforetTime();let fileNamepre = formatTime();if (checkDirFile("areaData", fileNamepre) && checkDirFile("areaData", fileName)) {emptyDir("areaData", fileName)console.log(`删除文件areaData${fileName}`);}else {console.log(`没有删除文件areaData`);}if (checkDirFile("chinaData", fileNamepre) && checkDirFile("chinaData", fileName)) {emptyDir("chinaData", fileName)console.log(`删除文件chinaData${fileName}`);}});

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

相关文章

vue大数据表格解决方案的比较

前言 近些年公司一直采用vue2.xElement UI进行开发&#xff0c;对于Element UI&#xff0c;由于起步较早&#xff0c;相关的生态一直比较成熟&#xff0c;各种问题在某度上也能找到比较完美的解决方案&#xff0c;最最重要的一点是bug也比较少。 凡是总有个但是&#xff1a;&a…

POI百万级大数据量EXCEL导出

一. 简介 excel导出&#xff0c;如果数据量在百万级&#xff0c;会出现俩点内存溢出的问题&#xff1a; 1. 查询数据量过大&#xff0c;导致内存溢出。 该问题可以通过分批查询来解决&#xff1b; 2. 最后下载的时候大EXCEL转换的输出流内存溢出&#xff1b;该方式可以通过新版…

城市POI数据爬取-百度地图版

1 API说明 目前百度地图的最新版为地图检索V2.0服务。详细介绍可以通过开发文档-web服务Api-地点检索V2.0获取。 在使用API前需要提前注册账号获取ak。对于免费账号&#xff1a;目前的每日访问次数是100次&#xff0c;最多可以获取2000条数据。 如不需讲解仅需要下载代码&am…

使用Java导出Excel表格并由浏览器直接下载——基于POI框架

目录 背景描述 技术准备 导出Excel——尝鲜版 导出Excel——封装版(通过反射) 导出Excel——深度封装&#xff08;设置下拉选项&#xff09; 扩展——多个列分别是不同的下拉选项怎么封装 2019-10-28 更新&#xff0c;必看&#xff01;&#xff01;&#xff01; 2019-1…

VUE页面表格数据多卡顿用虚拟表单

情景概况&#xff1a;页面表格想要通过滚动条展示非常多的数据&#xff0c;后端返回接口很快。 解决方法&#xff1a;虚拟滚动 vue vxe-table 20220708_145309 element ui 表单已经不能满足这个需求&#xff0c;二次封装也很麻烦&#xff0c;所以推荐用现有插件vxetable 插…

js使用百度地图仅显示中国区域,实现大数据热点图

马上又到年底PPT环节了&#xff0c;各位实现效果之后&#xff0c;麻烦留言点赞。。 需求&#xff1a;领导需要在年会上展示我们的用户ip实时数据&#xff0c;做一个网页版的地图&#xff0c;仅仅显示中国区域。 技术分析&#xff1a;echart&#xff0c;hchart等网站都有地图版…

对去哪儿旅行(功略库)的数据分析

选题背景 去哪儿旅行网站上有丰富的图片&#xff0c;旅行数据以及评论数据&#xff0c;用这些大量的数据来学习数据采集及可视化分析是一个不错的选择 网页分析 可以获取的数据 通过翻阅这些攻略我们可以观察到网站上展示了以下共有的数据&#xff1a;文章标题&#xff0c;…

Spring Boot中Redis自动配置的介绍、原理和使用

Spring Boot中Redis自动配置的介绍、原理和使用 引言 Redis是一种高性能的键值对存储数据库&#xff0c;它支持多种数据结构和丰富的功能&#xff0c;如缓存、消息队列、计数器、分布式锁等。在Spring Boot中&#xff0c;我们可以通过自动配置的方式来使用Redis。本文将介绍S…