feat: 添加经营动画完成图标

This commit is contained in:
Bunny 2025-03-08 21:57:09 +08:00
parent a84dc55486
commit 74925fabbc
11 changed files with 185 additions and 19 deletions

View File

@ -18,6 +18,7 @@
"@unocss/preset-icons": "^66.0.0", "@unocss/preset-icons": "^66.0.0",
"@unocss/reset": "^66.0.0", "@unocss/reset": "^66.0.0",
"@vitejs/plugin-vue-jsx": "^4.1.1", "@vitejs/plugin-vue-jsx": "^4.1.1",
"@vueuse/core": "^12.8.2",
"animate.css": "^4.1.1", "animate.css": "^4.1.1",
"autofit.js": "^3.2.4", "autofit.js": "^3.2.4",
"axios": "^1.7.9", "axios": "^1.7.9",

View File

@ -26,6 +26,9 @@ importers:
'@vitejs/plugin-vue-jsx': '@vitejs/plugin-vue-jsx':
specifier: ^4.1.1 specifier: ^4.1.1
version: 4.1.1(vite@6.1.1(jiti@2.4.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3)) version: 4.1.1(vite@6.1.1(jiti@2.4.2)(sass@1.85.0)(terser@5.39.0))(vue@3.5.13(typescript@5.7.3))
'@vueuse/core':
specifier: ^12.8.2
version: 12.8.2(typescript@5.7.3)
animate.css: animate.css:
specifier: ^4.1.1 specifier: ^4.1.1
version: 4.1.1 version: 4.1.1
@ -815,6 +818,9 @@ packages:
'@types/tinycolor2@1.4.6': '@types/tinycolor2@1.4.6':
resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
'@types/web-bluetooth@0.0.21':
resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==}
'@typescript-eslint/eslint-plugin@8.24.1': '@typescript-eslint/eslint-plugin@8.24.1':
resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==} resolution: {integrity: sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -1038,6 +1044,15 @@ packages:
vue: vue:
optional: true optional: true
'@vueuse/core@12.8.2':
resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==}
'@vueuse/metadata@12.8.2':
resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==}
'@vueuse/shared@12.8.2':
resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==}
acorn-jsx@5.3.2: acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies: peerDependencies:
@ -3191,6 +3206,8 @@ snapshots:
'@types/tinycolor2@1.4.6': {} '@types/tinycolor2@1.4.6': {}
'@types/web-bluetooth@0.0.21': {}
'@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)': '@typescript-eslint/eslint-plugin@8.24.1(@typescript-eslint/parser@8.24.1(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.21.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.12.1 '@eslint-community/regexpp': 4.12.1
@ -3549,6 +3566,23 @@ snapshots:
typescript: 5.7.3 typescript: 5.7.3
vue: 3.5.13(typescript@5.7.3) vue: 3.5.13(typescript@5.7.3)
'@vueuse/core@12.8.2(typescript@5.7.3)':
dependencies:
'@types/web-bluetooth': 0.0.21
'@vueuse/metadata': 12.8.2
'@vueuse/shared': 12.8.2(typescript@5.7.3)
vue: 3.5.13(typescript@5.7.3)
transitivePeerDependencies:
- typescript
'@vueuse/metadata@12.8.2': {}
'@vueuse/shared@12.8.2(typescript@5.7.3)':
dependencies:
vue: 3.5.13(typescript@5.7.3)
transitivePeerDependencies:
- typescript
acorn-jsx@5.3.2(acorn@8.14.0): acorn-jsx@5.3.2(acorn@8.14.0):
dependencies: dependencies:
acorn: 8.14.0 acorn: 8.14.0

View File

@ -1,14 +1,21 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { onMounted, ref } from 'vue';
import TimeSelect from '@/components/TimeSelect/index.vue'; import TimeSelect from '@/components/TimeSelect/index.vue';
import { TimeSelectType } from '@/components/TimeSelect/type'; import { TimeSelectType } from '@/components/TimeSelect/type';
import { renderEcharts } from '@/views/business-supervision/business-supervision-left/charts/sideBottom';
const chartYear = ref();
const timeList = ref<TimeSelectType[]>([ const timeList = ref<TimeSelectType[]>([
{ label: '2020.09', value: '2021' }, { label: '2020.09', value: '2021' },
{ label: '2020.09', value: '2021' }, { label: '2020.09', value: '2021' },
{ label: '2020.09', value: '2021' }, { label: '2020.09', value: '2021' },
]); ]);
onMounted(() => {
renderEcharts(chartYear);
});
</script> </script>
<template> <template>
@ -21,6 +28,8 @@ const timeList = ref<TimeSelectType[]>([
</div> </div>
<TimeSelect :time-list="timeList" /> <TimeSelect :time-list="timeList" />
</div> </div>
<div ref="chartYear" class="business-supervision__bottom-chart" />
</div> </div>
</div> </div>
</template> </template>
@ -54,5 +63,10 @@ const timeList = ref<TimeSelectType[]>([
font-size: 12px; font-size: 12px;
} }
} }
&-chart {
width: 100%;
height: 197px;
}
} }
</style> </style>

