# 设计系统使用指南 ## 📋 概述 本项目采用了全新的设计令牌系统和主题覆盖机制,在保持 Vue 2.6 + Element UI 2.x + 若依框架技术栈不变的前提下,实现了现代化的 UI/UX 升级。 ### 🎨 设计理念 - **科技蓝主色调**:体现专业性和科技感 - **深色友好**:支持明暗主题无缝切换 - **去线框化**:现代化的卡片式设计语言 - **系统化**:基于设计令牌的一致性保障 ## 🏗️ 架构设计 ### 文件结构 ``` src/styles/ ├── tokens.scss # 设计令牌定义(颜色、间距、字体等) ├── overrides-element.scss # Element UI 主题覆盖 ├── utilities.scss # 基础工具类 └── index.scss # 主样式入口 src/utils/ └── theme.js # 主题管理工具 src/components/ └── XtThemeToggle.vue # 主题切换组件 ``` ## 🎯 核心特性 ### 1. 设计令牌系统 基于 CSS 变量实现的设计令牌系统,支持明暗主题切换: ```scss :root { /* 主色系 */ --color-primary: #0EA5E9; --color-primary-light: #38BDF8; --color-primary-dark: #0284C7; /* 语义化颜色 */ --color-success: #22C55E; --color-warning: #F59E0B; --color-danger: #EF4444; /* 圆角系统 */ --radius-lg: 12px; --radius-xl: 16px; /* 阴影系统 */ --shadow-card: 0 8px 24px rgba(2, 6, 23, 0.06); --shadow-card-hover: 0 12px 32px rgba(2, 6, 23, 0.12); } /* 暗色主题覆盖 */ html.dark { --color-bg-primary: #111827; --color-bg-card: #1F2937; --color-text-primary: #F9FAFB; /* ... */ } ``` ### 2. Element UI 主题覆盖 完全覆盖 Element UI 的默认样式,使其符合新的设计系统: - ✅ 按钮组件:现代化的悬停效果和状态样式 - ✅ 表单组件:统一的输入框、选择器样式 - ✅ 数据展示:表格、标签、进度条等组件 - ✅ 反馈组件:消息提示、通知、工具提示 - ✅ 导航组件:标签页、分页器样式 ### 3. 工具类系统 提供丰富的 CSS 工具类,支持快速开发: ```html

标题

副标题

内容区域

主要文本

次要文本

弱化文本

左侧内容 右侧内容
``` ## 🔧 使用方法 ### 1. 基础使用 项目已经自动集成了新的设计系统,无需额外配置。所有 Element UI 组件都会自动应用新的主题样式。 ### 2. 主题切换 使用内置的主题切换组件: ```vue ``` ### 3. 程序化主题控制 ```javascript // 在组件中使用 export default { methods: { toggleTheme() { this.$toggleTheme() // 切换明暗主题 }, setLightTheme() { this.$setTheme('light') // 设置亮色主题 }, setDarkTheme() { this.$setTheme('dark') // 设置暗色主题 }, setAutoTheme() { this.$setTheme('auto') // 跟随系统主题 }, checkCurrentTheme() { console.log('当前主题:', this.$getTheme()) console.log('是否暗色主题:', this.$isDark()) console.log('是否亮色主题:', this.$isLight()) } } } ``` ### 4. 主题变化监听 ```javascript import { ThemeMixin } from '@/utils/theme' export default { mixins: [ThemeMixin], methods: { // 主题变化时的自定义处理 onThemeChange(event) { console.log('主题已切换:', event) // event.theme - 设置的主题 ('light', 'dark', 'auto') // event.effectiveTheme - 实际生效的主题 ('light', 'dark') // event.isDark - 是否为暗色主题 // event.isLight - 是否为亮色主题 // event.isAuto - 是否为自动主题 // 在这里处理主题变化逻辑 if (event.isDark) { // 暗色主题特殊处理 } else { // 亮色主题特殊处理 } } } } ``` ## 🎨 设计令牌参考 ### 颜色系统 | 令牌名称 | 用途 | 示例值 | |---------|------|--------| | `--color-primary` | 主色调 | `#0EA5E9` | | `--color-success` | 成功状态 | `#22C55E` | | `--color-warning` | 警告状态 | `#F59E0B` | | `--color-danger` | 危险状态 | `#EF4444` | | `--color-text-primary` | 主要文本 | `#0F172A` / `#F9FAFB` | | `--color-text-secondary` | 次要文本 | `#475569` / `#E5E7EB` | | `--color-bg-card` | 卡片背景 | `#FFFFFF` / `#1F2937` | | `--color-border-primary` | 主要边框 | `rgba(2,6,23,0.08)` / `#374151` | ### 间距系统 | 令牌名称 | 值 | 用途 | |---------|---|------| | `--spacing-1` | `4px` | 最小间距 | | `--spacing-2` | `8px` | 小间距 | | `--spacing-3` | `12px` | 中小间距 | | `--spacing-4` | `16px` | 中等间距 | | `--spacing-6` | `24px` | 大间距 | | `--spacing-8` | `32px` | 超大间距 | ### 圆角系统 | 令牌名称 | 值 | 用途 | |---------|---|------| | `--radius-sm` | `4px` | 小圆角 | | `--radius-base` | `6px` | 基础圆角 | | `--radius-md` | `8px` | 中等圆角 | | `--radius-lg` | `12px` | 大圆角(默认) | | `--radius-xl` | `16px` | 超大圆角 | | `--radius-full` | `9999px` | 完全圆角 | ### 阴影系统 | 令牌名称 | 用途 | |---------|------| | `--shadow-sm` | 小阴影 | | `--shadow-base` | 基础阴影 | | `--shadow-md` | 中等阴影 | | `--shadow-lg` | 大阴影 | | `--shadow-xl` | 超大阴影 | | `--shadow-card` | 卡片阴影 | | `--shadow-card-hover` | 卡片悬停阴影 | ## 🚀 最佳实践 ### 1. 使用设计令牌 ❌ **不推荐** - 硬编码颜色值: ```scss .my-component { background: #0EA5E9; color: #ffffff; border-radius: 12px; } ``` ✅ **推荐** - 使用设计令牌: ```scss .my-component { background: var(--color-primary); color: var(--color-text-inverse); border-radius: var(--radius-lg); } ``` ### 2. 组件命名规范 所有自定义组件使用 `Xt` 前缀: ```vue ``` ### 3. 样式组织 ```vue ``` ### 4. 响应式设计 利用内置的响应式工具类: ```html

