fix: Element Plus暗色CSS变量覆盖 + 设置页对经理开放(仅主题)

- App.vue: 新增 html.dark --el-* 变量全覆盖(30+变量),修复所有select/input/dropdown/table/pagination等组件暗色背景
- DesktopLayout: 设置页对所有角色开放,用户管理仍限支局长
- Settings: 经理只显示主题面板,其他6个管理模块仅支局长可见

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-13 08:42:29 +08:00
parent af3d3bfc89
commit ccb436664b
4 changed files with 505 additions and 4 deletions
+43
View File
@@ -343,6 +343,49 @@ const isMobile = computed(() => {
--font-mono: 'JetBrains Mono', 'SF Mono', monospace;
}
/* ═══════════════════════════════════════════════════════════
Dark Mode — Element Plus CSS Variable Overrides
Override --el-* variables so ALL components render dark
═══════════════════════════════════════════════════════════ */
html.dark {
--el-color-white: var(--surface);
--el-color-black: var(--c-text);
--el-color-primary: var(--c-gold);
--el-color-primary-light-3: var(--gold-light);
--el-color-primary-light-5: var(--gold-light);
--el-color-primary-light-7: var(--c-primary-bg);
--el-color-primary-light-8: var(--c-primary-bg);
--el-color-primary-light-9: var(--paper-dark);
--el-color-primary-dark-2: var(--gold-dark);
--el-color-success: var(--c-success);
--el-color-warning: var(--c-warning);
--el-color-danger: var(--c-danger);
--el-color-info: var(--c-info);
--el-bg-color: var(--paper);
--el-bg-color-page: var(--paper);
--el-bg-color-overlay: var(--surface);
--el-text-color-primary: var(--c-text);
--el-text-color-regular: var(--c-text);
--el-text-color-secondary: var(--c-text-secondary);
--el-text-color-placeholder: var(--c-text-muted);
--el-text-color-disabled: var(--c-text-muted);
--el-border-color: var(--warm-border);
--el-border-color-light: var(--warm-border);
--el-border-color-lighter: var(--warm-border);
--el-border-color-extra-light: var(--warm-border);
--el-border-color-dark: var(--c-text-muted);
--el-fill-color: var(--c-primary-bg);
--el-fill-color-light: var(--c-primary-bg);
--el-fill-color-lighter: var(--paper-dark);
--el-fill-color-blank: var(--surface);
--el-disabled-bg-color: var(--paper-dark);
--el-disabled-text-color: var(--c-text-muted);
--el-disabled-border-color: var(--warm-border);
--el-mask-color: rgba(0,0,0,0.6);
--el-mask-color-extra-light: rgba(0,0,0,0.3);
}
/* ── Reset & Base ── */
*, *::before, *::after { box-sizing: border-box; }
+2 -2
View File
@@ -44,12 +44,12 @@ const menuGroups = computed<MenuGroup[]>(() => {
label: '管理',
items: [
{ path: '/customers', label: '客户管理', icon: '<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle>' },
{ path: '/settings', label: '系统设置', icon: '<circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>' },
],
})
if (auth.isDirector) {
groups[groups.length - 1].items.push(
groups[groups.length - 1].items.splice(1, 0,
{ path: '/users', label: '用户管理', icon: '<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M23 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path>' },
{ path: '/settings', label: '系统设置', icon: '<circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>' },
)
}
return groups
+6 -2
View File
@@ -3,8 +3,10 @@ import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import api from '@/api/index'
import { useThemeStore, themeLabels, type Theme, lightThemes, darkThemes } from '@/stores/theme'
import { useAuthStore } from '@/stores/auth'
const themeStore = useThemeStore()
const auth = useAuthStore()
const managers = ref<any[]>([])
const selectedUserIds = ref<string[]>([])
@@ -186,8 +188,9 @@ async function handleImportPreview() {
</div>
</el-card>
<!-- Manual Remind -->
<el-card class="setting-card">
<template v-if="auth.isDirector">
<!-- Manual Remind -->
<el-card class="setting-card">
<template #header>
<div class="card-header-title">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right:6px; color: var(--gold)">
@@ -385,6 +388,7 @@ async function handleImportPreview() {
</el-alert>
</div>
</el-card>
</template>
</div>
</template>