前言

🚀 基于 vue、datav、Echart 框架的大数据可视化(大屏展示)源码,基于VUE Echarts 制作,实现大数据可视化。通过 vue 组件实现数据动态刷新渲染,内部图表可自由替换。部分图表使用 DataV 自带组件,可自由进行更改, 可以在此基础上重新开发。

本项目中使用的是echarts图表库,ECharts 提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。


⚽精彩专栏推荐👇🏻👇🏻👇🏻

❤ 【作者主页——🔥获取更多优质源码】

❤ 【1000套 毕设项目精品实战案例】

❤ 【 20套 VUE Echarts 大数据可视化源码】

❤ 【150套 HTML Echarts大数据可视化源码 】

文章目录

  • 前言
  • 一、Echart是什么
  • 二、ECharts入门教程
  • 三、作品演示
  • 四、代码实现
  • router.js
  • main.js
  • App.vue
  • home.vue
  • 五、更多干货

一、Echart是什么

ECharts是一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖矢量图形库 ZRender,提供直观,交互丰富,可高度个性化定制的数据可视化图表。

二、ECharts入门教程

5 分钟上手ECharts


三、作品演示

学新通


四、代码实现

router.js

import Vue from 'vue'import Router from 'vue-router'Vue.use(Router)//   export default new Router({  routes: [    {      path: '/',      redirect: to => {        return '/home'      }    },    {      path: '/home',      name: 'home',      component: () => import('./views/Home.vue')    }  ]})

main.js

import Vue from 'vue'import App from './App.vue'import router from './router'import store from './store'import 'vue-g2'import './plugins/element.js'import 'vue-mapboxgl-components'import 'vue-mapboxgl-components/lib/vue-mapboxgl-components.css'import ElementUI from 'element-ui'import 'element-ui/lib/theme-chalk/index.css'import VideoPlayer from 'vue-video-player'import 'video.js/dist/video-js.css'import 'vue-video-player/src/custom-theme.css'//   Vue.config.productionTip = falseVue.use(VideoPlayer)Vue.use(ElementUI)new Vue({  router,  store,  render: h => h(App)}).$mount('#app')

App.vue

<template>  <div id="app">    <router-view></router-view>  </div></template><script>export default {  name: 'app'}</script><style>html,body{  height: 100%;  width: 100%;  margin: 0;}#app{  height: 100%;  width: 100%;}</style>

home.vue

