From e5ffc4813931f1989e550cf542644e4c736f4af5 Mon Sep 17 00:00:00 2001 From: anghunk Date: Tue, 27 Jan 2026 15:42:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E7=BB=9F=E8=AE=A1=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8=E6=B7=BB=E5=8A=A0=E9=BB=98=E8=AE=A4=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E8=8C=83=E5=9B=B4=E6=9C=AC=E5=9C=B0=E5=AD=98=E5=82=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 StatsView 和 AnalyticsVisitView 中新增本地存储功能 - 默认时间范围从 30 天改为 7 天 - 加载页面时从 localStorage 读取保存的选项 - 切换时间范围时自动保存到 localStorage --- cwd-admin/src/views/AnalyticsVisitView.vue | 28 +++++++++++++++++++++- cwd-admin/src/views/StatsView.vue | 28 +++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/cwd-admin/src/views/AnalyticsVisitView.vue b/cwd-admin/src/views/AnalyticsVisitView.vue index e5a3fe4..07e4e27 100644 --- a/cwd-admin/src/views/AnalyticsVisitView.vue +++ b/cwd-admin/src/views/AnalyticsVisitView.vue @@ -202,12 +202,13 @@ const overview = ref({ const items = ref([]); const visitTab = ref<"pv" | "latest">("pv"); const visitTabStorageKey = "cwd-analytics-visit-tab"; +const chartRangeStorageKey = "cwd-analytics-visit-chart-range"; const injectedDomainFilter = inject | null>("domainFilter", null); const domainFilter = injectedDomainFilter ?? ref(""); const last30Days = ref<{ date: string; total: number }[]>([]); const likeStatsItems = ref([]); -const chartRange = ref<"7" | "30">("30"); +const chartRange = ref<"7" | "30">("7"); const toastMessage = ref(""); const toastType = ref<"success" | "error">("success"); @@ -318,6 +319,29 @@ function saveVisitTabToStorage(value: "pv" | "latest") { } } +function loadChartRangeFromStorage() { + if (typeof window === "undefined") { + return; + } + try { + const value = window.localStorage.getItem(chartRangeStorageKey); + if (value === "7" || value === "30") { + chartRange.value = value; + } + } catch { + } +} + +function saveChartRangeToStorage(value: "7" | "30") { + if (typeof window === "undefined") { + return; + } + try { + window.localStorage.setItem(chartRangeStorageKey, value); + } catch { + } +} + async function loadData() { loading.value = true; listLoading.value = true; @@ -451,6 +475,7 @@ function changeChartRange(range: "7" | "30") { return; } chartRange.value = range; + saveChartRangeToStorage(range); renderChart(); } @@ -462,6 +487,7 @@ function handleResize() { onMounted(() => { loadVisitTabFromStorage(); + loadChartRangeFromStorage(); loadData(); window.addEventListener("resize", handleResize); }); diff --git a/cwd-admin/src/views/StatsView.vue b/cwd-admin/src/views/StatsView.vue index 46cb6e5..485d0ca 100644 --- a/cwd-admin/src/views/StatsView.vue +++ b/cwd-admin/src/views/StatsView.vue @@ -125,7 +125,8 @@ const statsSummary = ref({ }); const domainStats = ref([]); const last7Days = ref<{ date: string; total: number }[]>([]); -const chartRange = ref<"7" | "30">("30"); +const chartRange = ref<"7" | "30">("7"); +const chartRangeStorageKey = "cwd-stats-chart-range"; const injectedDomainFilter = inject | null>("domainFilter", null); const domainFilter = injectedDomainFilter ?? ref(""); @@ -137,6 +138,29 @@ const toastVisible = ref(false); const chartEl = ref(null); let chartInstance: echarts.ECharts | null = null; +function loadChartRangeFromStorage() { + if (typeof window === "undefined") { + return; + } + try { + const value = window.localStorage.getItem(chartRangeStorageKey); + if (value === "7" || value === "30") { + chartRange.value = value; + } + } catch { + } +} + +function saveChartRangeToStorage(value: "7" | "30") { + if (typeof window === "undefined") { + return; + } + try { + window.localStorage.setItem(chartRangeStorageKey, value); + } catch { + } +} + function showToast(msg: string, type: "success" | "error" = "success") { toastMessage.value = msg; toastType.value = type; @@ -235,6 +259,7 @@ function changeChartRange(range: "7" | "30") { return; } chartRange.value = range; + saveChartRangeToStorage(range); renderChart(); } @@ -245,6 +270,7 @@ function handleResize() { } onMounted(() => { + loadChartRangeFromStorage(); loadStats(); window.addEventListener("resize", handleResize); });