View File

@ -5,7 +5,7 @@
<li> <li>
<img <img
alt="bg-middle-1" alt="bg-middle-1"
src="../../../../assets/images/business-supervision/bg/content/bg-middle-1.png" src="@/assets/images/business-supervision/bg/content/bg-middle-1.png"
/> />
<h2>员工</h2> <h2>员工</h2>
<div class="business-supervision__middle-detail"> <div class="business-supervision__middle-detail">
@ -16,7 +16,7 @@
<li> <li>
<img <img
alt="bg-middle-2" alt="bg-middle-2"
src="../../../../assets/images/business-supervision/bg/content/bg-middle-2.png" src="@/assets/images/business-supervision/bg/content/bg-middle-2.png"
/> />
<h2>智慧大楼</h2> <h2>智慧大楼</h2>
<div class="business-supervision__middle-detail"> <div class="business-supervision__middle-detail">
@ -27,7 +27,7 @@
<li> <li>
<img <img
alt="bg-middle-3" alt="bg-middle-3"
src="../../../../assets/images/business-supervision/bg/content/bg-middle-3.png" src="@/assets/images/business-supervision/bg/content/bg-middle-3.png"
/> />
<h2>智慧设备</h2> <h2>智慧设备</h2>
<div class="business-supervision__middle-detail"> <div class="business-supervision__middle-detail">
@ -38,7 +38,7 @@
<li> <li>
<img <img
alt="bg-middle-3" alt="bg-middle-3"
src="../../../../assets/images/business-supervision/bg/content/bg-middle-3.png" src="@/assets/images/business-supervision/bg/content/bg-middle-3.png"
/> />
<h2>数据报表</h2> <h2>数据报表</h2>
<div class="business-supervision__middle-detail"> <div class="business-supervision__middle-detail">
@ -70,6 +70,7 @@
width: 162px; width: 162px;
height: 183px; height: 183px;
object-fit: cover; object-fit: cover;
animation: shakeY 4s ease-in-out infinite;
} }
h2 { h2 {

View File

@ -0,0 +1,84 @@
import 'echarts/lib/component/dataZoom';
import { useDebounceFn, useEventListener } from '@vueuse/core';
import type { EChartsOption } from 'echarts';
import { type Ref, ref } from 'vue';
import echarts from '@/plugins/echarts';
const option = ref<EChartsOption>();
option.value = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
shadowStyle: {
shadowColor: '#66FFFF',
shadowBlur: 10,
},
},
},
grid: { top: '9%', right: '0%', left: '6%', bottom: '9%', containLabel: false },
xAxis: [
{
type: 'category',
data: [
'2021.01',
'2021.02',
'2021.03',
'2021.04',
'2021.05',
'2021.06',
'2021.07',
'2021.08',
'2021.09',
'2021.10',
'2021.11',
'2021.12',
],
axisTick: { alignWithLabel: true },
},
],
yAxis: [
{
type: 'value',
splitLine: {
show: true,
lineStyle: { type: 'solid', color: '#707070', width: 2 },
},
},
],
series: [
{
name: 'Direct',
type: 'bar',
barWidth: '40%',
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: '#00CCD2' },
{ offset: 1, color: '#00A2FF' },
]),
emphasis: {
shadowBlur: 10, // 取消阴影模糊
shadowColor: '#000', // 取消阴影颜色
},
},
label: { show: true, position: 'top', color: '#fff', fontSize: 14 },
data: [10, 52, 200, 334, 390, 330, 220, 500, 482, 499, 999, 444],
},
],
};
export const renderEcharts = (element: Ref<HTMLDivElement>) => {
const myChart = echarts.init(element.value, null, {
renderer: 'svg',
devicePixelRatio: window.devicePixelRatio,
});
const debouncedFn = useDebounceFn(() => {
myChart.resize();
}, 1000);
useEventListener(window, 'resize', debouncedFn);
myChart.setOption(option.value);
};

View File

