From 415bed609311a054bf1ea751e7ed63dcc6c787d3 Mon Sep 17 00:00:00 2001 From: engigu Date: Tue, 30 Sep 2025 22:24:29 +0800 Subject: [PATCH] feat: add dark/light theme --- web/src/components/Index.vue | 92 ++++++++++++++++--- .../pages/cronMessages/CronMessages.vue | 6 +- .../components/pages/dashboard/Dashboard.vue | 25 +++-- .../pages/hostedMessage/HostedMessage.vue | 4 +- .../components/pages/sendLogs/SendLogs.vue | 4 +- .../components/pages/sendTasks/SendTasks.vue | 6 +- .../components/pages/sendWays/SendWays.vue | 6 +- .../pages/settings/SettingsSidebar.vue | 6 +- .../pages/settings/SiteSettings.vue | 6 +- web/src/index.css | 61 +++++++++--- web/src/main.ts | 15 +++ 11 files changed, 175 insertions(+), 56 deletions(-) diff --git a/web/src/components/Index.vue b/web/src/components/Index.vue index a9c9d4c..d7ff290 100644 --- a/web/src/components/Index.vue +++ b/web/src/components/Index.vue @@ -25,6 +25,34 @@ const isUserMenuOpen = ref(false) const userAccount = ref('管理员') const siteConfig = ref({}) +// 主题:明暗模式 +const getInitialTheme = (): 'light' | 'dark' => { + try { + const stored = localStorage.getItem('theme') as 'light' | 'dark' | null + if (stored === 'light' || stored === 'dark') return stored + const systemDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches + return systemDark ? 'dark' : 'light' + } catch { + return 'light' + } +} + +const theme = ref<'light' | 'dark'>(getInitialTheme()) + +const applyTheme = (next: 'light' | 'dark') => { + theme.value = next + if (next === 'dark') { + document.documentElement.classList.add('dark') + } else { + document.documentElement.classList.remove('dark') + } + try { localStorage.setItem('theme', next) } catch {} +} + +const toggleTheme = () => { + applyTheme(theme.value === 'dark' ? 'light' : 'dark') +} + // 从JWT中解析用户名 const parseJwtUsername = (token: string): string => { try { @@ -255,14 +283,14 @@ const siteTitle = computed(() => {