From 4a196731f1a444653a0a87f538a2032605da3b7d Mon Sep 17 00:00:00 2001 From: InfinityPacer <160988576+InfinityPacer@users.noreply.github.com> Date: Thu, 23 Jul 2026 06:03:42 +0800 Subject: [PATCH] perf(dashboard): restore additional cards from snapshots (#574) --- .../dashboard/AnalyticsMediaStatistic.vue | 59 ++++--- src/views/dashboard/MediaRecommend.vue | 41 +++-- .../__tests__/AnalyticsMediaStatistic.spec.ts | 146 ++++++++++++++++++ .../__tests__/MediaRecommend.spec.ts | 90 ++++++++--- 4 files changed, 282 insertions(+), 54 deletions(-) create mode 100644 src/views/dashboard/__tests__/AnalyticsMediaStatistic.spec.ts diff --git a/src/views/dashboard/AnalyticsMediaStatistic.vue b/src/views/dashboard/AnalyticsMediaStatistic.vue index 0e4f4b06..ccbd27cf 100644 --- a/src/views/dashboard/AnalyticsMediaStatistic.vue +++ b/src/views/dashboard/AnalyticsMediaStatistic.vue @@ -2,18 +2,25 @@ import api from '@/api' import type { MediaStatistic } from '@/api/types' import { formatDashboardCount, useAnimatedDashboardNumber } from '@/composables/useDashboardMotion' +import { useDashboardSnapshot } from '@/composables/useDashboardSnapshot' import { useI18n } from 'vue-i18n' // 国际化 const { t } = useI18n() -const movieCount = ref(0) -const tvCount = ref(0) -const episodeCount = ref(null) -const userCount = ref(0) -const movieCountMonth = ref(0) -const tvCountMonth = ref(0) -const episodeCountMonth = ref(0) +const { readSnapshot, writeSnapshot } = useDashboardSnapshot('media-statistic-v1') +const currentSnapshot = readSnapshot() + +const movieCount = ref(Number(currentSnapshot?.value.movie_count) || 0) +const tvCount = ref(Number(currentSnapshot?.value.tv_count) || 0) +const episodeCount = ref( + currentSnapshot?.value.episode_count == null ? null : Number(currentSnapshot.value.episode_count) || 0, +) +const userCount = ref(Number(currentSnapshot?.value.user_count) || 0) +const movieCountMonth = ref(Number(currentSnapshot?.value.movie_count_month) || 0) +const tvCountMonth = ref(Number(currentSnapshot?.value.tv_count_month) || 0) +const episodeCountMonth = ref(Number(currentSnapshot?.value.episode_count_month) || 0) +let statisticLoadId = 0 const animatedMovieCount = useAnimatedDashboardNumber(movieCount, { duration: 720, @@ -24,10 +31,13 @@ const animatedTvCount = useAnimatedDashboardNumber(tvCount, { duration: 720, }) -const animatedEpisodeCount = useAnimatedDashboardNumber(computed(() => episodeCount.value ?? 0), { - delay: 120, - duration: 720, -}) +const animatedEpisodeCount = useAnimatedDashboardNumber( + computed(() => episodeCount.value ?? 0), + { + delay: 120, + duration: 720, + }, +) const animatedUserCount = useAnimatedDashboardNumber(userCount, { delay: 180, @@ -67,16 +77,29 @@ const statistics = computed(() => [ // 调用API加载媒体统计数据 async function loadMediaStatistic() { + const loadId = ++statisticLoadId try { const res: MediaStatistic = await api.get('dashboard/statistic') + if (loadId !== statisticLoadId) return - movieCount.value = Number(res.movie_count) || 0 - tvCount.value = Number(res.tv_count) || 0 - episodeCount.value = res.episode_count == null ? null : Number(res.episode_count) || 0 - userCount.value = Number(res.user_count) || 0 - movieCountMonth.value = Number(res.movie_count_month) || 0 - tvCountMonth.value = Number(res.tv_count_month) || 0 - episodeCountMonth.value = Number(res.episode_count_month) || 0 + const statistic: MediaStatistic = { + movie_count: Number(res.movie_count) || 0, + tv_count: Number(res.tv_count) || 0, + episode_count: res.episode_count == null ? null : Number(res.episode_count) || 0, + user_count: Number(res.user_count) || 0, + movie_count_month: Number(res.movie_count_month) || 0, + tv_count_month: Number(res.tv_count_month) || 0, + episode_count_month: Number(res.episode_count_month) || 0, + } + + movieCount.value = statistic.movie_count + tvCount.value = statistic.tv_count + episodeCount.value = statistic.episode_count + userCount.value = statistic.user_count + movieCountMonth.value = statistic.movie_count_month + tvCountMonth.value = statistic.tv_count_month + episodeCountMonth.value = statistic.episode_count_month + writeSnapshot(statistic) } catch (e) { console.log(e) } diff --git a/src/views/dashboard/MediaRecommend.vue b/src/views/dashboard/MediaRecommend.vue index d1d535c5..d1bfb594 100644 --- a/src/views/dashboard/MediaRecommend.vue +++ b/src/views/dashboard/MediaRecommend.vue @@ -1,6 +1,7 @@