feat: 左侧中间完成
This commit is contained in:
parent
c5a0670c16
commit
2b11631b39
|
@ -1,6 +0,0 @@
|
||||||
{
|
|
||||||
"recommendations": [
|
|
||||||
"Vue.volar",
|
|
||||||
"rvest.vs-code-prettier-eslint"
|
|
||||||
]
|
|
||||||
}
|
|
|
@ -21,7 +21,7 @@
|
||||||
"@vueuse/core": "^12.8.2",
|
"@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.8.2",
|
||||||
"boxen": "^8.0.1",
|
"boxen": "^8.0.1",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"echarts": "^5.6.0",
|
"echarts": "^5.6.0",
|
||||||
|
|
|
@ -36,8 +36,8 @@ importers:
|
||||||
specifier: ^3.2.4
|
specifier: ^3.2.4
|
||||||
version: 3.2.4
|
version: 3.2.4
|
||||||
axios:
|
axios:
|
||||||
specifier: ^1.7.9
|
specifier: 1.8.2
|
||||||
version: 1.7.9
|
version: 1.8.2
|
||||||
boxen:
|
boxen:
|
||||||
specifier: ^8.0.1
|
specifier: ^8.0.1
|
||||||
version: 8.0.1
|
version: 8.0.1
|
||||||
|
@ -1115,8 +1115,8 @@ packages:
|
||||||
autofit.js@3.2.4:
|
autofit.js@3.2.4:
|
||||||
resolution: {integrity: sha512-THNaA9w55nVNzhsajMgQjtg01VZmHG0jq+HtzDOK7SXCtCiuzDu6tzbGPmt0EbuIM+7oSlKUnfRnXKKGYv8/PA==}
|
resolution: {integrity: sha512-THNaA9w55nVNzhsajMgQjtg01VZmHG0jq+HtzDOK7SXCtCiuzDu6tzbGPmt0EbuIM+7oSlKUnfRnXKKGYv8/PA==}
|
||||||
|
|
||||||
axios@1.7.9:
|
axios@1.8.2:
|
||||||
resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
|
resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==}
|
||||||
|
|
||||||
balanced-match@1.0.2:
|
balanced-match@1.0.2:
|
||||||
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
|
||||||
|
@ -3636,7 +3636,7 @@ snapshots:
|
||||||
|
|
||||||
autofit.js@3.2.4: {}
|
autofit.js@3.2.4: {}
|
||||||
|
|
||||||
axios@1.7.9:
|
axios@1.8.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
follow-redirects: 1.15.9
|
follow-redirects: 1.15.9
|
||||||
form-data: 4.0.2
|
form-data: 4.0.2
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 4.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 388 KiB |
|
@ -1,7 +1,7 @@
|
||||||
import formatter from '@/utils/digte-formatter';
|
import { formatter } from '@/utils/chart';
|
||||||
|
|
||||||
/** 显示金额 */
|
/** 显示金额 */
|
||||||
export const displayContent = (money) => {
|
export const displayContent = (money: any) => {
|
||||||
const moneyString: string = formatter(money);
|
const moneyString: string = formatter(money);
|
||||||
const moneyStringList = moneyString
|
const moneyStringList = moneyString
|
||||||
.split(/(\d,)/g)
|
.split(/(\d,)/g)
|
||||||
|
|
|
@ -1,15 +1,22 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { onBeforeMount } from 'vue';
|
||||||
import { useRoute, useRouter } from 'vue-router';
|
import { useRoute, useRouter } from 'vue-router';
|
||||||
|
|
||||||
import CommonHeader from '@/components/CommonHeader/CommonHeader.vue';
|
import CommonHeader from '@/components/CommonHeader/CommonHeader.vue';
|
||||||
import LayoutHeader from '@/components/CommonHeader/LayoutHeader.vue';
|
import LayoutHeader from '@/components/CommonHeader/LayoutHeader.vue';
|
||||||
|
import { useAppStore } from '@/store/app';
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
const appStore = useAppStore();
|
||||||
|
|
||||||
|
onBeforeMount(() => {
|
||||||
|
appStore.setBackground('../assets/images/common/bg/bg-layout.png');
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="layout-container">
|
<div :style="{ background: appStore.background }" class="layout-container">
|
||||||
<layout-header v-if="route.name === 'welcome'" />
|
<layout-header v-if="route.name === 'welcome'" />
|
||||||
<common-header v-else />
|
<common-header v-else />
|
||||||
|
|
||||||
|
@ -24,8 +31,9 @@ const route = useRoute();
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: url('@/assets/images/common/bg/bg-layout.png') no-repeat center;
|
background-repeat: no-repeat !important;
|
||||||
background-size: cover;
|
background-position: center !important;
|
||||||
|
background-size: cover !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { BarChart, LineChart, PictorialBarChart, PieChart } from 'echarts/charts';
|
import { BarChart, GaugeChart, LineChart, PictorialBarChart, PieChart } from 'echarts/charts';
|
||||||
import {
|
import {
|
||||||
DataZoomComponent,
|
DataZoomComponent,
|
||||||
GraphicComponent,
|
GraphicComponent,
|
||||||
|
@ -31,6 +31,7 @@ use([
|
||||||
DataZoomComponent,
|
DataZoomComponent,
|
||||||
VisualMapComponent,
|
VisualMapComponent,
|
||||||
PictorialBarChart,
|
PictorialBarChart,
|
||||||
|
GaugeChart,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -16,6 +16,7 @@ export default {
|
||||||
setupDirective(app);
|
setupDirective(app);
|
||||||
// 根据需求引入echarts
|
// 根据需求引入echarts
|
||||||
useEcharts(app);
|
useEcharts(app);
|
||||||
|
// 使用autoFit,在环境配置文件中设置
|
||||||
autoFit();
|
autoFit();
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
import { defineStore } from 'pinia';
|
||||||
|
|
||||||
|
import { isCSSColor, isPath } from '@/utils/regexp/regexpBackground';
|
||||||
|
|
||||||
|
const useAppStore = defineStore('appStore', {
|
||||||
|
state() {
|
||||||
|
return {
|
||||||
|
background: '',
|
||||||
|
};
|
||||||
|
},
|
||||||
|
getters: {},
|
||||||
|
actions: {
|
||||||
|
setBackground(background) {
|
||||||
|
if (isCSSColor(background)) {
|
||||||
|
this.background = background;
|
||||||
|
} else if (isPath(background)) {
|
||||||
|
const href = new URL(background, import.meta.url).href;
|
||||||
|
this.background = `url(${href})`;
|
||||||
|
} else {
|
||||||
|
const href = new URL('../assets/images/common/bg/bg-layout.png', import.meta.url).href;
|
||||||
|
this.background = `url(${href})`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export { useAppStore };
|
|
@ -3,7 +3,7 @@ import { defineStore } from 'pinia';
|
||||||
import { user } from '@/api/test';
|
import { user } from '@/api/test';
|
||||||
|
|
||||||
/** 用户信息 */
|
/** 用户信息 */
|
||||||
export const useUserStore = defineStore('userStore', {
|
const useUserStore = defineStore('userStore', {
|
||||||
state() {
|
state() {
|
||||||
return {
|
return {
|
||||||
userinfo: {},
|
userinfo: {},
|
||||||
|
@ -19,3 +19,5 @@ export const useUserStore = defineStore('userStore', {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export { useUserStore };
|
||||||
|
|
|
@ -2,13 +2,18 @@ import { useEventListener } from '@vueuse/core';
|
||||||
import type { EChartsType } from 'echarts';
|
import type { EChartsType } from 'echarts';
|
||||||
|
|
||||||
/** 通用重置图表样式 */
|
/** 通用重置图表样式 */
|
||||||
export const debounceChart = (myChart: EChartsType) => {
|
export const debounceChart = (myChart: EChartsType | undefined) => {
|
||||||
useEventListener(
|
useEventListener(window, 'resize', () => {
|
||||||
window,
|
myChart!.resize();
|
||||||
'resize',
|
});
|
||||||
() => {
|
};
|
||||||
myChart.resize();
|
|
||||||
},
|
/** 数字格式化 */
|
||||||
500
|
export const formatter = (number: any) => {
|
||||||
);
|
const numbers = number.toString().split('').reverse();
|
||||||
|
const segs = [];
|
||||||
|
|
||||||
|
while (numbers.length) segs.push(numbers.splice(0, 3).join(''));
|
||||||
|
|
||||||
|
return segs.join(',').split('').reverse().join('');
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
export function formatter(number) {
|
|
||||||
const numbers = number.toString().split('').reverse();
|
|
||||||
const segs = [];
|
|
||||||
|
|
||||||
while (numbers.length) segs.push(numbers.splice(0, 3).join(''));
|
|
||||||
|
|
||||||
return segs.join(',').split('').reverse().join('');
|
|
||||||
}
|
|
||||||
|
|
||||||
export default formatter;
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/** 判断是否是CSS颜色 */
|
||||||
|
function isCSSColor(str) {
|
||||||
|
// 匹配十六进制颜色(如 #fff, #ffffff)
|
||||||
|
const hexColor = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
|
||||||
|
|
||||||
|
// 匹配RGB/RGBA颜色(如 rgb(255, 255, 255), rgba(255, 255, 255, 0.5))
|
||||||
|
const rgbColor = /^rgba?\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*(,\s*[\d\.]+)?\s*\)$/;
|
||||||
|
|
||||||
|
// 匹配HSL/HSLA颜色(如 hsl(120, 100%, 50%), hsla(120, 100%, 50%, 0.5))
|
||||||
|
const hslColor = /^hsla?\(\s*\d{1,3}\s*,\s*\d{1,3}%\s*,\s*\d{1,3}%\s*(,\s*[\d\.]+)?\s*\)$/;
|
||||||
|
|
||||||
|
// 匹配预定义颜色名称(如 red, blue, green)
|
||||||
|
const namedColor = /^[a-zA-Z]+$/;
|
||||||
|
|
||||||
|
return hexColor.test(str) || rgbColor.test(str) || hslColor.test(str) || namedColor.test(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 判断是否是相对路径或绝对路径 */
|
||||||
|
function isPath(str) {
|
||||||
|
// 匹配相对路径(如 ./path, ../path, path/to/file)
|
||||||
|
const relativePath = /^\.{0,2}\/[^\/].*$/;
|
||||||
|
|
||||||
|
// 匹配绝对路径(如 /path/to/file, C:\path\to\file)
|
||||||
|
const absolutePath = /^(?:\/|[A-Za-z]:\\).*$/;
|
||||||
|
|
||||||
|
return relativePath.test(str) || absolutePath.test(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
export { isCSSColor, isPath };
|
|
@ -0,0 +1,120 @@
|
||||||
|
import 'echarts/lib/component/dataZoom';
|
||||||
|
|
||||||
|
import type { EChartsOption, EChartsType } from 'echarts';
|
||||||
|
import { defineComponent, onMounted, type Ref, ref, watch } from 'vue';
|
||||||
|
|
||||||
|
import echarts from '@/plugins/echarts';
|
||||||
|
import { debounceChart } from '@/utils/chart';
|
||||||
|
|
||||||
|
const itemStyles = [
|
||||||
|
{
|
||||||
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{ offset: 0, color: '#00CCD2' },
|
||||||
|
{ offset: 1, color: '#00A2FF' },
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
{ offset: 0, color: '#CBB668' },
|
||||||
|
{ offset: 1, color: '#FABC00' },
|
||||||
|
]),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const option: Ref<EChartsOption | undefined> = ref<EChartsOption>();
|
||||||
|
option.value = {
|
||||||
|
grid: { top: '9%', right: '0%', left: '0%', bottom: '0%', containLabel: false },
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'gauge',
|
||||||
|
title: { fontSize: 14, color: '#fff', offsetCenter: ['0%', '14%'] },
|
||||||
|
startAngle: 90,
|
||||||
|
endAngle: -270,
|
||||||
|
pointer: { show: false },
|
||||||
|
progress: { show: true, overlap: false, roundCap: false, clip: false },
|
||||||
|
axisLine: { lineStyle: { width: 14 } },
|
||||||
|
splitLine: { show: false, distance: 0, length: 10 },
|
||||||
|
axisTick: { show: false },
|
||||||
|
axisLabel: { show: false, distance: 50 },
|
||||||
|
// data: [
|
||||||
|
// {
|
||||||
|
// value: 80,
|
||||||
|
// name: '环比变化',
|
||||||
|
// detail: { valueAnimation: true, offsetCenter: ['0%', '-20%'] },
|
||||||
|
// itemStyle: {
|
||||||
|
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||||||
|
// { offset: 0, color: '#00CCD2' },
|
||||||
|
// { offset: 1, color: '#00A2FF' },
|
||||||
|
// ]),
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
detail: {
|
||||||
|
width: 10,
|
||||||
|
height: 50,
|
||||||
|
fontSize: 14,
|
||||||
|
fontWeight: 0,
|
||||||
|
color: '#fff',
|
||||||
|
formatter: '+{value}%',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 绘制图表 */
|
||||||
|
export const renderEcharts: any = (
|
||||||
|
myChart: Ref<EChartsType | undefined>,
|
||||||
|
element: Ref<HTMLDivElement | undefined>
|
||||||
|
) => {
|
||||||
|
myChart.value = echarts.init(element.value, null, {
|
||||||
|
renderer: 'svg',
|
||||||
|
devicePixelRatio: window.devicePixelRatio,
|
||||||
|
}) as any;
|
||||||
|
|
||||||
|
debounceChart(myChart.value);
|
||||||
|
|
||||||
|
myChart.value!.setOption(option.value!);
|
||||||
|
};
|
||||||
|
|
||||||
|
/* 封装组件 */
|
||||||
|
export const ChartProgress = defineComponent({
|
||||||
|
props: {
|
||||||
|
percent: {
|
||||||
|
type: Number,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const chart = ref<HTMLDivElement>();
|
||||||
|
const myChart = ref<EChartsType>();
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
renderEcharts(myChart, chart);
|
||||||
|
updateChart(myChart, props);
|
||||||
|
watch(
|
||||||
|
() => props.percent,
|
||||||
|
() => {
|
||||||
|
updateChart(myChart, props);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
return () => <div ref={chart} class="progress"></div>;
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const updateChart = (myChart: Ref<EChartsType | undefined>, props: any) => {
|
||||||
|
myChart.value?.setOption({
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
name: '环比变化',
|
||||||
|
value: props.percent,
|
||||||
|
detail: { valueAnimation: true, offsetCenter: ['0%', '-20%'] },
|
||||||
|
itemStyle: props.percent >= 20 ? itemStyles[0] : itemStyles[1],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
};
|
|
@ -1,13 +1,101 @@
|
||||||
<script lang="ts" setup></script>
|
<script lang="tsx" setup>
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
|
||||||
|
import { formatter } from '@/utils/chart';
|
||||||
|
import { ChartProgress } from '@/views/big-data/charts/left-middle';
|
||||||
|
|
||||||
|
const randomNumber = (range: number = 100) => {
|
||||||
|
return parseInt((Math.random() * range).toFixed(0));
|
||||||
|
};
|
||||||
|
|
||||||
|
const list = ref([
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
]);
|
||||||
|
|
||||||
|
const renderItem = () => {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{list.value.map((item, index) => {
|
||||||
|
return (
|
||||||
|
<li key={index}>
|
||||||
|
<div>
|
||||||
|
<h1>{item.title}</h1>
|
||||||
|
<em>¥ {formatter(item.amount)}</em>
|
||||||
|
</div>
|
||||||
|
<ChartProgress percent={item.percent} />
|
||||||
|
</li>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
setInterval(() => {
|
||||||
|
list.value = [
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
{ title: '经营总收入', amount: randomNumber(9999999), percent: randomNumber() },
|
||||||
|
];
|
||||||
|
}, 1000);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="big-data__sidebar-item h-[389px]">
|
<div class="big-data__sidebar-item h-[389px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="big-data__sidebar-title">
|
<h1 class="big-data__sidebar-title">规模效益</h1>
|
||||||
<h1>规模效益</h1>
|
<span class="big-data__sidebar-title-describe">截止时间至2021年6月</span>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<component :is="renderItem()" />
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped>
|
||||||
|
ul {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-content: space-between;
|
||||||
|
margin: 18px 0 0 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
li {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0 18px 0 14px;
|
||||||
|
width: 248px;
|
||||||
|
height: 143px;
|
||||||
|
background: url('@/assets/images/big-data/bg/bg-middle.png') no-repeat center;
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
.progress {
|
||||||
|
position: absolute;
|
||||||
|
top: -10px;
|
||||||
|
right: -5px;
|
||||||
|
width: 90px;
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
em {
|
||||||
|
font-size: 28px;
|
||||||
|
color: var(--color-warning-secondary);
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -15,10 +15,7 @@ const timeList = ref<TimeSelectType[]>([
|
||||||
<template>
|
<template>
|
||||||
<div class="big-data__sidebar-item">
|
<div class="big-data__sidebar-item">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="big-data__sidebar-title">
|
<h1 class="big-data__sidebar-title">规模效益</h1>
|
||||||
<h1>规模效益</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<TimeSelect :time-list="timeList" />
|
<TimeSelect :time-list="timeList" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -64,19 +61,20 @@ const timeList = ref<TimeSelectType[]>([
|
||||||
ul {
|
ul {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
justify-content: space-between;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 198px;
|
||||||
|
|
||||||
li {
|
li {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin: 18px 0 0 0;
|
margin: 9px 0 0 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.big-data__sidebar-item {
|
.big-data__sidebar-item {
|
||||||
height: 296px;
|
height: 274px;
|
||||||
|
|
||||||
&-body-title {
|
&-body-title {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
|
@ -12,7 +12,7 @@ const timeList = ref<TimeSelectType[]>([
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="big-data__sidebar-item h-[200px]">
|
<div class="big-data__sidebar-item">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="big-data__sidebar-title">
|
<div class="big-data__sidebar-title">
|
||||||
<h1>规模效益</h1>
|
<h1>规模效益</h1>
|
||||||
|
@ -25,4 +25,8 @@ const timeList = ref<TimeSelectType[]>([
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
<style lang="scss" scoped>
|
||||||
|
.big-data__sidebar-item {
|
||||||
|
height: 274px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -1,7 +1,16 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { onBeforeMount } from 'vue';
|
||||||
|
|
||||||
|
import { useAppStore } from '@/store/app';
|
||||||
import BigDataContent from '@/views/big-data/components/big-data-content/index.vue';
|
import BigDataContent from '@/views/big-data/components/big-data-content/index.vue';
|
||||||
import BigDataLeft from '@/views/big-data/components/big-data-left/index.vue';
|
import BigDataLeft from '@/views/big-data/components/big-data-left/index.vue';
|
||||||
import BigDataRight from '@/views/big-data/components/big-data-right/index.vue';
|
import BigDataRight from '@/views/big-data/components/big-data-right/index.vue';
|
||||||
|
|
||||||
|
const appStore = useAppStore();
|
||||||
|
|
||||||
|
onBeforeMount(async () => {
|
||||||
|
appStore.setBackground('#04072F');
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -17,7 +26,7 @@ import BigDataRight from '@/views/big-data/components/big-data-right/index.vue';
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
padding: 0 25px;
|
padding: 0 25px 14px 25px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
|
|
|
@ -53,10 +53,10 @@ option.value = {
|
||||||
{ offset: 1, color: '#00A2FF' },
|
{ offset: 1, color: '#00A2FF' },
|
||||||
]),
|
]),
|
||||||
},
|
},
|
||||||
emphasis: {
|
// emphasis: {
|
||||||
shadowBlur: 10, // 取消阴影模糊
|
// shadowBlur: 10, // 取消阴影模糊
|
||||||
shadowColor: '#000', // 取消阴影颜色
|
// shadowColor: '#000', // 取消阴影颜色
|
||||||
},
|
// },
|
||||||
label: { show: true, position: 'top', color: '#fff', fontSize: 14 },
|
label: { show: true, position: 'top', color: '#fff', fontSize: 14 },
|
||||||
data: [10, 52, 200, 334, 390, 330, 220, 500, 482, 499, 999, 444],
|
data: [10, 52, 200, 334, 390, 330, 220, 500, 482, 499, 999, 444],
|
||||||
},
|
},
|
||||||
|
@ -64,7 +64,7 @@ option.value = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export const renderEcharts = (element: Ref<HTMLDivElement>) => {
|
export const renderEcharts = (element: Ref<HTMLDivElement>) => {
|
||||||
const myChart = echarts.init(element.value, null, {
|
const myChart: any = echarts.init(element.value, null, {
|
||||||
renderer: 'svg',
|
renderer: 'svg',
|
||||||
devicePixelRatio: window.devicePixelRatio,
|
devicePixelRatio: window.devicePixelRatio,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
import 'echarts/lib/component/dataZoom';
|
import 'echarts/lib/component/dataZoom';
|
||||||
|
|
||||||
import type { EChartsOption } from 'echarts';
|
|
||||||
import { type Ref, ref } from 'vue';
|
import { type Ref, ref } from 'vue';
|
||||||
|
|
||||||
import echarts from '@/plugins/echarts';
|
import echarts from '@/plugins/echarts';
|
||||||
import { debounceChart } from '@/utils/chart';
|
import { debounceChart } from '@/utils/chart';
|
||||||
|
|
||||||
const option = ref<EChartsOption>();
|
const option = ref();
|
||||||
option.value = {
|
option.value = {
|
||||||
tooltip: { trigger: 'item' },
|
tooltip: { trigger: 'item' },
|
||||||
grid: { top: 0, left: 0, right: 0, bottom: 0, containLabel: false },
|
grid: { top: 0, left: 0, right: 0, bottom: 0, containLabel: false },
|
||||||
|
@ -85,7 +84,7 @@ option.value = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export const renderEcharts = (element: Ref<HTMLDivElement>) => {
|
export const renderEcharts = (element: Ref<HTMLDivElement>) => {
|
||||||
const myChart = echarts.init(element.value, null, {
|
const myChart: any = echarts.init(element.value, null, {
|
||||||
renderer: 'svg',
|
renderer: 'svg',
|
||||||
devicePixelRatio: window.devicePixelRatio,
|
devicePixelRatio: window.devicePixelRatio,
|
||||||
});
|
});
|
||||||
|
|
|
@ -20,9 +20,7 @@ const devices = ref<any>([
|
||||||
<template>
|
<template>
|
||||||
<div class="business-supervision__sidebar-item h-[294px]">
|
<div class="business-supervision__sidebar-item h-[294px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="business-supervision__sidebar-title">
|
<h1 class="business-supervision__sidebar-title">地理规划</h1>
|
||||||
<h1>地理规划</h1>
|
|
||||||
</div>
|
|
||||||
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
||||||
</div>
|
</div>
|
||||||
<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]">
|
||||||
|
|
|
@ -13,9 +13,7 @@ onMounted(() => {
|
||||||
<template>
|
<template>
|
||||||
<div class="business-supervision__sidebar-item h-[354px]">
|
<div class="business-supervision__sidebar-item h-[354px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="business-supervision__sidebar-title">
|
<h1 class="business-supervision__sidebar-title">企业信息</h1>
|
||||||
<h1>企业信息</h1>
|
|
||||||
</div>
|
|
||||||
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,7 @@ onMounted(() => {
|
||||||
<template>
|
<template>
|
||||||
<div class="business-supervision__sidebar-item h-[246px]">
|
<div class="business-supervision__sidebar-item h-[246px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="business-supervision__sidebar-title">
|
<h1 class="business-supervision__sidebar-title">园区进出口额</h1>
|
||||||
<h1>园区进出口额</h1>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<span class="business-supervision__sidebar-tag">总数据</span>
|
<span class="business-supervision__sidebar-tag">总数据</span>
|
||||||
<TimeSelect :time-list="timeList" />
|
<TimeSelect :time-list="timeList" />
|
||||||
|
|
|
@ -17,9 +17,7 @@ onMounted(() => {
|
||||||
<template>
|
<template>
|
||||||
<div class="business-supervision__sidebar-item h-[294px]">
|
<div class="business-supervision__sidebar-item h-[294px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="business-supervision__sidebar-title">
|
<h1 class="business-supervision__sidebar-title">地理规划</h1>
|
||||||
<h1>地理规划</h1>
|
|
||||||
</div>
|
|
||||||
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,7 @@ const list = [
|
||||||
<template>
|
<template>
|
||||||
<div class="business-supervision__sidebar-item h-[354px]">
|
<div class="business-supervision__sidebar-item h-[354px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="business-supervision__sidebar-title">
|
<h1 class="business-supervision__sidebar-title">企业信息</h1>
|
||||||
<h1>企业信息</h1>
|
|
||||||
</div>
|
|
||||||
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
<span class="business-supervision__sidebar-title-describe">截止时间至2021.12.30</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -14,10 +14,7 @@ const timeList = ref<TimeSelectType[]>([
|
||||||
<template>
|
<template>
|
||||||
<div class="business-supervision__sidebar-item h-[246px]">
|
<div class="business-supervision__sidebar-item h-[246px]">
|
||||||
<div class="flex-x-between">
|
<div class="flex-x-between">
|
||||||
<div class="business-supervision__sidebar-title">
|
<h1 class="business-supervision__sidebar-title">园区进出口额</h1>
|
||||||
<h1>园区进出口额</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span class="business-supervision__sidebar-tag">总数据</span>
|
<span class="business-supervision__sidebar-tag">总数据</span>
|
||||||
<TimeSelect :time-list="timeList" />
|
<TimeSelect :time-list="timeList" />
|
||||||
|
|
|
@ -1,7 +1,16 @@
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
|
import { onBeforeMount } from 'vue';
|
||||||
|
|
||||||
|
import { useAppStore } from '@/store/app';
|
||||||
import MangeContent from '@/views/business-supervision/components/business-supervision-content/index.vue';
|
import MangeContent from '@/views/business-supervision/components/business-supervision-content/index.vue';
|
||||||
import BusinessSupervisionLeft from '@/views/business-supervision/components/business-supervision-left/index.vue';
|
import BusinessSupervisionLeft from '@/views/business-supervision/components/business-supervision-left/index.vue';
|
||||||
import BusinessSupervisionRight from '@/views/business-supervision/components/business-supervision-right/index.vue';
|
import BusinessSupervisionRight from '@/views/business-supervision/components/business-supervision-right/index.vue';
|
||||||
|
|
||||||
|
const appStore = useAppStore();
|
||||||
|
|
||||||
|
onBeforeMount(() => {
|
||||||
|
appStore.setBackground('../assets/images/common/bg/bg-secondary.png');
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
|
|
@ -20,5 +20,40 @@ import SmartPartFooter from '@/views/smart-park/components/smart-park-footer/ind
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@use 'style.scss';
|
.smart-park {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
&__arrow {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 65px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&__sidebar {
|
||||||
|
width: 380px;
|
||||||
|
height: 650px;
|
||||||
|
background: url('@/assets/images/smart-park/bg/bg-side.png') no-repeat center;
|
||||||
|
background-size: cover;
|
||||||
|
transition: transform 0.8s;
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
|
||||||
|
.smart-park__sidebar-title {
|
||||||
|
width: 218px;
|
||||||
|
height: 59px;
|
||||||
|
background: url('@/assets/images/smart-park/bg/bg-road-condition.png') no-repeat center;
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
.smart-park {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
&__arrow {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 65px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&__sidebar {
|
|
||||||
width: 380px;
|
|
||||||
height: 650px;
|
|
||||||
background: url('@/assets/images/smart-park/bg/bg-side.png') no-repeat center;
|
|
||||||
background-size: cover;
|
|
||||||
transition: transform 0.8s;
|
|
||||||
transform-style: preserve-3d;
|
|
||||||
|
|
||||||
.smart-park__sidebar-title {
|
|
||||||
width: 218px;
|
|
||||||
height: 59px;
|
|
||||||
background: url('@/assets/images/smart-park/bg/bg-road-condition.png') no-repeat center;
|
|
||||||
background-size: cover;
|
|
||||||
|
|
||||||
h1 {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -11,5 +11,32 @@ import WelcomeFooter from '@/views/welcome/components/welcome-footer.vue';
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@use 'style.scss';
|
.welcome {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: url('@/assets/images/welcome/bg/bg-particle.png') no-repeat center;
|
||||||
|
background-size: cover;
|
||||||
|
|
||||||
|
&__content {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: space-around;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
p {
|
||||||
|
color: #fff;
|
||||||
|
font-size: 16px;
|
||||||
|
|
||||||
|
i {
|
||||||
|
color: var(--color-primary-secondary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 239px;
|
||||||
|
height: 34px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
.welcome {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: url('@/assets/images/welcome/bg/bg-particle.png') no-repeat center;
|
|
||||||
background-size: cover;
|
|
||||||
|
|
||||||
&__content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
justify-content: space-around;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
p {
|
|
||||||
color: #fff;
|
|
||||||
font-size: 16px;
|
|
||||||
|
|
||||||
i {
|
|
||||||
color: var(--color-primary-secondary);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 239px;
|
|
||||||
height: 34px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -20,6 +20,7 @@
|
||||||
"forceConsistentCasingInFileNames": true,
|
"forceConsistentCasingInFileNames": true,
|
||||||
"jsx": "preserve",
|
"jsx": "preserve",
|
||||||
"jsxFactory": "h",
|
"jsxFactory": "h",
|
||||||
|
"jsxImportSource": "vue",
|
||||||
"jsxFragmentFactory": "Fragment",
|
"jsxFragmentFactory": "Fragment",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": [
|
"@/*": [
|
||||||
|
|
Loading…
Reference in New Issue