# 设计系统使用指南
## 📋 概述
本项目采用了全新的设计令牌系统和主题覆盖机制,在保持 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! 🚀**