@ -1,5 +1,6 @@
import 'echarts/lib/component/dataZoom'; import 'echarts/lib/component/dataZoom';
import { useDebounceFn, useEventListener } from '@vueuse/core';
import type { EChartsOption } from 'echarts'; import type { EChartsOption } from 'echarts';
import { type Ref, ref } from 'vue'; import { type Ref, ref } from 'vue';
@ -17,10 +18,15 @@ option.value = {
avoidLabelOverlap: false, avoidLabelOverlap: false,
label: { show: false, position: false }, label: { show: false, position: false },
labelLine: { show: false }, labelLine: { show: false },
emphasis: {
disabled: true, // 禁用 emphasis 状态
scale: false, // 禁用放大效果
scaleSize: 0, // 将放大尺寸设置为 0
},
data: [ data: [
{ {
value: 1048, value: 1048,
name: '国营企业', name: '国营',
itemStyle: { itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [ color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [
{ offset: 0, color: '#0DBBB3' }, { offset: 0, color: '#0DBBB3' },
@ -30,7 +36,7 @@ option.value = {
}, },
{ {
value: 735, value: 735,
name: '私营企业', name: '私营',
itemStyle: { itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [ color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [
{ offset: 0, color: '#DEA60F' }, { offset: 0, color: '#DEA60F' },
@ -41,16 +47,21 @@ option.value = {
], ],
}, },
{ {
name: '企业1', name: '企业',
type: 'pie', type: 'pie',
radius: ['54%', '74%'], radius: ['54%', '74%'],
avoidLabelOverlap: false, avoidLabelOverlap: false,
label: { show: false, position: false }, label: { show: false, position: false },
labelLine: { show: false }, labelLine: { show: false },
emphasis: {
disabled: true, // 禁用 emphasis 状态
scale: false, // 禁用放大效果
scaleSize: 0, // 将放大尺寸设置为 0
},
data: [ data: [
{ {
value: 1048, value: 1048,
name: '国营企业', name: '国营',
itemStyle: { itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [ color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [
{ offset: 0, color: '#0DBBB37f' }, { offset: 0, color: '#0DBBB37f' },
@ -60,7 +71,7 @@ option.value = {
}, },
{ {
value: 735, value: 735,
name: '私营企业', name: '私营',
itemStyle: { itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [ color: new echarts.graphic.LinearGradient(0, 0, 1, 1, [
{ offset: 0, color: '#DEA60F7F' }, { offset: 0, color: '#DEA60F7F' },
@ -78,5 +89,11 @@ export const renderEcharts = (element: Ref<HTMLDivElement>) => {
renderer: 'svg', renderer: 'svg',
devicePixelRatio: window.devicePixelRatio, devicePixelRatio: window.devicePixelRatio,
}); });
const debouncedFn = useDebounceFn(() => {
myChart.resize();
}, 1000);
useEventListener(window, 'resize', debouncedFn);
myChart.setOption(option.value); myChart.setOption(option.value);
}; };

View File

@ -1,5 +1,6 @@
import 'echarts/lib/component/dataZoom'; import 'echarts/lib/component/dataZoom';
import { useDebounceFn, useEventListener } from '@vueuse/core';
import type { EChartsOption } from 'echarts'; import type { EChartsOption } from 'echarts';
import { type Ref, ref } from 'vue'; import { type Ref, ref } from 'vue';
@ -48,5 +49,11 @@ export const renderEcharts = (element: Ref<HTMLDivElement>) => {
renderer: 'svg', renderer: 'svg',
devicePixelRatio: window.devicePixelRatio, devicePixelRatio: window.devicePixelRatio,
}); });
const debouncedFn = useDebounceFn(() => {
myChart.resize();
}, 1000);
useEventListener(window, 'resize', debouncedFn);
myChart.setOption(option.value); myChart.setOption(option.value);
}; };

View File

@ -6,13 +6,13 @@ const devices = ref<any>([
{ color: '#ff7e5f', title: 738, description: '设备总数1' }, { color: '#ff7e5f', title: 738, description: '设备总数1' },
{ color: '#ff7e5f', title: 738, description: '设备总数' }, { color: '#ff7e5f', title: 738, description: '设备总数' },
{ color: '#fff', title: 738, description: '设备总数' }, { color: '#fff', title: 738, description: '设备总数' },
{ color: '#ff7e5f', title: 738, description: '设备总数' }, { color: '#08D9F1', title: 738, description: '设备总数' },
], ],
[ [
{ color: '#2a65ea', title: '7.3k㎡', description: '设备总数' }, { color: '#ff7e5f', title: '7.3k㎡', description: '设备总数' },
{ color: '#2a65ea', title: 738, description: '设备总数' }, { color: '#2a65ea', title: 738, description: '设备总数' },
{ color: '#fff', title: 738, description: '设备总数' }, { color: '#fff', title: 738, description: '设备总数' },
{ color: '#2a65ea', title: 738, description: '设备总数' }, { color: '#08D9F1', title: 738, description: '设备总数' },
], ],
]); ]);
</script> </script>
@ -28,13 +28,12 @@ const devices = ref<any>([
<ul v-for="(parent, pIndex) in devices" :key="pIndex" class="flex-x-around mt-[12px]"> <ul v-for="(parent, pIndex) in devices" :key="pIndex" class="flex-x-around mt-[12px]">
<li v-for="(item, index) in parent" :key="index"> <li v-for="(item, index) in parent" :key="index">
<div class="manage-device"> <div class="manage-device">
<h1>{{ item.title.toString() }}</h1> <h1 :style="{ color: item.color }">{{ item.title.toString() }}</h1>
<p>{{ item.description }}</p> <p>{{ item.description }}</p>
<div class="device-carriage"> <div class="device-carriage">
<i :style="{ color: item.color }" class="i-mdi:electricity" /> <i :style="{ color: item.color }" class="i-mdi:electricity" />
</div> </div>
</div> </div>
<!--<manage-device :color="item.color" :description="item.description" :title="item.title" />-->
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -32,7 +32,7 @@ onMounted(() => {
</div> </div>
<div ref="chartPie" class="business-supervision__sidebar-card-chart-pie" /> <div ref="chartPie" class="business-supervision__sidebar-card-chart-pie" />
</div> </div>
<div class="business-supervision__sidebar-enterprise-type"> <div class="business-supervision__sidebar-card-enterprise-type">
<span class="mr-[13px]"> <span class="mr-[13px]">
<i class="bg-primary-secondary" /> <i class="bg-primary-secondary" />
国营企业 345 国营企业 345
@ -91,6 +91,7 @@ onMounted(() => {
} }
&-enterprise-type { &-enterprise-type {
margin: 4px 0 0 0;
width: 100%; width: 100%;
span { span {

View File

@ -37,7 +37,7 @@ const timeList = ref<TimeSelectType[]>([
<h1>$ 1.62</h1> <h1>$ 1.62</h1>
<img <img
alt="" alt=""
src="../../../../assets/images/business-supervision/bg/sidebar/bg-middle-coordinate.png" src="@/assets/images/business-supervision/bg/sidebar/bg-middle-coordinate.png"
/> />
<p>批准规划面积验收率</p> <p>批准规划面积验收率</p>
</li> </li>
@ -45,7 +45,7 @@ const timeList = ref<TimeSelectType[]>([
<h1>$ 1.62</h1> <h1>$ 1.62</h1>
<img <img
alt="" alt=""
src="../../../../assets/images/business-supervision/bg/sidebar/bg-middle-coordinate.png" src="@/assets/images/business-supervision/bg/sidebar/bg-middle-coordinate.png"
/> />
<p>批准规划面积验收率</p> <p>批准规划面积验收率</p>
</li> </li>
@ -53,7 +53,7 @@ const timeList = ref<TimeSelectType[]>([
<h1>$ 1.62</h1> <h1>$ 1.62</h1>
<img <img
alt="" alt=""
src="../../../../assets/images/business-supervision/bg/sidebar/bg-middle-coordinate.png" src="@/assets/images/business-supervision/bg/sidebar/bg-middle-coordinate.png"
/> />
<p>批准规划面积验收率</p> <p>批准规划面积验收率</p>
</li> </li>
@ -119,6 +119,7 @@ const timeList = ref<TimeSelectType[]>([
margin: 9px 0 0 0; margin: 9px 0 0 0;
width: 44px; width: 44px;
height: 50px; height: 50px;
animation: bounce 4s ease-in-out infinite;
} }
p { p {

View File

@ -1,5 +1,6 @@
import 'echarts/lib/component/dataZoom'; import 'echarts/lib/component/dataZoom';
import { useDebounceFn, useEventListener } from '@vueuse/core';
import type { EChartsOption } from 'echarts'; import type { EChartsOption } from 'echarts';
import { type Ref, ref } from 'vue'; import { type Ref, ref } from 'vue';
@ -100,5 +101,11 @@ export const renderEcharts = (element: Ref<HTMLDivElement>) => {
renderer: 'svg', renderer: 'svg',
devicePixelRatio: window.devicePixelRatio, devicePixelRatio: window.devicePixelRatio,
}); });
const debouncedFn = useDebounceFn(() => {
myChart.resize();
}, 1000);
useEventListener(window, 'resize', debouncedFn);
myChart.setOption(option.value); myChart.setOption(option.value);
}; };