mirror of
https://github.com/TangSengDaoDao/TangSengDaoDaoManager
synced 2025-06-06 09:08:23 +00:00
143 lines
3.4 KiB
Vue
143 lines
3.4 KiB
Vue
<template>
|
|
<div class="el-card flex flex-col box-border h-full w-full relative">
|
|
<div class="h-50px pl-12px pr-12px box-border flex items-center justify-between bd-title">
|
|
<div class="bd-title-left">
|
|
<p class="m-0 font-600">注册用户统计</p>
|
|
</div>
|
|
</div>
|
|
<div class="flex-1 flex overflow-hidden p-12px">
|
|
<div class="flex-1">
|
|
<div ref="echartsRef" class="w-full h-full"></div>
|
|
</div>
|
|
<div class="w-400px h-full">
|
|
<div class="mb-12px font-600">注册量排名</div>
|
|
<div class="panking">
|
|
<template v-for="(item, index) in sortData" :key="index">
|
|
<div v-if="index < 10" class="panking-item">
|
|
<div class="index">{{ index + 1 }}</div>
|
|
<div class="date flex-1">{{ item.time }}</div>
|
|
<div class="num">{{ item.value }}</div>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" name="AddUser" setup>
|
|
import * as echarts from 'echarts';
|
|
import dayjs from 'dayjs';
|
|
// API 接口
|
|
import { statisticsRegisteruserGet } from '@/api/statistic';
|
|
interface IProps {
|
|
title?: string;
|
|
value?: number;
|
|
icon?: string;
|
|
}
|
|
|
|
interface ISort {
|
|
time: string;
|
|
value: number;
|
|
}
|
|
|
|
defineProps<IProps>();
|
|
|
|
let myChart: echarts.ECharts | null = null;
|
|
const echartsRef = ref<HTMLElement>();
|
|
const sortData = ref<ISort[]>([]);
|
|
const dates = ref<string[]>([]);
|
|
|
|
const option: any = reactive({
|
|
xAxis: {
|
|
type: 'category',
|
|
data: []
|
|
},
|
|
tooltip: {
|
|
trigger: 'axis'
|
|
},
|
|
yAxis: {
|
|
type: 'value'
|
|
},
|
|
series: {
|
|
data: [],
|
|
type: 'line'
|
|
}
|
|
});
|
|
const getStatisticsRegisteruser = () => {
|
|
statisticsRegisteruserGet(dates.value[0], dates.value[1]).then((res: any) => {
|
|
const sortList: ISort[] = [];
|
|
const xAxisData = [];
|
|
const seriesData = [];
|
|
for (const key in res) {
|
|
sortList.push({
|
|
time: key,
|
|
value: res[key]
|
|
});
|
|
xAxisData.push(key);
|
|
seriesData.push(res[key]);
|
|
}
|
|
sortList.sort((a, b) => {
|
|
return b.value - a.value;
|
|
});
|
|
sortData.value = sortList;
|
|
option.xAxis.data = xAxisData;
|
|
option.series.data = seriesData;
|
|
myChart && myChart.setOption(option);
|
|
myChart && myChart.resize();
|
|
window.addEventListener('resize', echartsResize);
|
|
});
|
|
};
|
|
|
|
const echartsResize = () => {
|
|
myChart && myChart.resize();
|
|
};
|
|
|
|
onMounted(() => {
|
|
const start = dayjs(new Date().getTime() - 30 * 24 * 60 * 60 * 1000).format('YYYY-MM-DD');
|
|
const end = dayjs().format('YYYY-MM-DD');
|
|
dates.value = [start, end];
|
|
myChart = echarts.init(echartsRef.value as HTMLElement);
|
|
getStatisticsRegisteruser();
|
|
});
|
|
|
|
// 防止 echarts 页面 keepAlive 时,还在继续监听页面
|
|
onDeactivated(() => {
|
|
window.removeEventListener('resize', echartsResize);
|
|
});
|
|
|
|
onBeforeUnmount(() => {
|
|
window.removeEventListener('resize', echartsResize);
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
// 样式
|
|
.bd-title {
|
|
border-bottom: 1px solid var(--el-card-border-color);
|
|
}
|
|
|
|
.panking {
|
|
.panking-item {
|
|
display: flex;
|
|
justify-content: center;
|
|
margin-bottom: 16px;
|
|
:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
.index {
|
|
width: 20px;
|
|
height: 20px;
|
|
line-height: 20px;
|
|
font-weight: 600;
|
|
font-size: 12px;
|
|
text-align: center;
|
|
background-color: rgb(0, 80, 179);
|
|
color: rgb(255, 255, 255);
|
|
border-radius: 20px;
|
|
margin-right: 12px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|