Vue+TP分离开发实时疫情动态地图

2023-11-08 22:10

本文主要是介绍Vue+TP分离开发实时疫情动态地图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

准备工作及运行环境:
  • phpstudy集成环境(安装Apache、redis)
  • PhpStorm
  • IDEA
  • 已配置好node.js、npm
  • 课件下载地址:https://www.php.cn/xiazai/learn/6678

1.前端主要文件

需要安装的插件主要有axios, echarts。

main.js:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import axios from 'axios'Vue.config.productionTip = false
Vue.prototype.$axios = axios
// 与配置的域名一致
Vue.prototype.$host = 'http://inews.io2/index.php/'/* eslint-disable no-new */
new Vue({el: '#app',router,components: { App },template: '<App/>'
})

Main.vue

<template><div><h3>中国疫情</h3><p class="txt">来源:各地官方通报及权威媒体报道</p><p class="txt">更新:{{update_time}}</p><div class="flexbox"><div class="item"><div class="red bold">{{diagnosed}}</div><div class="gray tittle">累计确诊</div></div><div class="item"><div class="red bold">{{currentDiagnosed}}</div><div class="gray tittle">现确诊</div></div><div class="item"><div class="red bold">{{suspect}}</div><div class="gray tittle">疑似</div></div><div class="item"><div class="gray bold">{{death}}</div><div class="gray tittle">死亡</div></div><div class="item"><div class="green bold">{{cured}}</div><div class="gray tittle">治愈</div></div></div><!-- 地图 --><div :style="{height:'400px',width:'100%'}" ref="myMap"></div><!-- 柱状图 --><div ref="bar" :style="{height:'400px',width:'100%'}"></div></div>
</template><script>// 引入地图模块import echarts from 'echarts'require('echarts/map/js/china.js')export default {name: 'Main',data() {return {flag: true,msg: '查看更多地区',classA: 'container',expanded: false,update_time: '',cured: 0,currentDiagnosed: 0,death: 0,diagnosed: 0,suspect: 0,newList: [],area: [],state: [],die: '',ccfd: '',cfd: '',crd: ''}},created() {this.$axios.get(this.$host + 'api/index').then(res => {const data = res.data;this.cured = data.cured;this.death = data.death;this.currentDiagnosed = data.curDiagnosed;this.suspect = data.suspect;this.diagnosed = data.diagnosed;this.update_time = data.update_time;this.newList = data.newListthis.area = data.area;this.die = data.total_diethis.ccfd = data.total_ccfdthis.cfd = data.total_cfdthis.crd = data.total_crdthis.state = data.statethis.myMap();this.bar();}).catch(res => {console.log(res);})},methods: {bar() {var myChartBar = echarts.init(this.$refs.bar); //这里是为了获得容器所在位置var app = {};var option = null;var posList = ['left', 'right', 'top', 'bottom','inside','insideTop', 'insideLeft', 'insideRight', 'insideBottom','insideTopLeft', 'insideTopRight', 'insideBottomLeft', 'insideBottomRight'];app.configParameters = {rotate: {min: -90,max: 90},align: {options: {left: 'left',center: 'center',right: 'right'}},verticalAlign: {options: {top: 'top',middle: 'middle',bottom: 'bottom'}},position: {options: echarts.util.reduce(posList, function(map, pos) {map[pos] = pos;return map;}, {})},distance: {min: 0,max: 100}};app.config = {rotate: 90,align: 'left',verticalAlign: 'middle',position: 'insideBottom',distance: 5,onChange: function() {var labelOption = {normal: {rotate: app.config.rotate,align: app.config.align,verticalAlign: app.config.verticalAlign,position: app.config.position,distance: app.config.distance}};myChartBar.setOption({series: [{label: labelOption}, {label: labelOption}, {label: labelOption}, {label: labelOption}]});}};var labelOption = {show: true,position: app.config.position,distance: app.config.distance,align: app.config.align,verticalAlign: app.config.verticalAlign,rotate: app.config.rotate,formatter: '{c}  {name|{a}}',fontSize: 16,rich: {name: {textBorderColor: '#fff'}}};var option = {color: ['#aa0000', '#ff0000', '#747474', '#55aa00'],tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},legend: {data: ['总确诊', '现确诊', '死亡', '治愈']},toolbox: {show: true,orient: 'vertical',left: 'right',top: 'center',feature: {mark: {show: true},dataView: {show: true,readOnly: false},magicType: {show: true,type: ['line', 'bar', 'stack', 'tiled']},restore: {show: true},saveAsImage: {show: true}}},xAxis: [{type: 'category',axisTick: {show: false},data: this.state}],yAxis: [{type: 'value'}],series: [{name: '总确诊',type: 'bar',barGap: 0,label: labelOption,data: this.cfd},{name: '现确诊',type: 'bar',label: labelOption,data: this.ccfd},{name: '死亡',type: 'bar',label: labelOption,data: this.die},{name: '治愈',type: 'bar',label: labelOption,data: this.crd}]};if (option && typeof option === "object") {myChartBar.setOption(option, true);}},myMap() {var myMap = echarts.init(this.$refs.myMap); //这里是为了获得容器所在位置myMap.setOption({backgroundColor: "#FFFFFF",title: {text: '中国疫情地图',subtext: '2021年中国抗疫最新地图',x: 'center'},// 鼠标移到图里面的浮动提示框tooltip: {// 触发trigger: 'item',formatter(params, ticket, callback) {let ccfd,cfd,die,crdif (params.data) {ccfd = params.data.value // 现确诊cfd = params.data.confirmedCount // 总确诊die = params.data.deadCount // 死亡crd = params.data.curedCount // 治愈} else {ccfd = 0cfd = 0die = 0crd = 0}let htmlStr =`<div style = 'font-size:18px';padding-bottom:10px>${params.name}</div><p style='text-align:left;margin-top:10px;'>现确诊:${ccfd}<br/>总确诊:${cfd}<br/>死亡:${die}<br/>治愈:${crd}<br/></p>`return htmlStr},backgroundColor: "#abc", //提示标签背景颜色},geo: { // 这个是重点配置区map: 'china', // 表示中国地图roam: true,label: {normal: {show: true, // 是否显示对应地名textStyle: {color: 'rgba(0,0,0,0.4)'}}}},//左侧小导航图标visualMap: {show: true,x: 'left',y: 'bottom',textStyle: {fontSize: 6},splitList: [{start: 1000}, {start: 500,end: 999}, {start: 100,end: 499},{start: 10,end: 99}, {start: 1,end: 9},],color: ['#cc0000', '#ff4d4d', '#ff9999', '#ffe5e5']},series: [{type: 'scatter',coordinateSystem: 'geo' // 对应上方配置},{type: 'map',geoIndex: 0,data: this.newList}]})}}}
</script><style scoped>.txt {font-size: 14px;color: grey;}.flexbox {margin-bottom: 10px;width: 100%;height: 80px;background-color: lightgray;border-radius: 5px;display: flex;justify-content: center;align-items: center;}.item {flex-direction: column;display: flex;width: 80px;height: 80px;margin: 0 50px;/* border:1px solid red; */justify-content: center;align-items: center;}.red {color: #cc0000}.green {color: #42B983;}.gray {color: gray}.tittle {font-size: 14px;}.bold {font-weight: 600;font-size: 18px;}
</style>

2.TP6后端主要文件

Api.php:

<?php
namespace app\index\controller;
use app\BaseController;
use think\cache\driver\Redis;
class Api extends BaseController{public function index(){$redis = new Redis();$cor_innews = $redis->get('cor_innews');$cor_exnews = $redis->get('cor_exnews');if(!$cor_innews||!$cor_exnews){// 国内数据$in_res =  file_get_contents("https://tianqiapi.com/api?version=epidemic&appid=23035354&appsecret=8YvlPNrz");// 国外数据$ex_res =  file_get_contents("http://api.tianapi.com/txapi/ncovabroad/index?key=6c6d319a9f3b53c53b375c56fbd39207");//redis缓存数据4小时$redis->set('cor_innews',$in_res,14400);$redis->set('cor_exnews',$ex_res,14400);}else{//国内疫情数据整合$in_res = json_decode($cor_innews,true);$update_time = $in_res['data']['date'];$suspect = $in_res['data']['suspect']; $curDiagnosed = $in_res['data']['currentDiagnosed'];$diagnosed = $in_res['data']['diagnosed'];$death = $in_res['data']['death'];$cured = $in_res['data']['cured'];$area = $in_res['data']['area'];//准备地图悬浮数据$list = $in_res['data']['area'];$newList = [];foreach($list as $k=>$v){$newList[$k]['name'] = $v['provinceName'];$newList[$k]['value'] = $v['currentConfirmedCount'];$newList[$k]['confirmedCount'] = $v['confirmedCount'];$newList[$k]['deadCount'] = $v['deadCount'];$newList[$k]['curedCount'] = $v['curedCount'];}//全球疫情数据汇总$ex_res = $cor_exnews;$data = json_decode($ex_res,true)['newslist'];$res=[];$res[] = getNewData("亚洲",$data);$res[] = getNewData("南美洲",$data);$res[] = getNewData("北美洲",$data);$res[] = getNewData("欧洲",$data);$res[] = getNewData("非洲",$data);$res[] = getNewData("大洋洲",$data);$total_cfd = array_column($res,'total_cfd');$total_ccfd = array_column($res,'total_ccfd');$total_crd = array_column($res,'total_crd');$total_die = array_column($res,'total_die'); $res = [];$res['area'] = $area;$res['newList']=$newList;$res['update_time']=$update_time;$res['curDiagnosed']=$curDiagnosed;$res['suspect']=$suspect;$res['diagnosed']=$diagnosed;$res['death']=$death;$res['cured']=$cured;$res['total_cfd'] = $total_cfd; $res['state'] = ['亚洲','南美洲','北美洲','欧洲','非洲','大洋洲']; $res['total_ccfd'] = $total_ccfd; $res['total_crd'] = $total_crd; $res['total_die'] = $total_die; return json($res);}}}

路由配置文件app.php:

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
use think\facade\Route;Route::get('think', function () {return 'hello,ThinkPHP6!';
});Route::get('hello/:name', 'index/hello');//后端跨域路由配置
Route::get('api/index','api/index')->allowCrossDomain();

3.配置及运行

  • 打开phpstudy集成面板
    在这里插入图片描述
  • 新建网站,取名为inews.io2
    在这里插入图片描述
  • 修改httpd-vhost.conf文件中的规则
 #开启重写RewriteEngine onRewriteCond $1 !^(index\.php|\/public)#重写规则:可以不需要输入index.php来进行访问RewriteRule ^(.*)$ /index.php/$1 [L]

使用IDEA打开corno项目,安装依赖,使用npm run dev命令运行,打开浏览器,访问localhost:8080。
在这里插入图片描述


参考文章链接:

  • https://www.it610.com/article/1296333776644808704.htm
  • https://blog.csdn.net/weixin_42627280/article/details/93040217

这篇关于Vue+TP分离开发实时疫情动态地图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/372801

相关文章

VSCode开发中有哪些好用的插件和快捷键

《VSCode开发中有哪些好用的插件和快捷键》作为全球最受欢迎的编程工具,VSCode的快捷键体系是提升开发效率的核心密码,:本文主要介绍VSCode开发中有哪些好用的插件和快捷键的相关资料,文中... 目录前言1、vscode插件1.1 Live-server1.2 Auto Rename Tag1.3

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南

《在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南》在SpringBoot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制... 目录如何选择实现方案核心实现:应用层手动分离实施中的关键问题与解决方案总结在Spring Boot和

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2