响应式标题

左侧内容
移动端显示
``` ## 🔍 调试和开发 ### 1. 查看设计令牌 在浏览器开发者工具中查看当前生效的设计令牌: ```javascript // 控制台中执行 const style = getComputedStyle(document.documentElement) console.log('主色调:', style.getPropertyValue('--color-primary')) console.log('卡片背景:', style.getPropertyValue('--color-bg-card')) console.log('大圆角:', style.getPropertyValue('--radius-lg')) ``` ### 2. 动态修改主题色 ```javascript // 临时修改主色调(用于调试) document.documentElement.style.setProperty('--color-primary', '#ff6b6b') // 恢复默认值 document.documentElement.style.removeProperty('--color-primary') ``` ### 3. 主题切换测试 ```javascript // 测试所有主题 this.$setTheme('light') setTimeout(() => this.$setTheme('dark'), 1000) setTimeout(() => this.$setTheme('auto'), 2000) ``` ## 📱 可访问性支持 设计系统内置了完善的可访问性支持: - ✅ **键盘导航**:所有交互元素支持键盘操作 - ✅ **焦点管理**:清晰的焦点指示器 - ✅ **色彩对比**:符合 WCAG 2.1 AA 标准 - ✅ **屏幕阅读器**:正确的 ARIA 标签 - ✅ **减少动画**:支持 `prefers-reduced-motion` - ✅ **高对比度**:支持 `prefers-contrast: high` ## 🎯 演示页面 访问 `/design-system-demo` 路由查看完整的设计系统演示,包括: - 颜色系统展示 - 组件样式对比 - 工具类效果演示 - 主题切换测试 ## 🐛 问题排查 ### 常见问题 1. **样式不生效** - 确认已正确引入 `@/styles/index.scss` - 检查 CSS 变量是否正确定义 - 确认组件使用了 `scoped` 样式 2. **主题切换不工作** - 确认已安装 `ThemePlugin` - 检查 `html` 元素是否有 `dark` 类 - 确认 localStorage 权限正常 3. **Element UI 样式覆盖失效** - 确认样式文件加载顺序正确 - 检查 CSS 优先级是否足够 - 使用 `!important` 强制覆盖(不推荐) ### 调试工具 ```javascript // 主题状态检查 console.log('当前主题管理器状态:', { theme: this.$theme.getTheme(), effectiveTheme: this.$theme.getEffectiveCurrentTheme(), isDark: this.$theme.isDark(), isLight: this.$theme.isLight(), isAuto: this.$theme.isAuto() }) // CSS 变量检查 const checkTokens = () => { const tokens = [ 'color-primary', 'color-bg-card', 'radius-lg', 'shadow-card' ] tokens.forEach(token => { const value = getComputedStyle(document.documentElement) .getPropertyValue(`--${token}`) console.log(`--${token}:`, value) }) } checkTokens() ``` ## 📚 扩展开发 ### 1. 添加新的设计令牌 在 `src/styles/tokens.scss` 中添加: ```scss :root { /* 新的颜色令牌 */ --color-accent: #8B5CF6; --color-accent-light: #A78BFA; --color-accent-dark: #7C3AED; /* 新的间距令牌 */ --spacing-18: 72px; --spacing-20: 80px; } html.dark { /* 暗色主题下的覆盖 */ --color-accent: #A78BFA; } ``` ### 2. 扩展工具类 在 `src/styles/utilities.scss` 中添加: ```scss /* 新的工具类 */ .accent { color: var(--color-accent) !important; } .bg-accent { background-color: var(--color-accent) !important; color: var(--color-text-inverse) !important; } .border-accent { border-color: var(--color-accent) !important; } ``` ### 3. 自定义主题色 ```javascript // 动态设置品牌色 this.$theme.setThemeColor('primary', '#your-brand-color') this.$theme.setThemeColor('primary-light', '#your-light-color') this.$theme.setThemeColor('primary-dark', '#your-dark-color') ``` --- ## 📞 技术支持 如有任何问题或建议,请联系前端架构团队或在项目中创建 Issue。 **Happy Coding! 🚀**