<template>  <div class="homeCtn">    <!-- 标题模块 -->    <div class="topCtn">      <div class="title"><span>智慧司法 · 智慧法援</span></div>      <span class="number">        <!-- {{caseTotal|addComma}} -->        <span class="countNumber" @click="setFinereportLogin()">          <ICountUp :startVal="ICountUp.startVal" :endVal="caseTotal" :decimals="ICountUp.decimals"         :duration="ICountUp.duration" :options="ICountUp.options" />         </span>        <div class="eleCtn ctn1">          <el-select v-model="timeValue" placeholder="请选择" @change="getMap">            <el-option              v-for="item in timeOptions"              :key="item.value"              :label="item.label"              :value="item.value">            </el-option>          </el-select>        </div>        <div class="eleCtn ctn2">          <el-select v-model="casetypeValue" placeholder="请选择" @change="getMap">            <el-option              v-for="item in casetypeOptions"              :key="item.value"              :label="item.label"              :value="item.value"            >            </el-option>          </el-select>        </div>        <div class="eleCtn ctn3">          <div :class="mapFlag === 'zhongguo'?'btn active':'btn'" @click="mapFlag = 'zhongguo'">户籍分布</div>          <div :class="mapFlag === 'shanghai'?'btn active':'btn'" @click="mapFlag = 'shanghai'">案件分布</div>        </div>      </span>      <div class="content"><span>案件总量</span></div>    </div>    <!-- 左侧栏 -->    <div class="sideBar sideBarLeft">      <div class="model model1">        <div class="title">法援案件</div>        <div class="box">          <div class="boxTitle" style="height:54px">            <span class="titles">今年在办</span>            <!-- {{inProgress|addComma}} -->            <span class="numbers">              <ICountUp :startVal="ICountUp.startVal" :endVal="inProgress" :decimals="ICountUp.decimals"               :duration="ICountUp.duration" :options="ICountUp.options"/>              <em>件</em>            </span>          </div>        </div>        <div class="box">          <div class="boxTitle">            <span class="titles">案件数量</span>            <div class="select">              <span :class="caseNumFlag === 'today'?'button active':'button'" @click="caseNumFlag='today'">今日</span>              <span :class="caseNumFlag === 'month'?'button active':'button'" @click="caseNumFlag='month'">本月</span>              <span :class="caseNumFlag === 'years'?'button active':'button'" @click="caseNumFlag='years'">全年</span>            </div>          </div>          <div class="boxContent boxContent1">            <div class="line">              <span class="span1">受理案件</span>              <!-- {{acceptCase[caseNumFlag]|addComma}} -->              <span class="span2">                <ICountUp :startVal="ICountUp.startVal" :endVal="acceptCase[caseNumFlag]" :decimals="ICountUp.decimals"               :duration="ICountUp.duration" :options="ICountUp.options"/>                <em>件</em>              </span>            </div>            <div class="line">              <span class="span1">办案结案</span>              <!-- {{finishCase[caseNumFlag]|addComma}} -->              <span class="span2">                <ICountUp :startVal="ICountUp.startVal" :endVal="finishCase[caseNumFlag]" :decimals="ICountUp.decimals"               :duration="ICountUp.duration" :options="ICountUp.options"/>                <em>件</em>              </span>            </div>          </div>        </div>        <div class="box">           <div class="boxTitle">            <span class="titles">久办不结</span>            <!-- {{timeoutNum|addComma}} -->            <span class="numbers">              <ICountUp :startVal="ICountUp.startVal" :endVal="timeoutNum" :decimals="ICountUp.decimals"               :duration="ICountUp.duration" :options="ICountUp.options"/>                <em>件</em>            </span>          </div>        </div>        <div class="box">          <div class="boxTitle">            <span class="titles">区域人案比</span>            <div class="select">              <span :class="personRatioFlag === 'today'?'button active':'button'" @click="personRatioFlag='today'">今日</span>              <span :class="personRatioFlag === 'month'?'button active':'button'" @click="personRatioFlag='month'">本月</span>              <span :class="personRatioFlag === 'years'?'button active':'button'" @click="personRatioFlag='years'">全年</span>            </div>          </div>          <div class="boxContent boxContent2">            <div v-for=" (item,index) in personRatio[personRatioFlag]" :key="index" class="line">              <span class="span1">{{item.name}}</span>              <div class="rate">                <div class="rated" :style="{width:rateCmp(item.value)}"></div>              </div>              <!-- {{item.value}} -->              <span class="span2">               <ICountUp :startVal="ICountUp.startVal" :endVal="item.value" :decimals="ICountUp.decimals"               :duration="ICountUp.duration" :options="ICountUp.options"/>              </span>            </div>            <div style="font-size: 26px;font-weight: bold;color: #aeedf9;text-align:center;line-height:126px" v-if=" personRatio[personRatioFlag].length === 0">暂无数据</div>          </div>        </div>        <div class="box flexbox">          <div class="boxTitle">            <span class="titles">趋势分析</span>            <div class="select">              <span class="button active">近7日</span>            </div>          </div>          <div class="boxContent boxContent3">            <g2-area style="width:100%;margin:auto" :height="130" :id="'area'" :is-smooth="true" :padding="['auto','auto']"              :axisColor = "{lineColor:'#4B6278', labelColor:'#FFFFFF'}" :useTooltip="false"              :data="trendAnalysis" :axis-name="{name:'年份', value:'案件数量'}">            </g2-area>          </div>        </div>      </div>      <div class="model model2">        <div class="title">法援力量</div>        <div class="box flexbox">          <div class="boxTitle" style="height:54px">            <span class="titles">今日指派律师</span>            <!-- {{lawerToday}} -->            <span class="numbers">              <ICountUp :startVal="ICountUp.startVal" :endVal="lawerToday" :decimals="ICountUp.decimals"               :duration="ICountUp.duration" :options="ICountUp.options"/>              <em>人</em>            </span>          </div>          <div class="boxContent boxContent3" style="position:relative">            <g2-liquidfill style="width: 200px;margin:auto" :id="'liquidfill'" :height="150" :color="{ backgroundColor: '#3454bd', labelColor: '#d4d8db' }"              :max-value="1" :is-percent="true" :data="[{ name: '剩余力量', value: percentRemain }]" :useTooltip="false">            </g2-liquidfill>            <div style="font-size:16px;color:#fff;position:absolute;left:0;right:0;margin:auto;bottom:3%;text-align:center">剩余力量</div>          </div>        </div>      </div>    </div>    <!-- 底部栏 -->    <div class="bottomCtn">      <div class="main">        <div class="boxLeft">          <div v-for="(item,index) in caseFrom.tongZhiLYFB" :key="index" class="circleCtn">            <span class="circle">{{item.name}}</span>            <span class="number">              {{item.value|numClear}}              <!-- <ICountUp :startVal="ICountUp.startVal" :endVal="item.value>1000?item.value/10000:item.value" :decimals="item.value>1000?2:0"              :duration="ICountUp.duration" :options="{useEasing: true, useGrouping: true, separator: ',', decimal: '.',Prefix:'',Suffix:`${item.value>1000?'万':''}`}"/> -->            </span>          </div>        </div>        <div class="boxMiddle"></div>        <div class="boxRight">           <div v-for="(item,index) in caseFrom.shenQingLYFB" :key="index" class="circleCtn">            <span class="circle">{{item.name}}</span>            <span class="number">              {{item.value|numClear}}              <!-- <ICountUp :startVal="ICountUp.startVal" :endVal="item.value>1000?item.value/10000:item.value" :decimals="item.value>1000?2:0"              :duration="ICountUp.duration" :options="{useEasing: true, useGrouping: true, separator: ',', decimal: '.',Prefix:'',Suffix:`${item.value>1000?'万':''}`}"/> -->            </span>          </div>        </div>      </div>    </div>    <!-- 右侧栏 -->    <div class="sideBar sideBarRight">      <div class="model">        <div class="title">风险预警</div>        <div class="box flexbox">          <div class="boxTitle" style="height:54px;background:transparent">            <!-- 这个空标签用于占位 -->            <span class=""></span>            <div class="select">              <span :class="riskWarningFlag === 'jinRi'?'button active':'button'" @click="riskWarningFlag='jinRi'">今日</span>              <span :class="riskWarningFlag === 'benYue'?'button active':'button'" @click="riskWarningFlag='benYue'">本月</span>              <span :class="riskWarningFlag === 'quanNian'?'button active':'button'" @click="riskWarningFlag='quanNian'">全年</span>            </div>          </div>           <div class="boxContent boxContent3" style="position:relative">             <div class="leftTop">               <!-- {{riskWarningArr[riskWarningFlag].zhongDaAJ   riskWarningArr[riskWarningFlag].qunTiAJ   riskWarningArr[riskWarningFlag].gaoWeiRQ}} -->               <span class="number">                  <ICountUp :startVal="ICountUp.startVal" :endVal="riskWarningArr[riskWarningFlag].zhongDaAJ   riskWarningArr[riskWarningFlag].qunTiAJ   riskWarningArr[riskWarningFlag].gaoWeiRQ" :decimals="ICountUp.decimals"                  :duration="ICountUp.duration" :options="{useEasing: true, useGrouping: true, separator: '', decimal: '.', suffix: ''}"/>               </span>               <span class="content">预警总量</span>             </div>             <div class="imgCtn">               <img src="../assets/image/rotate.gif" />               <div class="circle circle1" :number="riskWarningArr[riskWarningFlag].zhongDaAJ">重大案件</div>               <div class="circle circle3" :number="riskWarningArr[riskWarningFlag].gaoWeiRQ">高风险人员</div>               <div class="circle circle2" :number="riskWarningArr[riskWarningFlag].qunTiAJ">群体案件</div>             </div>           </div>        </div>      </div>      <div class="model">        <div class="title">热点洞察</div>        <div class="box flexbox">           <div class="boxContent boxContent3">            <g2-word-cloud :id="'wordcloud'" style="margin:auto" :height="220" :width="300"            :use-image = "false" :data="wordArr" :useTooltip="false">            </g2-word-cloud>           </div>        </div>      </div>      <div class="model">        <div class="title">申请现场</div>        <div class="box flexbox">           <div class="boxContent boxContent3">             <div class="videoCtn">              <div class="border borderleftT"></div>              <div class="border borderrightT"></div>              <div class="border borderleftB"></div>              <div class="border borderrightB"></div>              <video-player  class="video-player vjs-custom-skin"                ref="videoPlayer"                :playsinline="false"                :options="playerOptions"              ></video-player>             </div>           </div>        </div>      </div>    </div>    <!-- 地图模块 -->    <div class="middleCtn">      <mapview        :map-config="{center:mapFlag === 'shanghai'?randomCase.center:[110.142577,32.27719], zoom:mapFlag === 'shanghai'?11:4, pitch:mapFlag === 'shanghai'?60:0, bearing:0}"        :osm-config="{osmUrl: osmUrl, backgroundStyle: 'custombrightstyle'}"        :map-types="mapFlag === 'shanghai'?['extrusion']:['line','point']"        :line="{color: '#a6c84c', width: 2, opacity: 0.2, useCurve: true, showAnimation: true, data:mapData.map((item)=>{return [{lng: item.lng, lat: item.lat},{lng: 121.36, lat: 31.3}]})}"        :point="{maxValue:10000, minValue:0, color: '#a6c84c', textColor: '#6e6e6e', showAnimation: false, opacity: 0.8, maxRadius: 18, minRadius: 5, textOffset: 2, data: mapData}"        :extrusion="{offset:0.003,shape:'column', data: mapData2,color:'#6AFFFF',maxHeight:4000,minHeight:1000,maxValue:7000,minValue:0}"        @extrusionMouseenter="showTips"        @extrusionMouseleave="tipsFlag = false"        @pointMouseenter="showTips2"        @pointMouseleave="tipsFlag2 = false"        >        <popup :laglng="randomCase.center" name="预警弹窗" :html-content="          `<div class='popupCtn'>            <div class='popupTitle'>${randomCase.shiJianMC}</div>            <div class='popupContent bg1'>${randomCase.fengXianLX}</div>            <div class='popupContent bg2'>${randomCase.shiJian}</div>            <div class='popupContent bg3'>${randomCase.jiGou}</div>          </div>`          " :show-popup="mapFlag === 'shanghai'&&randomCase.fengXianLX!==''">        </popup>        <popup :laglng="tips.center" name="调委会tip" :html-content="          `<div class='tipsCtn'>            <div class='tipsNum'>${tips.value}<em>件</em></div>            <div class='tipsArea'>${tips.name}</div>          </div>`          " :show-popup="mapFlag === 'shanghai'&& tipsFlag === true">        </popup>        <popup :laglng="tips2.center" name="省份tip" :html-content="          `<div class='tipsCtn'>            <div class='tipsNum'>${tips2.value}<em>人</em></div>            <div class='tipsArea'>${tips2.name}受援人数</div>          </div>`          " :show-popup="mapFlag === 'zhongguo'&& tipsFlag2 === true">        </popup>      </mapview>    </div>  </div></template><script>import { legalCaseCount, legalCaseTrend, hotSpotInsight, riskWarning, caseEarlyWarning, mapDatas, videoUrl } from '@/api/index.js'import ICountUp from 'vue-countup-v2'export default {  name: 'home',  components: {    ICountUp  },  data () {    return {      ICountUp: {        startVal: 0,        decimals: 0,        duration: 3,        options: {          useEasing: true,          useGrouping: true,          separator: ' , ',          decimal: '.',          prefix: '',          suffix: ''        }      },      timeOptions: [{        value: 'YJ0001',        label: '今日'      }, {        value: 'YJ0002',        label: '本月'      }, {        value: 'YJ0003',        label: '今年'      }, {        value: 'YJ0004',        label: '至今'      }],      timeValue: 'YJ0003',      casetypeOptions: [{        value: 'YJ0101',        label: '民事'      }, {        value: 'YJ0102',        label: '刑事'      }, {        value: 'YJ0103',        label: '全部'      }],      casetypeValue: 'YJ0103',      wordArr: [{        name: '暂无',        value: 10      }],      playerOptions: {        playbackRates: [], // 播放速度        autoplay: true, // 如果true,浏览器准备好时开始回放。        muted: true, // 默认情况下将会消除任何音频。        loop: true, // 导致视频一结束就重新开始。        preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)        language: 'zh-CN',        aspectRatio: '16:9', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")        fluid: false, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。        sources: [{          type: 'video/mp4',          src: videoUrl // url地址        }],        poster: '', // 你的封面地址        notSupportedMessage: '此视频暂无法播放,请稍后再试', // 允许覆盖Video.js无法播放媒体源时显示的默认信息。        controlBar: {          timeDivider: false,          durationDisplay: false,          remainingTimeDisplay: false,          fullscreenToggle: false // 全屏按钮        }      },      inProgress: 0, // 今年在办案件数量      timeoutNum: 0, // 久办不结      lawerToday: 0, // 今日指派律师      percentRemain: 0, // 律师剩余力量      caseTotal: 0, // 案件总量      acceptCase: {        today: 0,        month: 0,        years: 0      }, // 受理案件      finishCase: {        today: 0,        month: 0,        years: 0      }, // 办案结案      caseNumFlag: 'years',      personRatio: {        today: [{          name: '暂无',          value: 0        }, {          name: '暂无',          value: 0        }, {          name: '暂无',          value: 0        }],        month: [{          name: '暂无',          value: 0        }, {          name: '暂无',          value: 0        }, {          name: '暂无',          value: 0        }],        years: [{          name: '暂无',          value: 0        }, {          name: '暂无',          value: 0        }, {          name: '暂无',          value: 0        }]      }, // 区域人案比      personRatioFlag: 'years',      trendAnalysis: [],      riskWarningArr: {        benYue: {          gaoWeiRQ: 0,          qunTiAJ: 0,          zhongDaAJ: 0        },        jinRi: {          gaoWeiRQ: 0,          qunTiAJ: 0,          zhongDaAJ: 0        },        quanNian: {          gaoWeiRQ: 0,          qunTiAJ: 0,          zhongDaAJ: 0        }      },      riskWarningFlag: 'quanNian',      caseFrom: {        shenQingLYFB: [],        tongZhiLYFB: []      }, // 来源分析      mapData: [],      mapData2: [],      mapFlag: 'shanghai',      osmUrl: process.env.VUE_APP_OSMURL,      caseArr: [],      randomCase: {        fengXianLX: '',        jiGou: '',        center: [121.46, 31.22],        shiJian: '',        shiJianMC: ''      },      tipsFlag: false,      tips: {        center: [],        value: 0,        name: ''      },      tipsFlag2: false,      tips2: {        center: [],        value: 0,        name: ''      }    }  },  computed: {    mapMaxVal () {      let max = 0      this.mapData.forEach((item) => {        max = item.value > max ? item.value : max      })      return max    },    mapMinVal () {      let min = 0      if (this.mapData[0].value) {        min = this.mapData[0].value      }      this.mapData.forEach((item) => {        min = item.value < min ? item.value : min      })      return min    }  },  filters: {    // 数字加逗号    addComma (val) {      var b = parseInt(val).toString()      var len = b.length      if (len <= 3) { return b }      var r = len % 3      return r > 0 ? b.slice(0, r)   ','   b.slice(r, len).match(/\d{3}/g).join(',') : b.slice(r, len).match(/\d{3}/g).join(',')    },    // 数字精简    numClear (val) {      return val < 1000 ? val : (val / 10000).toFixed(2)   '万'    }  },  methods: {    // 区域人案比特殊计算方式    rateCmp (val) {      let max = this.personRatio[this.personRatioFlag][0].value      return 0.8 * val / max * 100   '%'    },    // 日期处理    dateFormat (val) {      let newDate = new Date(val)      let valueFormat = 'MM / dd'      let date = {        'yy': newDate.getFullYear(),        'MM': newDate.getMonth()   1,        'dd': newDate.getDate(),        'hh': newDate.getHours(),        'mm': newDate.getMinutes(),        'ss': newDate.getSeconds(),        'D': ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'][newDate.getDay()]      }      // 输出年 y :匹配1个到多个y,i:忽略大小写      if (/(y )/i.test(valueFormat)) {        valueFormat = valueFormat.replace(RegExp.$1, (newDate.getFullYear()   '').substr(4 - RegExp.$1.length))      }      // 输出月、日、时、分、秒、星期      Object.keys(date).forEach(function (i) {        // 只有写成`(${i})`形式,才能在正则表达式中捕获子匹配,进而才能用到RegExp.$1的值        if (new RegExp(`(${i})`).test(valueFormat)) {          // 判断,如果时间为一位数,则在前面加'0'          if (RegExp.$1.length === 2) {            if (date[i] < 10) {              date[i] = `0${date[i]}`            }          }          // 替换初始化函数时候传入yyyy-mm-dd hh:mm:ss D          valueFormat = valueFormat.replace(RegExp.$1, date[i])        }      })      return valueFormat    },    // 地图取数据    getMap () {      let _this = this      mapDatas({        time: _this.timeValue,        casetype: _this.casetypeValue      }).then((res) => {        if (res.data.code === 1) {          let data = res.data.data          _this.caseFrom.shenQingLYFB = data.shenQingLYFB          _this.caseFrom.tongZhiLYFB = data.tongZhiLYFB          _this.mapData = data.shouYuanRHJFB          _this.mapData2 = data.faYuanSLFB.map((item) => {            return {              'value': item.value,              'lat': item.lat,              'lng': item.lng,              'name': item.name            }          })        }      })    },    // 鼠标移入柱图    showTips (ev) {      this.tips.center = [ev.lng, ev.lat]      this.tips.value = ev.value      this.tips.name = ev.name      this.tipsFlag = true    },    // 鼠标移入点图    showTips2 (ev) {      this.tips2.center = [ev.lng, ev.lat]      this.tips2.value = ev.value      this.tips2.name = ev.name      this.tipsFlag2 = true    },    setFinereportLogin () {      let username = 'demo'      let password = 'demo'      let url = process.env.VUE_APP_FINREPORTURL      // 创建iframe      let scr = document.createElement('iframe')      // 将报表验证用户名密码的地址指向此iframe      scr.src = url   '/login/cross/domain?fine_username='   username   '&fine_password='   password   '&validity=-1'   '&callback='      if (scr.attachEvent) { // 判断是否为ie浏览器        // 如果为ie浏览器则页面加载完成后立即执行        scr.attachEvent('onload', function () {          // 直接跳转到数据决策系统          window.open(url)        })      } else {        // 其他浏览器则重新加载onload事件        scr.onload = function () {          // 直接跳转到数据决策系统          window.open(url)        }      }      // 将iframe标签嵌入到head中      document.getElementsByTagName('head')[0].appendChild(scr)    }  },  mounted () {    let _this = this    legalCaseCount().then((res) => {      if (res.data.code === 1) {        let data = res.data.data        _this.inProgress = data.inProgress        _this.timeoutNum = data.timeoutNum        _this.lawerToday = data.lawerCount.lawerToday        _this.percentRemain = data.lawerCount.percentRemain        _this.caseTotal = data.caseTotal      }    })    legalCaseTrend().then((res) => {      if (res.data.code === 1) {        let data = res.data.data        _this.acceptCase = data.caseNum.acceptCase        _this.finishCase = data.caseNum.finishCase        _this.personRatio = data.personRatio        _this.trendAnalysis = data.trendAnalysis.map((item) => {          item.name = _this.dateFormat(item.name)          return item        })      }    })    hotSpotInsight().then((res) => {      if (res.data.code === 1) {        _this.wordArr = res.data.data      }    })    riskWarning().then((res) => {      if (res.data.code === 1) {        _this.riskWarningArr = res.data.data      }    })    caseEarlyWarning().then((res) => {      if (res.data.code === 1) {        _this.caseArr = res.data.data      }    })    _this.getMap()    // 设置定时器    setInterval(() => {      let len = _this.caseArr.length      if (len !== 0) {        let cases = _this.caseArr[Math.round(Math.random() * (len - 1))]        _this.randomCase = {          fengXianLX: cases.fengXianLX,          jiGou: cases.jiGou,          center: [(Number(cases.lng) - 0.01), cases.lat],          shiJian: cases.shiJian,          shiJianMC: cases.shiJianMC        }      }    }, 15000)  }}</script><style lang="less">.video-player{  padding: 0 15px;  position: relative;  height: 100%;  // 视频居中  #vjs_video_3{    position: absolute!important;    left: 2px;    top: 2px;    right:2px;    bottom: 2px;    margin: auto;  }}.vjs-custom-skin{  background: transparent;}// 选择框.homeCtn .el-select .el-input__inner{  color: #19C8E2;  height: 36px;  background: #021326;  border-color:#014760;}.homeCtn .el-select .el-input.is-focus .el-input__inner{  border-color:#014760;}.el-select-dropdown{  margin-top: 0!important;  background: #021326;  border: 0;  border-color:#014760;  color: #19C8E2;}.el-select-dropdown__item.hover, .el-select-dropdown__item:hover{  background: #014760;  color:white;}.el-select-dropdown__item.selected{  color: #19C8E2;}.homeCtn .el-select{  width:100px;}.el-popper[x-placement^=bottom] .popper__arrow,.el-popper[x-placement^=bottom] .popper__arrow::after{    border-bottom-color: #021326 !important;}//地图随即框样式修改.homeCtn .mapboxgl-popup-anchor-bottom .mapboxgl-popup-tip{  border:0;}.homeCtn .mapboxgl-popup-content{  padding:0;  background: transparent;}.homeCtn .mapboxgl-popup-close-button{  clip:rect(0,0,0,0)}.popupCtn{  position: relative;  padding:24px 24px 24px 16px;  max-width: 300px;  min-width: 220px;  border-top: 2px solid #20D9F0;  border-bottom:2px solid #20D9F0;  background: rgba(0,14,25,0.8);  top: -40px;}.popupCtn::after{  content:url('../assets/image/pic_location.png');  position: absolute;  bottom: -47px;  width: 100%;  left: 0;  text-align: center;}.popupCtn .popupTitle{  line-height: 28px;  padding: 4px 0 16px 0;  color:#19C8E2;  font-size:20px;}.popupCtn .popupContent{  font-size:16px;  line-height: 28px;  color:#FFFFFF;  padding-left: 28px;  background-position: left center;  background-repeat: no-repeat;}.popupCtn .bg1{  background-image: url('../assets/image/icon_type.png')}.popupCtn .bg2{  background-image: url('../assets/image/icon_time.png')}.popupCtn .bg3{  background-image: url('../assets/image/icon_place.png')}// 地图提示框样式.tipsCtn{  min-width: 141px;  padding: 0 10px;  border-top: 2px solid #20D9F0;  background: rgba(0,14,25,0.8);}.tipsCtn .tipsNum{  color:#19C8E2;  font-size:24px;  font-family:Acens;  padding-top: 20px;  text-align: center;}.tipsCtn .tipsNum em{  font-size:14px;  font-family:MicrosoftYaHei;  font-weight:400;  color:rgba(255,255,255,0.4);  font-style: normal;  margin-left: 4px;}.tipsCtn .tipsArea{  text-align: center;  font-size:16px;  color:rgba(255,255,255,0.8);  padding-bottom: 12px;}</style><style lang="less" scoped>  @import '~@/assets/css/home.less';</style>

五、更多干货

1.如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “👍点赞” “✍️评论” “💙收藏” 一键三连哦!

2.【👇🏻👇🏻👇🏻关注我| 获取更多源码 | 优质文章】 带您学习各种前端插件、3D炫酷效果、图片展示、文字效果、以及整站模板 、大学生毕业HTML模板 、期末大作业模板 、Echarts大数据可视化, 等! 「一起探讨 web前端 ,Node ,Java 知识,互相学习」!

3.以上内容技术相关问题😈欢迎一起交流学习👇🏻👇🏻👇🏻🔥