From 690f9404a28aeec7287779b29077c90f349761d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=7E=E6=B5=B7=7E=E7=88=B1=E6=B5=B7=E7=88=B1?= =?UTF-8?q?=E6=B5=B7=7E=E5=8F=B3?= <1828712314@qq.com> Date: Thu, 27 Feb 2025 16:25:20 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E6=9F=B1=E7=8A=B6?= =?UTF-8?q?=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/screen/compenonts/leftwrapper.vue | 2 +- src/views/screen/compenonts/map.vue | 157 ++++++++++++++++++-- src/views/screen/compenonts/tabber.vue | 6 +- 3 files changed, 146 insertions(+), 19 deletions(-) diff --git a/src/views/screen/compenonts/leftwrapper.vue b/src/views/screen/compenonts/leftwrapper.vue index c5276cc..1c88b2b 100644 --- a/src/views/screen/compenonts/leftwrapper.vue +++ b/src/views/screen/compenonts/leftwrapper.vue @@ -94,7 +94,7 @@ const row1Options = ref({ } }, { - name: '主要任务类型占比', + name: '任务类型占比', type: 'scatter', data: [100, 90, 10, 90, 90, 20, 56, 89], symbol: diff --git a/src/views/screen/compenonts/map.vue b/src/views/screen/compenonts/map.vue index 54fc444..4b1f9d4 100644 --- a/src/views/screen/compenonts/map.vue +++ b/src/views/screen/compenonts/map.vue @@ -134,7 +134,7 @@ const mapOption: any = ref({ fontWeight: 'bold', fontSize: 14, fontStyle: 'italic', - formatter: (v) => { + formatter: () => { return `AQI 25` } }, @@ -321,7 +321,10 @@ const initMap = () => { color: '#fff', fontSize: 10 }, - data: [dataItem.name] + nameTextStyle: { + color: '#fff' + }, + data: [dataItem.name, ''] }) //针对每个城市数据添加y轴 mapOption.value.yAxis.push({ @@ -366,12 +369,53 @@ const initMap = () => { itemStyle: { color: '#56ca00' }, - label: { - show: true, - position: 'top', - color: '#fff' - }, - data: [value1] + label: { + show: true, + position: 'top', + color: '#fff' + }, + data: [ + { + value: value1, + itemStyle: { + color: 'rgba(251, 233, 71, 1)' + } + }, + { + value: value2, + itemStyle: { + color: 'rgba(88, 215, 100, 1)' + } + } + ] + }) + mapOption.value.series.push({ + name: `${dataItem.name}1`, + type: 'pictorialBar', + coordinateSystem: 'cartesian2d', + xAxisIndex: idx, + yAxisIndex: idx, + symbolSize: [6,3], + symbolOffset: [0, -1], + symbolPosition: 'end', + symbol: 'circle', + label: { + show: false, + }, + data: [ + { + value: value1, + itemStyle: { + color: 'rgba(251, 233, 71, 1)' + } + }, + { + value: value2, + itemStyle: { + color: 'rgba(88, 215, 100, 1)' + } + } + ] }) mapOption.value.series.push({ name: `${dataItem.name}2`, @@ -381,17 +425,88 @@ const initMap = () => { yAxisIndex: idx, zLevel: 3, barWidth: 6, - itemStyle: { - color: '#ffe700', - fontSize:10, - }, label: { - show: true, + show: false, position: 'top', color: '#fff' }, - data: [value2] + barGap: '-100%', + data: [ + { + value: 100, + itemStyle: { + color: 'rgba(251, 233, 71, .2)' + } + }, + { + value: 100, + itemStyle: { + color: 'rgba(88, 215, 100, .2)' + } + } + ] + }) + mapOption.value.series.push({ + name: `${dataItem.name}3`, + type: 'pictorialBar', + coordinateSystem: 'cartesian2d', + xAxisIndex: idx, + yAxisIndex: idx, + symbolPosition: 'end', + symbol: 'circle', + zLevel: 3, + label: { + show: false, + }, + symbolSize: [6,3], + symbolOffset: [0, -1], + barGap: '-100%', + data: [ + { + value: 100, + itemStyle: { + color: 'rgba(251, 233, 71, .2)' + } + }, + { + value: 100, + itemStyle: { + color: 'rgba(88, 215, 100, .2)' + } + } + ] + }) + mapOption.value.series.push({ + name: `${dataItem.name}3`, + type: 'pictorialBar', + coordinateSystem: 'cartesian2d', + xAxisIndex: idx, + yAxisIndex: idx, + zLevel: 3, + symbolPosition: 'end', + symbol: 'circle', + label: { + show: false, + }, + barGap: '-100%', + symbolSize: [6,3], + symbolOffset: [0, -1], + data: [ + { + value: 0, + itemStyle: { + color: 'rgba(251, 233, 71, 1)' + } + }, + { + value: 0, + itemStyle: { + color: 'rgba(88, 215, 100, 1)' + } + } + ] }) + }) } @@ -411,6 +526,7 @@ onUnmounted(() => { position: relative; width: 100%; height: 100%; + &::before { content: ''; position: absolute; @@ -421,6 +537,7 @@ onUnmounted(() => { background-position: center; //animation: rotate 5s linear infinite; } + &::after { content: ''; position: absolute; @@ -431,6 +548,7 @@ onUnmounted(() => { background-position: center; //animation: rotate 5s linear infinite; } + .map { position: absolute; inset: 0; @@ -438,35 +556,41 @@ onUnmounted(() => { flex-flow: column nowrap; padding: 12px; } + .air-quality { position: absolute; left: 12px; top: 0; } + .nomr-box { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); } + .weather { position: absolute; left: 50%; top: 0; transform: translateX(-50%); } + .num-box { position: absolute; right: 12px; top: 0; } + .tabber-box { position: absolute; left: 50%; bottom: 0; transform: translateX(-50%); - z-index: 2; + z-index: 3; } + .block-box { border: 1px solid rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.02); @@ -474,13 +598,16 @@ onUnmounted(() => { z-index: 2; } } + @keyframes rotate { from { transform: rotateX(0deg) rotateZ(0); } + 50% { transform: rotateX(-30deg) rotateZ(30deg); } + to { transform: rotateX(0deg) rotateZ(0deg); } diff --git a/src/views/screen/compenonts/tabber.vue b/src/views/screen/compenonts/tabber.vue index 3adffe6..539cfed 100644 --- a/src/views/screen/compenonts/tabber.vue +++ b/src/views/screen/compenonts/tabber.vue @@ -17,6 +17,7 @@ v-for="(item, index) in tabberList" :key="index" @click="curTab = index" + style="padding: 12px 16px;" > {{ item }} @@ -50,16 +51,15 @@ const curTab = ref(0) flex-flow: row nowrap; gap: 8px; width: fit-content; + font-size: 12px; .item { - font-size: 1rem; padding: 6px; white-space: nowrap; border: 1px solid rgba(255, 255, 255, 0.15); transition: .2s all; } .type-item{ - font-size: 1rem; - padding: 8px; + padding: 6px 16px; white-space: nowrap; border: 1px solid rgba(255, 255, 255, 0.15); transition: .2s all; From 1353a97afed4d699bd43d3c066772297b9370ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=7E=E6=B5=B7=7E=E7=88=B1=E6=B5=B7=E7=88=B1?= =?UTF-8?q?=E6=B5=B7=7E=E5=8F=B3?= <1828712314@qq.com> Date: Fri, 28 Feb 2025 09:58:04 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=A7=E5=B1=8F?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/screen/compenonts/leftwrapper.vue | 33 ++++++--- src/views/screen/compenonts/map.vue | 55 ++++++++++----- src/views/screen/compenonts/rightwrapper.vue | 73 ++++++++++++-------- src/views/screen/index.vue | 1 + 4 files changed, 106 insertions(+), 56 deletions(-) diff --git a/src/views/screen/compenonts/leftwrapper.vue b/src/views/screen/compenonts/leftwrapper.vue index 1c88b2b..714cbf2 100644 --- a/src/views/screen/compenonts/leftwrapper.vue +++ b/src/views/screen/compenonts/leftwrapper.vue @@ -30,7 +30,7 @@ const row1Options = ref({ }, xAxis: { type: 'category', - data: ['一大队', '二大队', '三大队', '四大队', '五大队'], + data: ['日常任务', '周期任务', '污染防治', '环境监测', '排污管控'], axisTick: { show: false }, @@ -71,7 +71,7 @@ const row1Options = ref({ series: [ { type: 'bar', - data: [100, 10], + data: [100, 90, 10, 90, 90, 20, 56, 89], barWidth: 5, itemStyle: { color: { @@ -168,14 +168,14 @@ const row2Options = ref({ name: '四大队' }, { - value: 1548, + value: 500, name: '五大队' } ] } ] }) -const row3Options = ref({ +const row3Options:any = ref({ grid: { top: 10, bottom: 10, @@ -306,7 +306,23 @@ const row3Options = ref({ const row1Chart = ref() const row2Chart = ref() const row3Chart = ref() -const initChart = () => {} +const initChart = () => { + // leftFirst() + // leftSecond() + // leftThird() + const row1Data=new Array(5).fill(1).map(i=>{ + return Math.floor(Math.random()*100) + }) + row1Options.value.series[0].data=row1Data + row1Options.value.series[1].data=row1Data + const row3Data=new Array(5).fill(1).map(i=>{ + return Math.floor(Math.random()*100) + }) + row3Options.value.series[1].data=row3Data + row3Options.value.series[2].data=row3Data + row3Options.value.yAxis[1].data=row3Data + +} const handlerResize = () => { unref(row1Chart).resizeHandler() @@ -347,13 +363,12 @@ const leftThird = async () => { } onMounted(() => { - leftFirst() - leftSecond() - leftThird() - initChart() observer = new ResizeObserver(handlerResize) observer.observe(leftWrapperRef.value) handlerResize() + nextTick(() => { + initChart() + }) }) onUnmounted(() => { diff --git a/src/views/screen/compenonts/map.vue b/src/views/screen/compenonts/map.vue index 4b1f9d4..e79c409 100644 --- a/src/views/screen/compenonts/map.vue +++ b/src/views/screen/compenonts/map.vue @@ -5,6 +5,16 @@ +
+
+ 绿色柱 + 区域企业数占比 +
+
+ 黄色柱 + 区域任务数占比 +
+
@@ -395,7 +405,7 @@ const initMap = () => { coordinateSystem: 'cartesian2d', xAxisIndex: idx, yAxisIndex: idx, - symbolSize: [6,3], + symbolSize: [6, 3], symbolOffset: [0, -1], symbolPosition: 'end', symbol: 'circle', @@ -458,7 +468,7 @@ const initMap = () => { label: { show: false, }, - symbolSize: [6,3], + symbolSize: [6, 3], symbolOffset: [0, -1], barGap: '-100%', data: [ @@ -489,7 +499,7 @@ const initMap = () => { show: false, }, barGap: '-100%', - symbolSize: [6,3], + symbolSize: [6, 3], symbolOffset: [0, -1], data: [ { @@ -506,14 +516,16 @@ const initMap = () => { } ] }) - + }) } onMounted(() => { observer = new ResizeObserver(handlerResize) observer.observe(mapWrapperRef.value) - initMap() + nextTick(() => { + initMap() + }) }) onUnmounted(() => { @@ -535,7 +547,6 @@ onUnmounted(() => { background-size: contain; background-repeat: no-repeat; background-position: center; - //animation: rotate 5s linear infinite; } &::after { @@ -566,7 +577,7 @@ onUnmounted(() => { .nomr-box { position: absolute; right: 12px; - top: 50%; + top: 68%; transform: translateY(-50%); } @@ -597,19 +608,29 @@ onUnmounted(() => { backdrop-filter: blur(3px); z-index: 2; } -} -@keyframes rotate { - from { - transform: rotateX(0deg) rotateZ(0); - } + .legend { + position: absolute; + left: 20%; + top: 20%; + display: flex; + flex-flow: column nowrap; + gap: 12px; + z-index: 2; - 50% { - transform: rotateX(-30deg) rotateZ(30deg); - } + .legend-item { + display: flex; + align-items: center; + gap: 8px; + color: #fff; + font-size: 14px; - to { - transform: rotateX(0deg) rotateZ(0deg); + .legend-text { + opacity: 0.8; + } + } } } + + diff --git a/src/views/screen/compenonts/rightwrapper.vue b/src/views/screen/compenonts/rightwrapper.vue index e99d173..d1a478e 100644 --- a/src/views/screen/compenonts/rightwrapper.vue +++ b/src/views/screen/compenonts/rightwrapper.vue @@ -8,24 +8,13 @@
-
-
+
+
{{ row.name }}
逾期 - +
@@ -183,7 +172,7 @@ const row1Options = ref({ }) const list: any = ref([]) const color = ['#56CA00', '#FFE700', '#16B1FF'] -const row2Options:any = ref({ +const row2Options: any = ref({ series: [ { type: 'pie', @@ -414,17 +403,29 @@ const row3Options = ref({ const row1Chart = ref() const row2Chart = ref() const row3Chart = ref() - -const initChart = () => {} +const listRef = ref() +const initChart = () => { + rightFirst() + // rightSecond() + rightFourth() + rightThird() +} const queryParams: any = ref() //右一 const rightFirst = async () => { - const data: any = await ScreenApi.getRightFirst(queryParams.value) - row1Options.value.xAxis.data = data.map((i) => i.name) - row1Options.value.series[0].data = data.map((i) => i.value) - row1Options.value.series[1].data = data.map((i) => i.taskValue) + // const data: any = await ScreenApi.getRightFirst(queryParams.value) + // row1Options.value.xAxis.data = data.map((i) => i.name) + // row1Options.value.series[0].data = data.map((i) => i.value) + // row1Options.value.series[1].data = data.map((i) => i.taskValue) + row1Options.value.series[0].data = new Array(5).fill(1).map(i=>{ + return Math.floor(Math.random()*100) + }) + row1Options.value.series[1].data = new Array(5).fill(1).map(i=>{ + return Math.floor(Math.random()*100) + }) + } //右二 @@ -453,17 +454,30 @@ const rightSecond = async () => { } } +let timer: any = null // 右三 const rightThird = async () => { list.value = await ScreenApi.getRightThird(queryParams.value) + timer = setInterval(() => { + unref(listRef).scrollTop += 1; + if (unref(listRef).scrollTop >= unref(listRef).scrollHeight) { + unref(listRef).scrollTop = 0; + } + }, 200); } // 右四 const rightFourth = async () => { - const data = await ScreenApi.getRightFourth(queryParams.value) - row3Options.value.xAxis.data = data.map((i) => i.name) - row3Options.value.series[0].data = data.map((i) => i.enforcementGrowthRate) - row3Options.value.series[1].data = data.map((i) => i.taskGrowthRate) + // const data = await ScreenApi.getRightFourth(queryParams.value) + // row3Options.value.xAxis.data = data.map((i) => i.name) + // row3Options.value.series[0].data = data.map((i) => i.enforcementGrowthRate) + // row3Options.value.series[1].data = data.map((i) => i.taskGrowthRate) + row3Options.value.series[0].data = new Array(5).fill(1).map(i=>{ + return Math.floor(Math.random()*100) + }) + row3Options.value.series[1].data = new Array(5).fill(1).map(i=>{ + return Math.floor(Math.random()*100) + }) } const handlerResize = () => { @@ -474,10 +488,6 @@ const handlerResize = () => { onMounted(() => { initChart() - rightFirst() - rightSecond() - rightFourth() - rightThird() observer = new ResizeObserver(handlerResize) observer.observe(rightWrapperRef.value) handlerResize() @@ -485,6 +495,7 @@ onMounted(() => { onUnmounted(() => { observer?.disconnect() + timer && clearInterval(timer) }) @@ -496,12 +507,14 @@ onUnmounted(() => { grid-template-rows: 1.5fr 1fr 1.3fr 1.5fr; grid-template-columns: 1fr; grid-gap: 20px; + .list-container { position: relative; width: 100%; height: 100%; overflow: hidden; scroll-behavior: smooth; + .list { &::-webkit-scrollbar { display: none; diff --git a/src/views/screen/index.vue b/src/views/screen/index.vue index 46cce30..213f43c 100644 --- a/src/views/screen/index.vue +++ b/src/views/screen/index.vue @@ -29,6 +29,7 @@ import Rightwrapper from './compenonts/rightwrapper.vue' padding: 12px 12px; grid-gap: 24px; color: #fff; + padding-bottom: 20px; .chart-wrapper { display: grid; grid-template-rows: 1fr;