diff --git a/admin-web/public/brand/admin-danyang-backdrop.jpg b/admin-web/public/brand/admin-danyang-backdrop.jpg new file mode 100644 index 0000000..e0f47db Binary files /dev/null and b/admin-web/public/brand/admin-danyang-backdrop.jpg differ diff --git a/admin-web/src/theme/index.css b/admin-web/src/theme/index.css index fddf449..d1fbc51 100644 --- a/admin-web/src/theme/index.css +++ b/admin-web/src/theme/index.css @@ -1,14 +1,20 @@ :root { - --admin-sidebar-bg: #172733; - --admin-sidebar-surface: #213542; + --admin-coral: #f45f68; + --admin-coral-hover: #df505a; + --admin-coral-soft: #fff0f1; + --admin-shell-bg: rgba(255, 255, 255, 0.96); + --admin-sidebar-bg: #202d38; + --admin-sidebar-surface: #2b3a46; --admin-sidebar-text: #D9E1E6; --admin-sidebar-muted: #8FA1AC; - --admin-page-bg: #FAFAF8; - --admin-primary: #EE666B; - --admin-primary-hover: #D9545A; + --admin-page-bg: #f7f9fb; + --admin-primary: var(--admin-coral); + --admin-primary-hover: var(--admin-coral-hover); --admin-card-radius: 14px; + --admin-shell-radius: 22px; + --admin-shadow: 0 18px 48px rgba(57, 40, 45, 0.14); --admin-header-bg: #FFFFFF; - --admin-soft-pink: #FFF0F1; + --admin-soft-pink: var(--admin-coral-soft); --admin-soft-blue: #EEF5FF; --admin-soft-green: #EDF8F1; --admin-soft-purple: #F4EFFF; diff --git a/ui-tests/admin-reference-contracts.mjs b/ui-tests/admin-reference-contracts.mjs new file mode 100644 index 0000000..c0d299d --- /dev/null +++ b/ui-tests/admin-reference-contracts.mjs @@ -0,0 +1,62 @@ +import assert from 'node:assert/strict' +import { existsSync, readFileSync } from 'node:fs' +import { resolve } from 'node:path' + +const root = resolve(import.meta.dirname, '..') +const read = (path) => readFileSync(resolve(root, path), 'utf8') +const theme = read('admin-web/src/theme/index.css') +const layout = read('admin-web/src/layouts/MainLayout.vue') +const dashboard = read('admin-web/src/views/DashboardView.vue') + +for (const token of [ + '--admin-coral', + '--admin-shell-bg', + '--admin-sidebar-bg', + '--admin-card-radius', + '--admin-shell-radius', + '--admin-shadow', +]) { + assert.ok(theme.includes(token), `缺少管理端参考图令牌 ${token}`) +} + +assert.ok( + existsSync(resolve(root, 'admin-web/public/brand/admin-danyang-backdrop.jpg')), + '缺少丹阳公益主题背景资产', +) + +for (const className of ['admin-scene', 'admin-shell', 'admin-sidebar', 'admin-topbar', 'admin-content']) { + assert.ok(layout.includes(className), `缺少框架结构 ${className}`) +} +assert.match(layout, /admin-danyang-backdrop\.jpg/, '管理端外层未使用正式背景资产') +assert.match(layout, /permissions/, '侧栏未保留权限控制') + +for (const item of [ + '工作台', '用户管理', '资料审核', '匹配管理', '公益红娘', '公益咨询', '活动管理', + '内容管理', '善缘服务站', '举报风控', '数据统计', '组织人员', '系统设置', +]) { + assert.ok(layout.includes(item), `侧栏缺少 ${item}`) +} + +for (const className of [ + 'dashboard-metrics', + 'metric-card', + 'todo-panel', + 'activity-panel', + 'service-overview-panel', + 'effectiveness-panel', + 'dashboard-loading', + 'dashboard-empty', + 'dashboard-error', + 'dashboard-forbidden', +]) { + assert.ok(dashboard.includes(className), `工作台缺少状态或区块 ${className}`) +} + +for (const title of ['今日待办事项', '近期公益活动', '服务数据概览', '项目服务成效']) { + assert.ok(dashboard.includes(title), `工作台缺少 ${title}`) +} + +assert.match(dashboard, /metrics/, '工作台缺少指标数据绑定') +assert.match(dashboard, /Asia\/Shanghai/, '工作台日期未固定为中国时区') + +console.log('Admin reference contracts passed')