祁阳图书馆智慧大屏
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

874 lines
31 KiB

1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
  1. <template>
  2. <div class="map-wrapper">
  3. <div class="map-content">
  4. <div class="lib-info">
  5. <div class="database-title">{{ libCurrent && libCurrent.name }}</div>
  6. <div class="lib-content">
  7. <swiper v-if="swiperOption" :key="swiperKey" ref="mySwiper" class="swiperLib" :options="swiperOption">
  8. <swiper-slide v-for="(item,index) in displayedImages" :key="index">
  9. <div class="book-img" style="width: 100%; height: 3rem;">
  10. <img :src="item.cover" :onerror="defaultImg" style="width: 100%;">
  11. </div>
  12. </swiper-slide>
  13. <!-- 标页码 -->
  14. <div slot="pagination" class="swiper-pagination" />
  15. </swiper>
  16. <ul class="lib-cont-item lib-cont01">
  17. <li>
  18. <img src="@/assets/images/map_18.png" alt="">
  19. <p>
  20. <span>藏书量</span>
  21. <span>4787<i></i></span>
  22. </p>
  23. </li>
  24. <li>
  25. <img src="@/assets/images/map_20.png" alt="">
  26. <p>
  27. <span>办证量</span>
  28. <span>74<i></i></span>
  29. </p>
  30. </li>
  31. </ul>
  32. <ul class="lib-cont-item lib-cont02">
  33. <li>
  34. <img src="@/assets/images/map_28.png" alt="">
  35. <p>
  36. <span>占地面积</span>
  37. <span>45<i>平方米</i></span>
  38. </p>
  39. </li>
  40. </ul>
  41. <div class="scroll-container">
  42. <div ref="marquee" class="lib-text" :style="{ top: position + 'px' }">关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通知关于XXX的通</div>
  43. </div>
  44. </div>
  45. </div>
  46. <div ref="chart" style="width: calc(100% - 11.875rem); height: 100%; margin:0 .125rem; z-index: 9999;" />
  47. <div class="map-hx-bg">
  48. <div class="map-hx-small" />
  49. <div class="map-hx-big" />
  50. </div>
  51. <div class="read-num">
  52. <div class="database-title">读者统计</div>
  53. <div class="online">
  54. <p>累计办证人数</p>
  55. <p class="num"><span>156</span><i></i></p>
  56. </div>
  57. <div class="lending-ranking">
  58. <h5>借阅Top10</h5>
  59. <div class="ranking-cont">
  60. <ul class="ranking-title">
  61. <li style="width: 0.8rem;">排名</li>
  62. <li style="width: 1.5rem; text-align: left; padding-left: 0.25rem;">姓名</li>
  63. <li style="flex:1;" />
  64. <li style="width: 1.75rem; text-align: right; padding-right: .375rem;">借阅次数</li>
  65. </ul>
  66. <ul class="ranking-list">
  67. <li v-for="(item,index) in rankingWithPercentage" :key="index" :class="{ 'hovered': index === currentHover }">
  68. <div style="width: 1rem; color: #79B8FF;" :class="[{'ranking-num1':index===0},{'ranking-num2':index===1},{'ranking-num3':index===2}]">{{ index>=3 ? index+1 : null }}</div>
  69. <div style="width: 1.5rem; text-align: left; padding-left: .25rem;">{{ item.name }}</div>
  70. <div class="ranking-progress" style="flex:1; align-self: center;">
  71. <el-progress :percentage="item.percentage" :stroke-width="8" :show-text="false" color="#009afb" />
  72. </div>
  73. <div style="width: 1.75rem; text-align: right; padding-right: .375rem;">{{ item.num }}<i></i></div>
  74. </li>
  75. </ul>
  76. </div>
  77. </div>
  78. </div>
  79. </div>
  80. </div>
  81. </template>
  82. <script>
  83. import mapJson from '@/assets/json/qy.json'
  84. import libJson from '@/assets/json/lib2.json'
  85. import libJsonData from '@/assets/json/lib.json'
  86. import { debounce } from 'lodash' // js工具类,按需加载
  87. import { swiper, swiperSlide } from 'vue-awesome-swiper'
  88. import 'swiper/dist/css/swiper.css'
  89. export default {
  90. name: 'Map',
  91. components: {
  92. swiper, swiperSlide
  93. },
  94. data() {
  95. return {
  96. currentHover: -1,
  97. timeTicket: null,
  98. defaultImg: 'this.src="' + require('@/assets/images/default-img.png') + '"',
  99. count: 0,
  100. len: 0, // 轮播数组的长度, 通过 count % len 可以得到[0, len-1] 数组下标
  101. headerTitle: '祁阳图书馆',
  102. libInfoData: [],
  103. libImg: [
  104. {
  105. 'id': 1,
  106. 'cover': require('../../assets/images/lib.jpg')
  107. },
  108. {
  109. 'id': 2,
  110. 'cover': require('../../assets/images/lib2.jpg')
  111. },
  112. {
  113. 'id': 3,
  114. 'cover': require('../../assets/images/lib3.jpg')
  115. },
  116. {
  117. 'id': 4,
  118. 'cover': require('../../assets/images/lib4.jpg')
  119. },
  120. {
  121. 'id': 5,
  122. 'cover': require('../../assets/images/lib5.jpg')
  123. }
  124. ],
  125. libIndex: 0,
  126. libCurrent: null,
  127. swiperKey: 1,
  128. currentIndex: 0,
  129. displayedImages: [],
  130. swiperOption: null,
  131. seriesData: [],
  132. mapImg: require('../../assets/images/map-bg2.png'),
  133. rankingData: [
  134. { id: 1, num: 718, name: '胡图图' },
  135. { id: 2, num: 447, name: '张三三' },
  136. { id: 3, num: 261, name: '李晓明' },
  137. { id: 4, num: 242, name: '胡图图' },
  138. { id: 5, num: 165, name: '胡图图' },
  139. { id: 6, num: 140, name: '胡图图' },
  140. { id: 7, num: 120, name: '胡图图' },
  141. { id: 8, num: 100, name: '胡图图' },
  142. { id: 9, num: 70, name: '胡1' },
  143. { id: 10, num: 60, name: '胡图图' }
  144. ],
  145. rankingWithPercentage: [],
  146. timer: null,
  147. position: 0,
  148. speed: 2 // 滚动速度,可根据需要调整
  149. }
  150. },
  151. computed: {
  152. swiper() {
  153. return this.$refs.mySwiper.swiper
  154. }
  155. },
  156. beforeDestroy() {
  157. clearTimeout(this.timeTicket)
  158. window.removeEventListener('resize', this.resize)
  159. this.stopScrolling()
  160. },
  161. created() {
  162. this.libInfoData = libJsonData
  163. },
  164. mounted() {
  165. if (localStorage.getItem('countItem')) {
  166. this.count = parseInt(localStorage.getItem('countItem'))
  167. } else {
  168. this.count = 0
  169. }
  170. this.initChart() // 初始化
  171. setTimeout(() => {
  172. this.updateChart() // 更新数据,散点轮播显示
  173. window.addEventListener('resize', debounce(this.resize, 2000)) // 使用事件捕获,由外层向内
  174. }, 300)
  175. this.rankingDataComputed()
  176. if (document.getElementsByClassName('scroll-container')[0]) {
  177. this.startScrolling()
  178. }
  179. setInterval(() => {
  180. this.currentHover = (this.currentHover + 1) % this.rankingData.length
  181. }, 1000)
  182. },
  183. methods: {
  184. escapeHtml(str) {
  185. var arrEntities = {
  186. 'lt': '<',
  187. 'gt': '>',
  188. 'nbsp': ' ',
  189. 'amp': '&',
  190. 'quot': '"'
  191. }
  192. return str.replace(/&(lt|gt|nbsp|amp|quot|pre);/ig, function(all, t) {
  193. return arrEntities[t]
  194. })
  195. },
  196. startScrolling() {
  197. this.timer = setInterval(() => {
  198. this.position -= this.speed
  199. // 当文字完全滚出容器时,重置位置
  200. const containerHeight = document.getElementsByClassName('scroll-container')[0].offsetHeight
  201. const contentHeight = this.$refs.marquee.offsetHeight
  202. if (contentHeight <= containerHeight) {
  203. this.position = 20
  204. } else if (Math.abs(this.position) >= contentHeight) {
  205. this.position = containerHeight
  206. }
  207. }, 40)
  208. },
  209. stopScrolling() {
  210. if (this.timer) {
  211. clearInterval(this.timer)
  212. console.log('离开页面 this.libIndex', this.libIndex)
  213. console.log('离开页面 this.libCurrent', this.libCurrent)
  214. console.log('离开页面 this.count', this.count)
  215. localStorage.setItem('libIndexItem', this.libIndex)
  216. localStorage.setItem('libCurrentItem', this.libCurrent)
  217. localStorage.setItem('countItem', this.count)
  218. }
  219. },
  220. rankingDataComputed() {
  221. const firstPlaceNum = this.rankingData[0].num
  222. this.rankingWithPercentage = this.rankingData.map(item => {
  223. if (item.name.length === 2) {
  224. // 截取name 字符串截取第一个字符,
  225. item.name = item.name.substring(0, 1) + ' * '
  226. } else if (item.name.length === 3) {
  227. // 截取第一个和第三个字符
  228. item.name = item.name.substring(0, 1) + ' * ' + item.name.substring(2, 3)
  229. } else if (item.name.length > 3) {
  230. // 截取第一个和大于第4个字符
  231. item.name = item.name.substring(0, 1) + ' * ' + ' * ' + item.name.substring(3, item.name.length)
  232. }
  233. const percentage = (item.num / firstPlaceNum) * 100
  234. return { ...item, percentage }
  235. })
  236. },
  237. initChart() {
  238. this.$echarts.registerMap('qiyang', mapJson) // 注册map
  239. this.myChart = this.$echarts.init(this.$refs.chart) // echarts容器实例化
  240. var mapImg = document.createElement('img')
  241. mapImg.style.height = mapImg.height = mapImg.width = mapImg.style.width = '1px'
  242. mapImg.src = require('../../assets/images/map-bg2.png')
  243. var XAData = [
  244. [{ name: '陶铸图书馆' }, { name: '陶铸图书馆', value: '陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸陶铸' }],
  245. [{ name: '陶铸图书馆' }, { name: '龙山街道分馆', value: '龙山街道龙山街道龙山街道龙山街道龙山街道龙山街道' }],
  246. [{ name: '陶铸图书馆' }, { name: '黎家坪分馆', value: '龙山街道龙山街道龙山街道龙山街道龙山街道龙山街道' }],
  247. [{ name: '陶铸图书馆' }, { name: '大村甸分馆', value: '龙山街道龙山街道龙山街道龙山街道龙山街道' }],
  248. [{ name: '陶铸图书馆' }, { name: '邵家岭自助馆', value: '邵家岭' }],
  249. [{ name: '陶铸图书馆' }, { name: '下马渡分馆', value: '下马渡' }],
  250. [{ name: '陶铸图书馆' }, { name: '复兴路自助馆', value: '复兴路' }],
  251. [{ name: '陶铸图书馆' }, { name: '七里桥分馆', value: '七里桥' }],
  252. [{ name: '陶铸图书馆' }, { name: '少儿馆', value: '少儿馆' }],
  253. [{ name: '陶铸图书馆' }, { name: '茅竹镇分馆', value: '祁阳县茅竹镇' }],
  254. [{ name: '陶铸图书馆' }, { name: '观音滩镇分馆', value: '观音滩镇' }],
  255. [{ name: '陶铸图书馆' }, { name: '凯俊盛科城分馆', value: '凯俊盛科城' }],
  256. [{ name: '陶铸图书馆' }, { name: '进宝塘镇分馆', value: '进宝塘镇' }],
  257. [{ name: '陶铸图书馆' }, { name: '三口塘镇分馆', value: '三口塘镇' }],
  258. [{ name: '陶铸图书馆' }, { name: '肖家镇分馆', value: '肖家镇' }],
  259. [{ name: '陶铸图书馆' }, { name: '潘市镇分馆', value: '潘市镇' }],
  260. [{ name: '陶铸图书馆' }, { name: '大忠桥镇分馆', value: '大忠桥镇' }],
  261. [{ name: '陶铸图书馆' }, { name: '浯溪街道分馆', value: '浯溪街道' }],
  262. [{ name: '陶铸图书馆' }, { name: '长虹街道分馆', value: '长虹街道' }],
  263. [{ name: '陶铸图书馆' }, { name: '白水镇分馆', value: '白水镇' }],
  264. [{ name: '陶铸图书馆' }, { name: '白竹湖自助馆', value: '白竹湖' }]
  265. ]
  266. var convertData = function(data) {
  267. var res = []
  268. for (var i = 0; i < data.length; i++) {
  269. var dataItem = data[i]
  270. var fromCoord = libJson[dataItem[0].name]
  271. var toCoord = libJson[dataItem[1].name]
  272. if (fromCoord && toCoord) {
  273. res.push({
  274. fromName: dataItem[0].name,
  275. toName: dataItem[1].name,
  276. coords: [fromCoord, toCoord],
  277. value: dataItem[1].value
  278. })
  279. }
  280. }
  281. return res
  282. }
  283. var series = [];
  284. [
  285. ['陶铸图书馆', XAData]
  286. ].forEach(function(item, i) {
  287. series.push(
  288. {
  289. name: item[0],
  290. type: 'effectScatter',
  291. symbol: 'image://' + require('@/assets/images/map_10.png'),
  292. symbolSize: [26, 20],
  293. coordinateSystem: 'geo',
  294. zlevel: 3,
  295. selectedMode: false,
  296. rippleEffect: {
  297. // brushType: 'stroke',
  298. color: 'transparent'
  299. // scale: 1.5
  300. },
  301. label: {
  302. normal: {
  303. show: true,
  304. position: 'right',
  305. formatter: ''
  306. }
  307. },
  308. itemStyle: {
  309. normal: {
  310. color: 'transparent',
  311. areaColor: 'transparent'
  312. },
  313. emphasis: {
  314. areaColor: '#2B91B7'
  315. }
  316. },
  317. tooltip: {
  318. show: true
  319. },
  320. data: item[1].map(function(dataItem) {
  321. return {
  322. name: dataItem[1].name,
  323. value: libJson[dataItem[1].name].concat([dataItem[1].value]),
  324. place: dataItem[1].value
  325. }
  326. })
  327. },
  328. {
  329. name: item[0],
  330. type: 'lines',
  331. zlevel: 1,
  332. effect: {
  333. show: true,
  334. period: 6,
  335. trailLength: 0.7,
  336. color: 'red', // arrow箭头的颜色
  337. symbolSize: 3
  338. },
  339. lineStyle: {
  340. normal: {
  341. color: '#fff',
  342. width: 0,
  343. curveness: 0.2
  344. }
  345. },
  346. tooltip: {
  347. show: false
  348. },
  349. data: convertData(item[1])
  350. },
  351. {
  352. name: item[0],
  353. type: 'lines',
  354. zlevel: 2,
  355. symbol: ['none', 'arrow'],
  356. symbolSize: 10, // 固定箭头大小
  357. effect: {
  358. show: true,
  359. period: 6,
  360. trailLength: 0,
  361. symbol: 'arrow',
  362. symbolSize: 10 // 动态箭头大小
  363. },
  364. lineStyle: {
  365. normal: {
  366. color: '#fff',
  367. width: 1,
  368. opacity: 0.6,
  369. curveness: 0.2
  370. }
  371. },
  372. tooltip: {
  373. show: false
  374. },
  375. data: convertData(item[1])
  376. }
  377. )
  378. })
  379. this.seriesData = series
  380. const initOption = {
  381. // {a}<br/>
  382. // 提示框
  383. tooltip: {
  384. trigger: 'item',
  385. triggerOn: 'click',
  386. showContent: true, // 是否显示提示框浮层
  387. alwaysShowContent: true, // 是否一直显示提示框内容
  388. // hideDelay: 100, // 浮层隐藏的延迟
  389. enterable: 'mousemove|click',
  390. padding: [0, 0, 0, 0],
  391. backgroundColor: null,
  392. position: function(point, params, dom, rect, size) {
  393. // console.log('point', point)
  394. // console.log('params', params)
  395. // console.log('dom', dom)
  396. // console.log('rect', rect)
  397. // console.log('size', size)
  398. return [point[0] + 14, point[1] - 164]
  399. },
  400. formatter: (params, ticket, callback) => {
  401. if (params.seriesType === 'effectScatter') {
  402. return `<div class='tooltip-main' >
  403. <div class='tooltip-line'></div>
  404. <div class='tooltip-content'>
  405. <div class='title'>${params.data.name}</div>
  406. <div class='place'>地址${params.data.place}</div>
  407. </div>
  408. </div>`
  409. } else if (params.seriesType === 'lines') {
  410. return (
  411. params.data.fromName +
  412. '>' +
  413. params.data.toName +
  414. '<br />' +
  415. params.data.value
  416. )
  417. } else {
  418. return params.name
  419. }
  420. }
  421. },
  422. // 设置geo坐标系
  423. geo: [
  424. {
  425. map: 'qiyang',
  426. aspectScale: 1,
  427. zoom: 1.1,
  428. top: '6%', // 距离顶部的位置,每层向下一个百分比
  429. left: '11%',
  430. roam: false, // 是否开启平游或缩放
  431. z: 6, // 可以看成是css的z-index,数字越大图层越高,我这里设置了5个,然后页面有点卡,根据实际需要来添加,3个其实就能看出效果了
  432. itemStyle: {
  433. areaColor: {
  434. type: 'linear',
  435. x: 0,
  436. y: 0,
  437. x2: 1,
  438. y2: 1,
  439. colorStops: [{
  440. offset: 0, color: 'rgba(0,0,0,.1)'
  441. }, {
  442. offset: 0.8, color: 'rgba(59,143,248,.6)'
  443. }],
  444. global: false
  445. },
  446. borderColor: '#9ffcff',
  447. borderWidth: 1
  448. },
  449. emphasis: {
  450. itemStyle: {
  451. areaColor: {
  452. type: 'linear',
  453. x: 0,
  454. y: 0,
  455. x2: 1,
  456. y2: 1,
  457. colorStops: [{
  458. offset: 0, color: 'rgba(0,0,0,.1)'
  459. }, {
  460. offset: 0.8, color: 'rgba(59,143,248,.6)'
  461. }],
  462. global: false
  463. } // 鼠标移上去时区域的颜色
  464. }
  465. },
  466. label: {
  467. emphasis: {
  468. show: false,
  469. color: '#fff'
  470. }
  471. },
  472. tooltip: {
  473. show: true
  474. }
  475. },
  476. {
  477. map: 'qiyang',
  478. aspectScale: 1,
  479. zoom: 1.1,
  480. top: '6%', // 距离顶部的位置,每层向下一个百分比
  481. left: '11%',
  482. roam: false, // 是否开启平游或缩放
  483. z: 5, // 可以看成是css的z-index,数字越大图层越高,我这里设置了5个,然后页面有点卡,根据实际需要来添加,3个其实就能看出效果了
  484. itemStyle: {
  485. areaColor: {
  486. type: 'pattern',
  487. image: mapImg,
  488. repeat: 'repeat'
  489. }, // 每个图层的背景色,根据需要来调,由亮变暗,下面的几个颜色也一样
  490. borderColor: '#9ffcff',
  491. borderWidth: 3,
  492. shadowColor: '#4cd4eb',
  493. shadowOffsetX: 0,
  494. shadowOffsetY: 0,
  495. shadowBlur: 0,
  496. emphasis: { // 地图悬停高亮样式
  497. areaColor: {
  498. type: 'pattern',
  499. image: mapImg,
  500. repeat: 'repeat'
  501. }
  502. }
  503. },
  504. emphasis: {
  505. disabled: true,
  506. areaColor: '#01215c'
  507. },
  508. label: {
  509. emphasis: {
  510. show: false,
  511. color: '#fff'
  512. }
  513. },
  514. tooltip: {
  515. show: false
  516. }
  517. },
  518. {
  519. map: 'qiyang',
  520. aspectScale: 1,
  521. zoom: 1.1,
  522. top: '7%', // 根据自己需要来设置
  523. left: '10%',
  524. roam: false, // 是否开启平游或缩放
  525. z: 4, // 变小,也就是被压在下面
  526. itemStyle: {
  527. areaColor: '#05498f', // 记得改颜色
  528. borderColor: '#0296cf',
  529. borderWidth: 2,
  530. shadowColor: '#0296cf',
  531. shadowOffsetX: 0,
  532. shadowOffsetY: 0,
  533. shadowBlur: 0,
  534. emphasis: { // 地图悬停高亮样式
  535. disabled: true,
  536. areaColor: '#05498f'
  537. }
  538. },
  539. tooltip: {
  540. show: false
  541. }
  542. },
  543. {
  544. map: 'qiyang',
  545. aspectScale: 1,
  546. zoom: 1.1,
  547. top: '9%', // 根据自己需要来设置
  548. left: '9%',
  549. roam: false,
  550. z: 3, // 变小,也就是被压在下面
  551. itemStyle: {
  552. areaColor: 'rgba(3,106,183,.5)', // 记得改颜色
  553. borderColor: '#025792',
  554. borderWidth: 2,
  555. shadowColor: '#025792',
  556. shadowOffsetX: 0,
  557. shadowOffsetY: 0,
  558. shadowBlur: 0,
  559. emphasis: { // 地图悬停高亮样式
  560. areaColor: 'rgba(3,106,183,.5)'
  561. }
  562. },
  563. tooltip: {
  564. show: false
  565. }
  566. },
  567. {
  568. map: 'qiyang',
  569. aspectScale: 1,
  570. zoom: 1.1,
  571. top: '11%', // 根据自己需要来设置
  572. left: '8%',
  573. roam: false,
  574. z: 2, // 变小,也就是被压在下面
  575. itemStyle: {
  576. areaColor: 'rgba(3,106,183,.2)', // 记得改颜色
  577. borderColor: '#195175',
  578. borderWidth: 1,
  579. shadowColor: '#0f4c74',
  580. shadowOffsetX: 0,
  581. shadowOffsetY: 4,
  582. shadowBlur: 10,
  583. emphasis: { // 地图悬停高亮样式
  584. areaColor: 'rgba(3,106,183,.2)'
  585. }
  586. },
  587. tooltip: {
  588. show: false
  589. }
  590. },
  591. {
  592. map: 'qiyang',
  593. aspectScale: 1,
  594. zoom: 1.1,
  595. top: '12%', // 根据自己需要来设置
  596. left: '10%',
  597. roam: false,
  598. z: 1, // 变小,也就是被压在下面
  599. itemStyle: {
  600. areaColor: 'rgba(0,0,0,.6)', // 记得改颜色
  601. borderColor: 'rgba(0,0,0,.6)',
  602. borderWidth: 2,
  603. shadowColor: 'rgba(0,0,0,.6)',
  604. shadowOffsetX: 0,
  605. shadowOffsetY: 4,
  606. shadowBlur: 10,
  607. emphasis: { // 地图悬停高亮样式
  608. areaColor: 'rgba(0,0,0,.6)'
  609. }
  610. },
  611. tooltip: {
  612. show: false
  613. }
  614. }
  615. ],
  616. series: series
  617. }
  618. setTimeout(() => {
  619. this.myChart.setOption(initOption)
  620. }, 200)
  621. },
  622. updateChart() {
  623. // 地图数据
  624. // const mapData = mapJson.features.map((item) => {
  625. // return {
  626. // name: item.properties.name,
  627. // value: Math.round(Math.random() * 100),
  628. // centroid: item.properties.centroid,
  629. // adcode: item.properties.adcode
  630. // }
  631. // })
  632. // 散点数据
  633. // const scatterData = libJsonData
  634. // const scatterData = mapData.map((item) => {
  635. // return {
  636. // name: item.name,
  637. // value: item.centroid
  638. // ? item.centroid.concat(item.value)
  639. // : item.centroid, // [经, 纬度, 值]
  640. // itemStyle: {
  641. // color: 'red'
  642. // }
  643. // // adcode: item.adcode,
  644. // }
  645. // })
  646. // const updateOption = {
  647. // series: [
  648. // {
  649. // data: mapData // type: 'map'
  650. // },
  651. // {
  652. // data: mapData // type: 'map'
  653. // },
  654. // {
  655. // data: scatterData // type: 'effectScatter'
  656. // }
  657. // ]
  658. // }
  659. this.len = this.seriesData[0].data.length // 此处设置的是需要轮播的次数
  660. console.log('this.len', this.seriesData[0].data)
  661. // this.myChart.setOption(updateOption)
  662. this.libIndex = this.count % this.len
  663. this.libCurrent = this.libInfoData[this.libIndex]
  664. console.log('this.libIndex', this.count)
  665. console.log('this.libCurrent', this.libCurrent)
  666. this.initSwiper()
  667. this.updatePageWithData()
  668. this.autohover()
  669. },
  670. mouseMove() {
  671. // 当鼠标移入,终止轮播,高亮显示当前区域
  672. this.myChart.on('mouseover', (params) => {
  673. clearInterval(this.timeTicket)
  674. this.myChart.dispatchAction({
  675. type: 'downplay'
  676. // seriesIndex: 0
  677. })
  678. this.myChart.dispatchAction({
  679. type: 'highlight',
  680. seriesIndex: 0,
  681. dataIndex: params.dataIndex
  682. })
  683. this.myChart.dispatchAction({
  684. type: 'showTip',
  685. seriesIndex: 0,
  686. dataIndex: params.dataIndex
  687. })
  688. })
  689. // 当鼠标移出,轮播继续开始
  690. this.myChart.on('mouseout', this.autohover)
  691. },
  692. autohover() {
  693. // clearInterval(this.timeTicket)
  694. // this.timeTicket = setInterval(() => {
  695. // 1. 取消上次的高亮
  696. this.myChart.dispatchAction({
  697. type: 'downplay',
  698. seriesIndex: 0
  699. })
  700. // 2. 显示当前高亮
  701. this.myChart.dispatchAction({
  702. type: 'highlight',
  703. seriesIndex: 0,
  704. dataIndex: this.count % this.len
  705. })
  706. // 3. 显示提示框中的信息
  707. this.myChart.dispatchAction({
  708. type: 'showTip',
  709. seriesIndex: 0,
  710. dataIndex: this.count % this.len
  711. })
  712. // }, 2000)
  713. },
  714. resize() {
  715. this.myChart.resize()
  716. },
  717. updatePageWithData() {
  718. // 生成一个随机数来确定要显示的图片数量
  719. const displayCountOptions = [1, 2, 3, 5]
  720. const displayCount = displayCountOptions[Math.floor(Math.random() * displayCountOptions.length)]
  721. // 从 libImg 中随机选择要显示的图片对象
  722. const shuffledLibImg = this.libImg.slice().sort(() => Math.random() - 0.5) // 随机打乱数组顺序
  723. this.displayedImages = shuffledLibImg.slice(0, displayCount)
  724. this.currentIndex = 20
  725. this.swiperKey += 1
  726. if (this.displayedImages.length === 1) {
  727. setTimeout(() => {
  728. this.count++
  729. this.libIndex = this.count % this.len
  730. this.libCurrent = this.libInfoData[this.libIndex]
  731. console.log('updatePageWithData-libIndex', this.libIndex)
  732. console.log('updatePageWithData-libCurrent', this.libCurrent)
  733. this.updatePageWithData()
  734. this.autohover()
  735. }, 5000)
  736. }
  737. },
  738. initSwiper() {
  739. const _self = this
  740. this.swiperOption = {
  741. // loop: true,
  742. // initialSlide: 0,
  743. notNextTick: false, // notNextTick是一个组件自有属性,如果notNextTick设置为true,组件则不会通过NextTick来实例化swiper,也就意味着你可以在第一时间获取到swiper对象,假如你需要刚加载遍使用获取swiper对象来做什么事,那么这个属性一定要是true
  744. // slidesPerView: 3, // 数量
  745. // spaceBetween: 30, // 间距
  746. // slidesPerGroup: 1, // 分几组
  747. // 禁止滑动
  748. noSwiping: true,
  749. observer: true, // 开启动态检查器
  750. direction: 'horizontal', // 设置水平还是垂直vertical
  751. // grabCursor: true, //光标样式
  752. // setWrapperSize: true,
  753. // autoHeight: true,
  754. // centeredSlides: true,
  755. // paginationClickable: true,
  756. // keyboard: true, //键盘控制
  757. // mousewheelControl: true, //鼠标轮控制
  758. autoplay: {
  759. delay: 3000, // 自动切换的时间间隔,单位ms
  760. stopOnLastSlide: false, // 当切换到最后一个slide时停止自动切换
  761. disableOnInteraction: false // 用户操作swiper之后,是否禁止autoplay
  762. // reverseDirection: false, //开启反向自动轮播
  763. // waitForTransition: true, //等待过渡完毕。自动切换会在slide过渡完毕后才开始计时
  764. },
  765. // 显示分页
  766. pagination: {
  767. el: '.swiper-pagination',
  768. type: 'progressbar'
  769. // progressbarOpposite: true,
  770. // clickable: true // 允许分页点击跳转
  771. },
  772. on: {
  773. slideChangeTransitionEnd() {
  774. _self.currentIndex = this.activeIndex
  775. if (_self.currentIndex === _self.displayedImages.length - 1) {
  776. setTimeout(() => {
  777. if (_self.count === _self.libInfoData.length - 1) {
  778. _self.count = 0
  779. // _self.$parent.autoPagination(3)
  780. } else {
  781. _self.count++
  782. }
  783. _self.libIndex = _self.count % _self.len
  784. _self.libCurrent = _self.libInfoData[_self.libIndex]
  785. console.log('_self.count', _self.count)
  786. console.log('_self.libIndex', _self.libIndex)
  787. console.log('_self.libCurrent', _self.libCurrent)
  788. _self.updatePageWithData()
  789. _self.autohover()
  790. _self.currentIndex = 0
  791. }, 3000)
  792. }
  793. }
  794. }
  795. }
  796. }
  797. }
  798. }
  799. </script>
  800. <style lang="scss">
  801. @import "~@/assets/styles/index.scss";
  802. </style>
  803. <!--
  804. {
  805. type: 'map',
  806. map: 'qiyang',
  807. roam: false,
  808. silent: true,
  809. // geoIndex: 0, geoIndex 指定一个 geo 组件。这样的话,map 和 其他 series(例如散点图)就可以共享一个 geo 组件了。
  810. data: null,
  811. label: {
  812. show: false,
  813. fontSize: 0
  814. }
  815. },
  816. {
  817. name: item[0] + ' Top3',
  818. type: 'lines',
  819. zlevel: 1,
  820. effect: {
  821. show: true,
  822. period: 6,
  823. trailLength: 0.7,
  824. color: 'red', // arrow箭头的颜色
  825. symbolSize: 3
  826. },
  827. lineStyle: {
  828. normal: {
  829. color: color[i],
  830. width: 0,
  831. curveness: 0.2
  832. }
  833. },
  834. data: convertData(item[1])
  835. },
  836. {
  837. type: 'effectScatter',
  838. coordinateSystem: 'geo', // 注意坐标系的设置
  839. // symbol: 'image://' + require('../../assets/images/default-img.png'),
  840. data: null,
  841. symbolSize: [8, 4],
  842. showEffectOn: 'render',
  843. rippleEffect: {
  844. brushType: 'stroke',
  845. color: '#9ffcff',
  846. period: 9,
  847. scale: 5
  848. },
  849. label: {
  850. show: true,
  851. color: '#FFF',
  852. formatter: '',
  853. offset: [0, -12]
  854. },
  855. emphasis: {
  856. // 设置高亮显示的状态
  857. scale: 8,
  858. itemStyle: {
  859. color: 'pink'
  860. }
  861. }
  862. } -->