From f92f2762f6c7ccaffc7e0047c2903e52c127b585 Mon Sep 17 00:00:00 2001 From: odc.xiaohui <xiaohui@Q1> Date: 星期五, 01 三月 2024 09:36:00 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- src/views/daoAnOffice/right/analysis/index.vue | 243 ++++++++++++++++++++++------------------ package-lock.json | 6 + src/views/daoAnOffice/right/publicize/index.vue | 88 +++++++++++++- package.json | 1 src/views/daoAnOffice/right/danger/index.vue | 4 src/views/index/index.vue | 2 src/main.ts | 1 src/views/daoAnOffice/right/danger/imageSwiper.vue | 13 + 8 files changed, 234 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9fc45bd..3ce9ffb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "mockjs": "^1.1.0", "pinia": "^2.1.6", "swiper": "^11.0.7", + "viewerjs": "^1.11.6", "vue": "^3.3.4", "vue-echarts": "^6.6.1", "vue-router": "^4.2.5" @@ -3562,6 +3563,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/viewerjs": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.6.tgz", + "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==" + }, "node_modules/vite": { "version": "4.4.11", "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", diff --git a/package.json b/package.json index dd736d4..6d63102 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "mockjs": "^1.1.0", "pinia": "^2.1.6", "swiper": "^11.0.7", + "viewerjs": "^1.11.6", "vue": "^3.3.4", "vue-echarts": "^6.6.1", "vue-router": "^4.2.5" diff --git a/src/main.ts b/src/main.ts index ffc8509..779d7cf 100644 --- a/src/main.ts +++ b/src/main.ts @@ -7,6 +7,7 @@ import '@/assets/css/main.scss' import '@/assets/css/tailwind.css' import 'swiper/swiper-bundle.css'; +import 'viewerjs/dist/viewer.css'; import {registerEcharts} from "@/plugins/echarts" //涓嶄娇鐢╩ock 璇锋敞閲婃帀 diff --git a/src/views/daoAnOffice/right/analysis/index.vue b/src/views/daoAnOffice/right/analysis/index.vue index 7bdc484..6787b1a 100644 --- a/src/views/daoAnOffice/right/analysis/index.vue +++ b/src/views/daoAnOffice/right/analysis/index.vue @@ -3,7 +3,8 @@ <RightTitle title="浜ら�氬畨鍏ㄥ舰鍔跨爺鍒ゅ垎鏋�"> <template #top> <div class="select-container flex"> - <div class="item whitespace-no-wrap cursor-pointer" v-for="item in selectItems" :key="item.itemIndex"> + <div class="item whitespace-no-wrap cursor-pointer" :class="{'select-active': item.isActive}" v-for="item in selectItems" :key="item.itemIndex" + @click="changeChart(item)"> {{ item.name }} </div> </div> @@ -11,6 +12,11 @@ <template #content> <div class="charts-container"> <div id="analysisChart" ref="analysisChart"></div> + <div class="type-select-container" v-show="isShowSelect"> + <el-select v-model="typeValue" class="select-style" @change="setConfig"> + <el-option v-for="item in testData1" :key="item.name" :label="item.name" :value="item.name" /> + </el-select> + </div> </div> </template> </RightTitle> @@ -20,14 +26,24 @@ import RightTitle from "@/components/right-title"; import * as echarts from 'echarts'; import { ref, onMounted } from 'vue'; -// dom绀轰緥 + +// dom const analysisChart = ref(null); -const echartRef = ref(null); + +// echart瀹炰緥 +let echartObject = null; + +// type閫夋嫨 +const typeValue = ref(''); + +// 鏄惁鏄剧ず涓嬫媺妗� +const isShowSelect = ref(true); + const selectItems = ref([ - { itemIndex: 1, name: '鏃堕棿缁熻', isActive: false }, - { itemIndex: 2, name: '琛楅亾缁熻', isActive: true }, + { itemIndex: 1, name: '鏃堕棿缁熻', isActive: true }, + { itemIndex: 2, name: '琛楅亾缁熻', isActive: false }, ]); const testData = ref([ @@ -43,11 +59,18 @@ ]); const testData1 = ref([ - {name: '閮芥睙鍫板競', '2023-01': 1000, '2023-02': 2000, '2023-03': 12132}, -]) + { name: '閮芥睙鍫板競', state: { '2023-1': 1000, '2023-2': 2000, '2023-3': 1233 }, state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111 } }, + { name: '濂庡厜濉旇閬�', state: { '2023-1': 1000, '2023-2': 6000, '2023-3': 1233 }, state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111 } }, + { name: '钂查槼琛楅亾', state: { '2023-1': 1000, '2023-2': 2000, '2023-3': 1233 }, state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111 } }, + { name: '鑱氭簮闀�', state: { '2023-1': 1000, '2023-2': 8000, '2023-3': 12233 }, state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111 } }, + { name: '閾舵潖琛楅亾', state: { '2023-1': 1000, '2023-2': 2000, '2023-3': 1233 }, state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111 } }, + { name: '鐭崇緤闀�', state: { '2023-1': 1000, '2023-2': 2000, '2023-3': 12313 }, state2: { '2023-1': 12312, '2023-2': 23123, '2023-3': 2111 } }, +]); +let acitveData = ref(testData1.value[0]); -const echartsConfig = { +// 鍦嗘煴鍥捐〃 +const barConfig = ref({ legend: { right: '0', icon: 'circle', @@ -90,8 +113,6 @@ }, xAxis: { type: 'category', axisTick: false }, yAxis: {}, - // Declare several bar series, each will be mapped - // to a column of dataset.source by default. series: [ { type: 'bar', @@ -160,122 +181,105 @@ }, }, ] +}); + + +// line閰嶇疆 +const lineConfig = ref(null); + + + +// 鍥捐〃鏇存崲 +const changeChart = (selectItem) => { + selectItems.value.map(item => item.isActive = false); + selectItem.isActive = true; + if (selectItem.itemIndex == 1) { + echartObject.setOption(lineConfig.value, true); + isShowSelect.value = true; + } else { + echartObject.setOption(barConfig.value, true); + isShowSelect.value = false; + } } -const echartsLineConfig = { - legend: { - right: '0', - icon: 'circle', - textStyle: { - color: 'rgba(77, 118, 176, 1)' +// 閰嶇疆鏁版嵁 +const setConfig = () => { + acitveData.value = testData1.value.find((item) => item.name === typeValue.value); + lineConfig.value = { + legend: { + right: '12%', + icon: 'circle', + textStyle: { + color: 'rgba(77, 118, 176, 1)' + }, + data: [ + { + + name: '閰掗┚', + itemStyle: { + color: 'rgba(207, 178, 73, 1)' + } + }, + { + name: '鍏朵粬', + itemStyle: { + color: 'rgba(43, 176, 109, 1)' + } + }, + ], }, - data: [ + tooltip: { + show: true, + trigger: 'axis', + axisPointer: { + type: 'shadow', + + } + }, + grid: { + left: 0, + right: 0, + bottom: 0, + top: '15%', + containLabel: true + }, + xAxis: { + type: 'category', + data: Object.keys(acitveData.value.state) + }, + yAxis: { + type: 'value' + }, + series: [ { name: '閰掗┚', + data: Object.entries(acitveData.value.state).map(([key, value]) => value), + type: 'line', + smooth: true, itemStyle: { color: 'rgba(207, 178, 73, 1)' } }, { name: '鍏朵粬', + data: Object.entries(acitveData.value.state2).map(([key, value]) => value), + type: 'line', + smooth: true, itemStyle: { color: 'rgba(43, 176, 109, 1)' } - }, + } ] - - }, - tooltip: {}, - grid: { - left: 0, - right: 0, - bottom: 0, - top: '15%', - containLabel: true - }, - dataset: { - dimensions: ['name', 'state1', 'state2', 'state3'], - source: testData.value - }, - xAxis: { type: 'category', axisTick: false }, - yAxis: {}, - // Declare several bar series, each will be mapped - // to a column of dataset.source by default. - series: [ - { - type: 'bar', - name: '閱夐┚', - barWidth: 13, - barGap: '50%', - label: { - show: true, // 鏄剧ず鏍囩 - position: 'top', // 鏍囩浣嶇疆 - color: 'rgba(0, 168, 217, 1)', // 鏍囩棰滆壊 - fontSize: 10, - }, - itemStyle: { - // 璁剧疆娓愬彉鑹� - color: new echarts.graphic.LinearGradient( - 0, 1, 0, 0, - [ - { offset: 0, color: 'rgba(14, 32, 54, 1)' }, // 0% 澶勭殑棰滆壊 - { offset: 1, color: 'rgba(0, 168, 217, 1)' } // 100% 澶勭殑棰滆壊 - ] - ) - }, - }, - { - type: 'bar', - name: '閰掗┚', - barWidth: 13, - barGap: '50%', - label: { - show: true, // 鏄剧ず鏍囩 - position: 'top', // 鏍囩浣嶇疆 - color: 'rgba(207, 178, 73, 1)', // 鏍囩棰滆壊 - fontSize: 10, - }, - itemStyle: { - // 璁剧疆娓愬彉鑹� - color: new echarts.graphic.LinearGradient( - 0, 1, 0, 0, - [ - { offset: 0, color: 'rgba(14, 31, 53, 1)' }, // 0% 澶勭殑棰滆壊 - { offset: 1, color: 'rgba(207, 178, 73, 1)' } // 100% 澶勭殑棰滆壊 - ] - ) - }, - }, - { - type: 'bar', - name: '鍏朵粬', - barWidth: 13, - barGap: '50%', - label: { - show: true, // 鏄剧ず鏍囩 - position: 'top', // 鏍囩浣嶇疆 - color: 'rgba(43, 176, 109, 1)', // 鏍囩棰滆壊 - fontSize: 10, - }, - itemStyle: { - // 璁剧疆娓愬彉鑹� - color: new echarts.graphic.LinearGradient( - 0, 1, 0, 0, - [ - { offset: 0, color: 'rgba(14, 31, 53, 1)' }, // 0% 澶勭殑棰滆壊 - { offset: 1, color: 'rgba(43, 176, 109, 1)' } // 100% 澶勭殑棰滆壊 - ] - ) - }, - }, - ] + } + echartObject.setOption(lineConfig.value, true); } - +// 鎸傝浇 onMounted(() => { - echartRef.value = echarts.init(analysisChart.value); - echartRef.value.setOption(echartsConfig); + echartObject = echarts.init(analysisChart.value); + typeValue.value = testData1.value[0].name; + setConfig(); }) </script> @@ -291,8 +295,11 @@ background: rgba(67, 102, 155, 0.4); border: 1px solid rgba(47, 91, 157, 0.8); flex-shrink: 0; + color: #5B83BD; } - +.select-active { + color: #fff; +} .item:last-child { margin-right: 0; } @@ -303,6 +310,15 @@ padding: 20px; background-color: rgba(17, 34, 58, 0.6); border: 1px solid rgba(47, 91, 157, 0.8); + position: relative; +} + +.type-select-container { + position: absolute; + right: 20px; + top: 14px; + width: 120px; + height: 23px; } #analysisChart { @@ -310,4 +326,15 @@ height: 100%; box-sizing: border-box; } + +::v-deep .el-input.el-input--suffix { + .el-input__wrapper { + background: rgba(67, 102, 155, 0.4) !important; + border: 1px solid rgba(47, 91, 157, 0.8); + } + + .el-input__inner { + color: #4481DD; + } +} </style> \ No newline at end of file diff --git a/src/views/daoAnOffice/right/danger/imageSwiper.vue b/src/views/daoAnOffice/right/danger/imageSwiper.vue index 29f9ec6..0b841c9 100644 --- a/src/views/daoAnOffice/right/danger/imageSwiper.vue +++ b/src/views/daoAnOffice/right/danger/imageSwiper.vue @@ -2,9 +2,9 @@ <div class="swiper_button mr-1" @click="prevSwiper"> <img :src="leftIcon" class=""> </div> - <Swiper :slides-per-view="3" :space-between="18" class="image_swiper" @swiper="setSwiper"> - <SwiperSlide v-for="(slide, index) in imageList" :key="index" class="image_slide"> - <img :src="slide" class="item_img"> + <Swiper :slides-per-view="3" :space-between="18" class="image_swiper" @swiper="setSwiper" > + <SwiperSlide v-for="(slide, index) in imageList" :key="index" class="image_slide" > + <img :src="slide" class="item_img" @click="imageClick"> </SwiperSlide> </Swiper> @@ -14,12 +14,14 @@ </template> <script setup> +import Viewer from 'viewerjs'; import { Swiper, SwiperSlide } from 'swiper/vue'; import leftIcon from '@/assets/img/icon/arrow_left.png'; import rightIcon from '@/assets/img/icon/arrow_right.png'; import { defineProps,ref } from 'vue'; +const imgView = null; const swiperRef = ref(null); const props = defineProps({ imageList: { @@ -36,6 +38,10 @@ const nextSwiper = () => { swiperRef.value.slideNext(); + } + + const imageClick = (event) => { + new Viewer(event.target); } </script> @@ -55,6 +61,7 @@ display: block; height: 100%; object-fit: fill; + cursor: pointer; } .swiper_button { diff --git a/src/views/daoAnOffice/right/danger/index.vue b/src/views/daoAnOffice/right/danger/index.vue index 55bb4fa..07ab4b4 100644 --- a/src/views/daoAnOffice/right/danger/index.vue +++ b/src/views/daoAnOffice/right/danger/index.vue @@ -31,8 +31,8 @@ const selectItems = ref([ - { itemIndex: 1, name: '瀹夊叏闅愭偅', isActive: false }, - { itemIndex: 2, name: '鏁版嵁缁熻', isActive: true }, + { itemIndex: 1, name: '瀹夊叏闅愭偅', isActive: true }, + { itemIndex: 2, name: '鏁版嵁缁熻', isActive: false }, ]); diff --git a/src/views/daoAnOffice/right/publicize/index.vue b/src/views/daoAnOffice/right/publicize/index.vue index ab8a1f1..ef7c5dd 100644 --- a/src/views/daoAnOffice/right/publicize/index.vue +++ b/src/views/daoAnOffice/right/publicize/index.vue @@ -5,14 +5,15 @@ <RightTitle title="浜ら�氬浼�"> <template #top> <div class="select-container flex"> - <div class="item whitespace-no-wrap cursor-pointer" v-for="item in selectItems" :key="item.itemIndex"> + <div class="item whitespace-no-wrap cursor-pointer" :class="{ 'select-active': item.isActive }" + v-for="item in selectItems" :key="item.itemIndex" @click="changeSelect(item)"> {{ item.name }} </div> </div> </template> <template #content> <div class="content-container flex flex-wrap justify-between content-between"> - <div class="content-item" v-for="item in contentList" :key="item.itemIndex"> + <div class="content-item" v-for="item in contentList" :key="item.itemIndex" @click="openVideo(item)"> <div class="content-wrapper"> <div class="content-video-info"> <img :src="item.image" class="video-cover"> @@ -30,18 +31,28 @@ </div> </template> </RightTitle> + + <div class="video-container" v-show="isShowVideo"> + <div class="video-wrapper"> + <video :src="testVideo" ref="videoDom" class="video-player" controls></video> + <div class="close-btn flex justify-center items-center" @click="closeVideo">X</div> + </div> + </div> </template> -<script setup lang="ts"> +<script setup> import testImage from '@/assets/img/test_img/閬撳畨鍔�.png'; import RightTitle from "@/components/right-title"; import { ref } from 'vue'; - +// 娴嬭瘯瑙嗛 +const testVideo = 'https://www.w3schools.com/html/movie.mp4'; +const isShowVideo = ref(false); +const videoDom = ref(null); const selectItems = ref([ - { itemIndex: 1, name: '浜ら�氬浼�', isActive: false }, - { itemIndex: 2, name: '浜ら�氫簨鏁�', isActive: true }, + { itemIndex: 1, name: '浜ら�氬浼�', isActive: true }, + { itemIndex: 2, name: '浜ら�氫簨鏁�', isActive: false }, ]); const contentList = ref([ @@ -83,6 +94,22 @@ }, ]); +const changeSelect = (selectItem) => { + selectItems.value.map(item => item.isActive = false); + selectItem.isActive = true; +} + +const openVideo = () => { + isShowVideo.value = true; + videoDom.value.play(); +} + +const closeVideo = () => { + isShowVideo.value = false; + videoDom.value.pause(); +} + + </script> <style scoped lang="scss"> @@ -97,6 +124,11 @@ background: rgba(67, 102, 155, 0.4); border: 1px solid rgba(47, 91, 157, 0.8); flex-shrink: 0; + color: #5B83BD; +} + +.select-active { + color: #fff; } .item:last-child { @@ -110,7 +142,7 @@ background-color: rgba(17, 34, 58, 0.6); border: 1px solid rgba(47, 91, 157, 0.8); padding: 22px 20px; - + } .content-item { @@ -119,9 +151,6 @@ cursor: pointer; // margin-bottom: 24px; } -// .content-item:last-child { -// margin-bottom: 0px; -// } .content-video-info { width: 100%; @@ -139,15 +168,54 @@ font-size: 45px; opacity: 0.7; } + .video-cover { width: 100%; height: 100%; object-fit: fill; } + .content-video-name { text-align: center; margin-top: 16px; font-size: 12px; color: rgba(91, 131, 189, 1); } + +.video-container { + position: fixed; + z-index: 99999; + width: 100%; + height: 100%; + top: 0; + left: 0; + + .video-wrapper { + position: absolute; + width: 70%; + height: 80%; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + background-color: rgba(0, 0, 0, 0.9); + + } + + .video-player { + width: 100%; + height: 100%; + } +} + +.close-btn { + position: absolute; + right: -80px; + top: -10px; + width: 40px; + height: 40px; + border: 2px solid #fff; + border-radius: 50%; + font-size: 18px; + cursor: pointer; +} </style> \ No newline at end of file diff --git a/src/views/index/index.vue b/src/views/index/index.vue index 515e821..489bb3a 100644 --- a/src/views/index/index.vue +++ b/src/views/index/index.vue @@ -10,7 +10,7 @@ import RightTop1 from "./right-top2.vue"; import RightCenter from "./right-center.vue"; import RightBottom from "./right-bottom.vue"; -import chart2 from "./chart2.vue"; +// import chart2 from "./chart2.vue"; import BorderBox13 from "@/components/datav/border-box-13"; const config = { header: ['<span style="color:#42C3E8;font-size: 16px">鎺掑悕</span>', '<span style="color:#42C3E8;font-size: 16px">琛屾斂鍖哄垝</span>','<span style="color:#42C3E8;font-size: 16px">鏁板��</span>'], -- Gitblit v1.8.0