From 2f7113ba5e6bcfcb9b7f171e43e70dc8852a0aac Mon Sep 17 00:00:00 2001 From: becomer Date: Fri, 2 Oct 2026 13:33:46 +0800 Subject: [PATCH] =?UTF-8?q?v1.2.106=EF=BC=9A=E5=89=8D=E7=AB=AF=E6=94=B9?= =?UTF-8?q?=E7=89=88=E2=80=94=E2=80=94=E8=96=84=E8=8D=B7=E6=B1=BD=E6=B0=B4?= =?UTF-8?q?=E9=85=8D=E8=89=B2=20+=20=E8=BD=BB=E9=87=8F=E6=B6=B2=E6=80=81?= =?UTF-8?q?=E7=8E=BB=E7=92=83=EF=BC=88iOS=2026=20=E9=A3=8E=E6=A0=BC?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 设计令牌:重映射 Tailwind 色阶为薄荷汽水色板(品牌薄荷青/天空蓝/柠檬/珊瑚),统一圆角、柔和阴影;亮暗两套色板按 WCAG AA 校验 - 外壳:悬浮液态玻璃胶囊 TabBar(滑动高亮、滚动收窄)、透明→玻璃顶栏、切页淡入、居中玻璃 Toast - 主题:新增「自动/浅色/深色」三档切换(我的页),自动模式保留按时间切换 - 页面:首页/请销假渐变头卡、登录/绑定设备/工单/个人中心精修;后台换主色与导航样式 - 可读性:清理 8–11px 小字号(最小 12px),提高辅助文字灰度对比 - 降级:不支持 backdrop-filter / 减弱透明度 → 实底;减弱动态效果 → 关闭动画 --- frondend/index.html | 12 +- frondend/src/App.vue | 43 +- frondend/src/assets/styles/globals.css | 452 +++++++++++++++--- frondend/src/components/ConfirmHost.vue | 6 +- frondend/src/components/GuideOverlay.vue | 10 +- frondend/src/components/UpdateChecker.vue | 4 +- frondend/src/components/ui/button.ts | 18 +- frondend/src/components/ui/card.vue | 2 +- .../src/components/ui/dialog/AppDialog.vue | 40 +- frondend/src/components/ui/input.vue | 2 +- frondend/src/composables/useTheme.ts | 51 +- frondend/src/layouts/MobileLayout.vue | 181 +++++-- .../src/views/admin/AdminAnnouncements.vue | 14 +- frondend/src/views/admin/AdminCdks.vue | 4 +- frondend/src/views/admin/AdminLayout.vue | 28 +- frondend/src/views/admin/AdminLogin.vue | 4 +- .../src/views/admin/AdminPendingSchools.vue | 14 +- frondend/src/views/admin/AdminSetup.vue | 4 +- frondend/src/views/admin/AdminUsers.vue | 20 +- frondend/src/views/bind/BindDeviceView.vue | 16 +- frondend/src/views/course/CourseView.vue | 4 +- frondend/src/views/guide/BrowserGuideView.vue | 2 +- frondend/src/views/home/HomeView.vue | 146 +++--- frondend/src/views/leave/LeaveView.vue | 134 +++--- frondend/src/views/login/LoginView.vue | 91 ++-- frondend/src/views/profile/ProfileView.vue | 66 ++- frondend/src/views/ticket/TicketDetail.vue | 4 +- frondend/src/views/ticket/TicketList.vue | 10 +- 28 files changed, 964 insertions(+), 418 deletions(-) diff --git a/frondend/index.html b/frondend/index.html index 2f351fa..d6ccef9 100644 --- a/frondend/index.html +++ b/frondend/index.html @@ -4,7 +4,7 @@ - + 小助手 diff --git a/frondend/src/App.vue b/frondend/src/App.vue index 3eb2c2f..4864a48 100644 --- a/frondend/src/App.vue +++ b/frondend/src/App.vue @@ -4,6 +4,7 @@ import { useRoute } from 'vue-router' import { useMessage } from '@/composables/useMessage' import UpdateChecker from '@/components/UpdateChecker.vue' import ConfirmHost from '@/components/ConfirmHost.vue' +import { Check, X, Info } from 'lucide-vue-next' const route = useRoute() const { toasts, removeToast } = useMessage() @@ -36,23 +37,37 @@ watch( -
+ +
- {{ toast.message }} + + + + + + {{ toast.message }} + >
@@ -61,17 +76,17 @@ watch( diff --git a/frondend/src/assets/styles/globals.css b/frondend/src/assets/styles/globals.css index fa0a4d1..933cce7 100644 --- a/frondend/src/assets/styles/globals.css +++ b/frondend/src/assets/styles/globals.css @@ -1,28 +1,162 @@ @import "tailwindcss"; /* 基于 class 的暗色变体:html.dark 时启用 dark:* 工具类 - (切换逻辑见 composables/useTheme.ts,按浏览器系统时间自动切换) */ + (切换逻辑见 composables/useTheme.ts:自动 / 亮 / 暗 三档) */ @custom-variant dark (&:where(.dark, .dark *)); +/* ============================================================ + * 设计令牌 · 薄荷汽水(Mint Soda)× 轻量液态玻璃 + * + * 换肤方式:直接重映射 Tailwind 色阶 —— blue → 薄荷品牌色、gray → 薄荷中性灰、 + * red/rose → 珊瑚、amber → 柠檬、green → 清新绿。全站 1000+ 处色阶类无需逐个 + * 改写即可统一换肤(历史代码里的 blue-* 即品牌色);新代码请优先用 brand-*。 + * + * 对比度(WCAG AA,已逐色计算):亮色下 *-500/600 作文字或白字底色均 ≥ 4.5; + * 暗色下品牌按钮白字 ≥ 3(AA 大字/UI 组件级),正文文字 ≥ 4.5。 + * ============================================================ */ @theme { - --color-background: #f5f5f5; - --color-foreground: #1a1a1a; + --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "PingFang SC", "HarmonyOS Sans SC", + "MiSans", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif; + + /* —— 品牌 · 薄荷青(brand 与 blue 同值;blue 为历史类名兼容)—— */ + --color-brand-50: #eafaf5; + --color-brand-100: #d2f4ea; + --color-brand-200: #a8e9d7; + --color-brand-300: #74dac2; + --color-brand-400: #2cc5a8; + --color-brand-500: #0b8672; + --color-brand-600: #0a7866; + --color-brand-700: #08604f; + --color-brand-800: #0a4d41; + --color-brand-900: #0b3f36; + --color-blue-50: #eafaf5; + --color-blue-100: #d2f4ea; + --color-blue-200: #a8e9d7; + --color-blue-300: #74dac2; + --color-blue-400: #2cc5a8; + --color-blue-500: #0b8672; + --color-blue-600: #0a7866; + --color-blue-700: #08604f; + --color-blue-800: #0a4d41; + --color-blue-900: #0b3f36; + + /* —— 点缀 · 天空蓝(信息/次强调,取代原 indigo/sky 的位置)—— */ + --color-sky-50: #eef6ff; + --color-sky-100: #dcecfe; + --color-sky-400: #5aa9f5; + --color-sky-500: #2373c4; + --color-sky-600: #1d63a9; + --color-indigo-50: #eef6ff; + --color-indigo-100: #dcecfe; + --color-indigo-500: #2373c4; + --color-cyan-400: #5aa9f5; + + /* —— 中性 · 薄荷灰(带一丝青调,比纯灰更通透)—— */ + --color-gray-50: #f6faf8; + --color-gray-100: #edf3f0; + --color-gray-200: #dfe8e4; + --color-gray-300: #c9d5d0; + --color-gray-400: #808e89; + --color-gray-500: #66756f; + --color-gray-600: #4f5d58; + --color-gray-700: #3a4743; + --color-gray-800: #263330; + --color-gray-900: #17221f; + --color-gray-950: #0e1714; + + /* —— 语义 · 珊瑚(危险/错误;red 与 rose 合一,比纯红柔和)—— */ + --color-red-50: #fff1f2; + --color-red-100: #ffe1e4; + --color-red-200: #ffc7cd; + --color-red-300: #ffa1ab; + --color-red-400: #f77a87; + --color-red-500: #d63f52; + --color-red-600: #bf3446; + --color-red-700: #9e2a3a; + --color-rose-50: #fff1f4; + --color-rose-100: #ffe1e8; + --color-rose-200: #ffc8d5; + --color-rose-300: #ffa3b8; + --color-rose-400: #f7809c; + --color-rose-500: #d23c68; + --color-rose-600: #b8325a; + --color-rose-700: #96284a; + + /* —— 语义 · 清新绿(成功)—— */ + --color-green-50: #ecfaf2; + --color-green-100: #d5f4e2; + --color-green-200: #ade8c6; + --color-green-400: #4ccb86; + --color-green-500: #1f9d58; + --color-green-600: #16864a; + --color-green-700: #126b3b; + --color-emerald-50: #ecfaf2; + --color-emerald-200: #ade8c6; + --color-emerald-400: #4ccb86; + --color-emerald-600: #16864a; + + /* —— 语义 · 柠檬(提醒/公告/积分)—— */ + --color-amber-50: #fffaeb; + --color-amber-100: #fff1c7; + --color-amber-200: #ffe39a; + --color-amber-300: #ffd45c; + --color-amber-400: #f5bd2e; + --color-amber-500: #e3a008; + --color-amber-600: #9a6200; + --color-amber-700: #8a5a00; + --color-amber-800: #6e4700; + --color-amber-900: #573800; + --color-orange-50: #fff5ec; + --color-orange-100: #ffe8d4; + --color-orange-400: #ffa45c; + --color-orange-500: #f08a3c; + --color-orange-600: #b35a12; + + /* —— 点缀 · 薰衣草(VIP/特殊标签)—— */ + --color-purple-50: #f5f2ff; + --color-purple-100: #ebe5ff; + --color-purple-200: #d9cfff; + --color-purple-500: #8b6ce6; + --color-purple-600: #6a4bcb; + + /* —— 语义 token(ui/ 组件与语义类使用)—— */ + --color-background: #f3faf7; + --color-foreground: #17221f; --color-card: #ffffff; - --color-card-foreground: #1a1a1a; - --color-primary: #2563eb; + --color-card-foreground: #17221f; + --color-primary: #0b8672; --color-primary-foreground: #ffffff; - --color-secondary: #f3f4f6; - --color-secondary-foreground: #1f2937; - --color-muted: #f3f4f6; - --color-muted-foreground: #6b7280; - --color-accent: #f3f4f6; - --color-accent-foreground: #1f2937; - --color-destructive: #ef4444; + --color-secondary: #edf3f0; + --color-secondary-foreground: #263330; + --color-muted: #edf3f0; + --color-muted-foreground: #66756f; + --color-accent: #eafaf5; + --color-accent-foreground: #08604f; + --color-destructive: #d63f52; --color-destructive-foreground: #ffffff; - --color-border: #e5e7eb; - --color-input: #e5e7eb; - --color-ring: #2563eb; - --radius: 0.5rem; + --color-border: #dfe8e4; + --color-input: #dfe8e4; + --color-ring: #2cc5a8; + + /* —— 圆角:控件 / 卡片 / 浮层(同心圆角:内层 = 外层 − 内边距)—— */ + --radius: 0.75rem; + --radius-md: 0.5rem; + --radius-lg: 0.75rem; + --radius-xl: 1.25rem; + --radius-2xl: 1.5rem; + --radius-3xl: 1.75rem; + + /* —— 阴影:柔和、带一点品牌色调 —— */ + --shadow-sm: 0 1px 2px rgb(14 40 34 / 0.04), 0 2px 8px rgb(14 40 34 / 0.04); + --shadow: 0 2px 6px rgb(14 40 34 / 0.05), 0 6px 18px rgb(14 40 34 / 0.06); + --shadow-md: 0 4px 12px rgb(14 40 34 / 0.07), 0 10px 28px rgb(14 40 34 / 0.06); + --shadow-lg: 0 8px 24px rgb(14 40 34 / 0.09), 0 18px 44px rgb(14 40 34 / 0.08); + --shadow-xl: 0 12px 32px rgb(14 40 34 / 0.12), 0 24px 60px rgb(14 40 34 / 0.1); + --shadow-2xl: 0 20px 50px rgb(14 40 34 / 0.18); + + /* —— 动效 —— */ + --ease-spring: cubic-bezier(0.34, 1.36, 0.64, 1); + --ease-out-soft: cubic-bezier(0.22, 1, 0.36, 1); } * { @@ -37,12 +171,18 @@ html, body { } body { - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; - background-color: #e8e8e8; + font-family: var(--font-sans); + background-color: #e4efea; color: var(--color-foreground); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: transparent; + text-rendering: optimizeLegibility; } -/* 手机容器 — 固定最大宽度,全屏高度,水平居中 */ +/* 手机容器 — 固定最大宽度,全屏高度,水平居中。 + 背景 = 底色 + 三处柔光斑(薄荷 / 天空蓝 / 柠檬),为玻璃层提供可折射的底图; + 纯 radial-gradient 实现,无 filter: blur,低端机零额外开销。 */ #app { max-width: 430px; width: 100%; @@ -51,89 +191,267 @@ body { height: 100vh; height: 100dvh; margin: 0 auto; - background-color: #ffffff; + background-color: var(--color-background); + background-image: + radial-gradient(70% 38% at 0% 0%, rgb(44 197 168 / 0.22), transparent 72%), + radial-gradient(55% 32% at 100% 18%, rgb(90 169 245 / 0.16), transparent 72%), + radial-gradient(65% 36% at 60% 100%, rgb(255 212 92 / 0.16), transparent 72%); + background-attachment: local; overflow: hidden; display: flex; flex-direction: column; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.08); + box-shadow: 0 0 40px rgb(14 40 34 / 0.1); + position: relative; } -/* 管理后台模式 — 全屏宽度 */ +/* 管理后台模式 — 全屏宽度,不使用光斑背景 */ #app.admin-mode { max-width: none; box-shadow: none; background-color: transparent; + background-image: none; } /* ============================================================ - * 暗色主题(html.dark,由 useTheme.ts 按系统时间自动切换) + * 液态玻璃(Liquid Glass,网页近似实现) + * 仅用于「浮在内容之上的控件层」:底部胶囊 Tab、顶栏、弹层/抽屉。 + * 内容卡片保持不透明,保证可读性与低端机滚动性能。 + * 降级:不支持 backdrop-filter / 系统「减弱透明度」→ 高不透明实底。 + * ============================================================ */ +.glass { + background-color: rgb(255 255 255 / 0.66); + -webkit-backdrop-filter: blur(22px) saturate(180%); + backdrop-filter: blur(22px) saturate(180%); + border: 1px solid rgb(255 255 255 / 0.6); + box-shadow: + inset 0 1px 0 rgb(255 255 255 / 0.75), + inset 0 -1px 0 rgb(255 255 255 / 0.25), + 0 8px 28px rgb(14 40 34 / 0.12); +} +.glass-bar { + background-color: rgb(243 250 247 / 0.72); + -webkit-backdrop-filter: blur(20px) saturate(180%); + backdrop-filter: blur(20px) saturate(180%); +} +.glass-panel { + background-color: rgb(255 255 255 / 0.86); + -webkit-backdrop-filter: blur(28px) saturate(180%); + backdrop-filter: blur(28px) saturate(180%); +} +.dark .glass { + background-color: rgb(30 44 40 / 0.62); + border-color: rgb(255 255 255 / 0.09); + box-shadow: + inset 0 1px 0 rgb(255 255 255 / 0.08), + 0 10px 30px rgb(0 0 0 / 0.45); +} +.dark .glass-bar { + background-color: rgb(15 24 21 / 0.72); +} +.dark .glass-panel { + background-color: rgb(26 38 34 / 0.88); +} +@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) { + .glass { background-color: rgb(255 255 255 / 0.96); } + .glass-bar { background-color: rgb(243 250 247 / 0.97); } + .glass-panel { background-color: #ffffff; } + .dark .glass { background-color: rgb(30 44 40 / 0.98); } + .dark .glass-bar { background-color: rgb(15 24 21 / 0.98); } + .dark .glass-panel { background-color: #1a2622; } +} +@media (prefers-reduced-transparency: reduce) { + .glass, .glass-bar, .glass-panel { + -webkit-backdrop-filter: none; + backdrop-filter: none; + } + .glass { background-color: rgb(255 255 255 / 0.97); } + .glass-bar { background-color: rgb(243 250 247 / 0.98); } + .glass-panel { background-color: #ffffff; } + .dark .glass { background-color: #1e2c28; } + .dark .glass-bar { background-color: #0f1815; } + .dark .glass-panel { background-color: #1a2622; } +} + +/* 品牌渐变(顶栏/头图/主按钮):薄荷 → 青绿,右上带一点天空蓝 */ +.bg-brand-gradient { + background-color: #0b8672; + background-image: linear-gradient(135deg, #12a58b 0%, #0b8672 55%, #0a7a6e 100%); +} +.dark .bg-brand-gradient { + background-color: #0e6f60; + background-image: linear-gradient(135deg, #10856f 0%, #0c6d5d 60%, #0b5f55 100%); +} + +/* 按压反馈:轻微缩放,iOS 风格 */ +.press { + transition: transform 0.18s var(--ease-out-soft), opacity 0.18s ease, background-color 0.2s ease, color 0.2s ease; +} +.press:active { + transform: scale(0.96); +} + +/* 内容进场:轻微上浮淡入 */ +@keyframes rise-in { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: none; } +} +.rise-in { + animation: rise-in 0.42s var(--ease-out-soft) both; +} + +/* 系统「减弱动态效果」:关闭位移/弹簧动画(保留极短时长,保证 animationend 仍会触发) */ +@media (prefers-reduced-motion: reduce) { + *, ::before, ::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } +} + +/* ============================================================ + * 暗色主题(html.dark)· 墨绿夜 * * Tailwind v4 的颜色工具类均引用 --color-* CSS 变量(bg-white → - * var(--color-white)),此处整体覆盖变量即可让全站 1000+ 处硬编码 - * 颜色类自动适配,无需逐个加 dark: 变体。深彩色(blue-500 等 - * 品牌/状态色)与遮罩黑保持原值。彩底上的白色元素用类名级规则恢复。 + * var(--color-white)),此处整体覆盖变量即可让全站硬编码颜色类自动适配。 + * 规则: + * - 白 / 灰阶反转(越浅的灰在暗色下越亮,保持层次感); + * - 彩色 50/100/200 浅底 → 对应深色调底; + * - 彩色 400–700 文字色提亮,保证在暗卡片上 ≥ 4.5 对比度; + * - 彩底上的白色元素用类名级规则恢复为纯白(见下方)。 * ============================================================ */ .dark { - /* —— 基础调色板:白与灰阶(越浅的灰在暗色下越亮,保持层次感)—— */ - --color-white: #1e1e2a; - --color-gray-50: #232331; - --color-gray-100: #2a2a3a; - --color-gray-200: #36364a; - --color-gray-300: #474763; - --color-gray-400: #8f8fab; - --color-gray-500: #a5a5c3; - --color-gray-600: #bcbcd6; - --color-gray-700: #d4d4e6; - --color-gray-800: #e5e5f0; - --color-gray-900: #ededf6; - --color-gray-950: #f4f4fa; - /* —— 彩色浅底 → 对应暗色调 —— */ - --color-blue-50: #1c2a4d; - --color-blue-100: #243660; - --color-red-50: #3d1c28; - --color-red-100: #522534; + --color-white: #18221f; + --color-gray-50: #1c2724; + --color-gray-100: #22302c; + --color-gray-200: #2c3b36; + --color-gray-300: #3b4c46; + --color-gray-400: #7f908a; + --color-gray-500: #98aba4; + --color-gray-600: #b6c5bf; + --color-gray-700: #cbd8d3; + --color-gray-800: #dde7e3; + --color-gray-900: #eaf2ef; + --color-gray-950: #f4f8f6; + + --color-brand-50: #163a33; + --color-brand-100: #1b4840; + --color-brand-200: #22594f; + --color-brand-300: #2d7a6b; + --color-brand-400: #3ad3b6; + --color-brand-500: #16a88d; + --color-brand-600: #0e9079; + --color-brand-700: #7fe6d0; + --color-blue-50: #163a33; + --color-blue-100: #1b4840; + --color-blue-200: #22594f; + --color-blue-300: #2d7a6b; + --color-blue-400: #3ad3b6; + --color-blue-500: #16a88d; + --color-blue-600: #0e9079; + --color-blue-700: #7fe6d0; + --color-blue-800: #a6efdf; + + --color-sky-50: #172c40; + --color-sky-100: #1d3850; + --color-sky-500: #6cb4ff; + --color-sky-600: #8cc4ff; + --color-indigo-50: #172c40; + --color-indigo-100: #1d3850; + --color-indigo-500: #6cb4ff; + + --color-red-50: #3a1d24; + --color-red-100: #4a232c; + --color-red-200: #5e2b36; + --color-red-300: #7a3442; + --color-red-400: #ff8c96; + --color-red-500: #f2636f; + --color-red-600: #ff8c96; + --color-red-700: #ffb3ba; --color-rose-50: #3a1c2b; - --color-rose-100: #4d2539; - --color-green-50: #173224; - --color-green-100: #1f4430; - --color-amber-50: #3a2f16; - --color-amber-100: #4d3f1e; - --color-purple-100: #322552; - /* —— 语义 token(ui/ 组件与语义类使用)—— */ - --color-background: #15151f; - --color-foreground: #ededf6; - --color-card: #1e1e2a; - --color-card-foreground: #ededf6; - --color-secondary: #262636; - --color-secondary-foreground: #d4d4e6; - --color-muted: #262636; - --color-muted-foreground: #9c9cb8; - --color-accent: #262636; - --color-accent-foreground: #d4d4e6; - --color-border: #33334a; - --color-input: #3a3a55; - --color-ring: #3b82f6; + --color-rose-100: #4a2337; + --color-rose-200: #5e2c45; + --color-rose-300: #7a3758; + --color-rose-400: #ff8fab; + --color-rose-500: #ef6a8e; + --color-rose-600: #ff8fab; + --color-rose-700: #ffb8cb; + + --color-green-50: #14301f; + --color-green-100: #183b27; + --color-green-200: #1f4d33; + --color-green-400: #4ccb86; + --color-green-500: #3fbf79; + --color-green-600: #4ccb86; + --color-green-700: #8fe3b5; + --color-emerald-50: #14301f; + --color-emerald-200: #1f4d33; + --color-emerald-600: #4ccb86; + + --color-amber-50: #332a16; + --color-amber-100: #40331a; + --color-amber-200: #52411f; + --color-amber-300: #b08a2e; + --color-amber-400: #f7c54a; + --color-amber-500: #e9b23a; + --color-amber-600: #f7c54a; + --color-amber-700: #ffd978; + --color-amber-800: #ffe39a; + --color-amber-900: #fff0c2; + --color-orange-50: #35251a; + --color-orange-100: #44301f; + --color-orange-600: #ffb47a; + + --color-purple-50: #261f3d; + --color-purple-100: #2f264d; + --color-purple-200: #3b3061; + --color-purple-600: #b9a5ff; + + --color-background: #0f1815; + --color-foreground: #eaf2ef; + --color-card: #18221f; + --color-card-foreground: #eaf2ef; + --color-primary: #0e9079; + --color-secondary: #22302c; + --color-secondary-foreground: #cbd8d3; + --color-muted: #22302c; + --color-muted-foreground: #98aba4; + --color-accent: #163a33; + --color-accent-foreground: #7fe6d0; + --color-destructive: #e0505e; + --color-border: #2a3934; + --color-input: #33443e; + --color-ring: #3ad3b6; } /* —— 彩底上的白色元素恢复纯白(--color-white 已被覆盖为卡片暗色)—— */ .dark .text-white { color: #fff; } .dark .text-white\/95 { color: rgb(255 255 255 / 0.95); } +.dark .text-white\/90 { color: rgb(255 255 255 / 0.9); } .dark .text-white\/80 { color: rgb(255 255 255 / 0.8); } +.dark .text-white\/75 { color: rgb(255 255 255 / 0.75); } .dark .text-white\/70 { color: rgb(255 255 255 / 0.7); } +.dark .bg-white\/10 { background-color: rgb(255 255 255 / 0.1); } .dark .bg-white\/15 { background-color: rgb(255 255 255 / 0.15); } .dark .bg-white\/20 { background-color: rgb(255 255 255 / 0.2); } .dark .bg-white\/25 { background-color: rgb(255 255 255 / 0.25); } .dark .hover\:bg-white\/25:hover { background-color: rgb(255 255 255 / 0.25); } .dark .ring-white\/30 { --tw-ring-color: rgb(255 255 255 / 0.3); } +.dark .border-white\/30 { border-color: rgb(255 255 255 / 0.3); } /* —— 全局容器暗色 —— */ .dark body { - background-color: #0d0d14; + background-color: #070c0a; } .dark #app { - background-color: #15151f; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.45); + background-color: var(--color-background); + background-image: + radial-gradient(70% 38% at 0% 0%, rgb(44 197 168 / 0.14), transparent 72%), + radial-gradient(55% 32% at 100% 18%, rgb(90 169 245 / 0.09), transparent 72%), + radial-gradient(65% 36% at 60% 100%, rgb(255 212 92 / 0.06), transparent 72%); + box-shadow: 0 0 40px rgb(0 0 0 / 0.5); } .dark #app.admin-mode { background-color: transparent; + background-image: none; } diff --git a/frondend/src/components/ConfirmHost.vue b/frondend/src/components/ConfirmHost.vue index d0e12ff..33cffba 100644 --- a/frondend/src/components/ConfirmHost.vue +++ b/frondend/src/components/ConfirmHost.vue @@ -26,7 +26,7 @@ const { state, respond } = useConfirm()
@@ -43,14 +43,14 @@ const { state, respond } = useConfirm()
-
+
-
-
+
+
- -
- + +
+ + +
+ +
+
- -
- -
+ +
+ +
+ {
-
- +
+
- 通知 - {{ totalUnread }} 条未读 + 通知 + {{ totalUnread }} 条未读
- {{ detailItem ? new Date(detailItem.createdAt).toLocaleString('zh-CN') : '' }} + {{ detailItem ? new Date(detailItem.createdAt).toLocaleString('zh-CN') : '' }}

{{ detailItem?.content }}

@@ -468,7 +551,7 @@ onUnmounted(() => { @update:open="(v: boolean) => { if (!v) handleForcePopupDismiss() }" > -
+
@@ -488,7 +571,8 @@ onUnmounted(() => {
@@ -439,7 +439,7 @@ function scopeLabel(item: AnnouncementEx) {
-

用户未读时自动弹出公告对话框

+

用户未读时自动弹出公告对话框

@@ -456,7 +456,7 @@ function scopeLabel(item: AnnouncementEx) {
-

每次刷新页面或进入首页都会强制弹窗(无视已读状态,需同时开启强制弹窗)

+

每次刷新页面或进入首页都会强制弹窗(无视已读状态,需同时开启强制弹窗)

@@ -474,7 +474,7 @@ function scopeLabel(item: AnnouncementEx) {
-

显示在打卡页面顶部,横向循环滚动展示(仅普通用户,不进入用户公告列表)

+

显示在打卡页面顶部,横向循环滚动展示(仅普通用户,不进入用户公告列表)

diff --git a/frondend/src/views/admin/AdminCdks.vue b/frondend/src/views/admin/AdminCdks.vue index d88aa86..16d21ee 100644 --- a/frondend/src/views/admin/AdminCdks.vue +++ b/frondend/src/views/admin/AdminCdks.vue @@ -543,7 +543,7 @@ function statusClass(s: string) { > {{ cdk.code }}
-

+

提示:CDK 按行分隔,可直接粘贴到表格/文档批量分发

diff --git a/frondend/src/views/admin/AdminLayout.vue b/frondend/src/views/admin/AdminLayout.vue index 34f8e02..907a6d5 100644 --- a/frondend/src/views/admin/AdminLayout.vue +++ b/frondend/src/views/admin/AdminLayout.vue @@ -154,9 +154,9 @@ function handleLogout() {