# Art Design Pro UI 规范 - Plus UI 重构版
## 设计理念
基于 Art Design Pro 的设计语言,追求现代化、精致、用户友好的界面体验。注重细节、动效和用户交互的流畅性。
## 1. 颜色系统
### 主色调 (Primary Colors)
```css
--art-primary: 93, 135, 255; /* 主品牌色 - 蓝色 */
--art-secondary: 73, 190, 255; /* 辅助色 - 天蓝色 */
--art-success: 19, 222, 185; /* 成功色 - 绿色 */
--art-warning: 255, 174, 31; /* 警告色 - 橙色 */
--art-error: 250, 137, 107; /* 错误色 - 红色 */
--art-info: 83, 155, 255; /* 信息色 - 蓝色 */
--art-danger: 255, 77, 79; /* 危险色 - 红色 */
```
### 背景色系统 (Background Colors)
```css
/* 浅色主题 */
--art-bg-color: #fafbfc; /* 页面底色 */
--art-main-bg-color: #ffffff; /* 主要内容背景 */
--art-bg-primary: 236, 242, 255; /* 主色背景 */
--art-bg-secondary: 232, 247, 255; /* 辅助背景 */
--art-bg-success: 230, 255, 250; /* 成功背景 */
--art-bg-warning: 254, 245, 229; /* 警告背景 */
--art-bg-error: 253, 237, 232; /* 错误背景 */
/* 暗色主题 */
html.dark {
--art-bg-color: #070707; /* 页面底色 */
--art-main-bg-color: #161618; /* 主要内容背景 */
}
```
### 灰度色系 (Gray Scale)
```css
--art-gray-100: #f9f9f9;
--art-gray-200: #f1f1f4;
--art-gray-300: #dbdfe9;
--art-gray-400: #c4cada;
--art-gray-500: #99a1b7;
--art-gray-600: #78829d;
--art-gray-700: #4b5675;
--art-gray-800: #252f4a;
--art-gray-900: #071437;
```
## 2. 字体系统
### 字体家族
```css
font-family: 'DMSans', 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
```
### 字体大小
- 超大标题:24px (1.5rem)
- 大标题:20px (1.25rem)
- 中标题:18px (1.125rem)
- 小标题:16px (1rem)
- 正文:14px (0.875rem)
- 小字:12px (0.75rem)
- 辅助文字:10px (0.625rem)
### 字体权重
- Light: 300
- Normal: 400
- Medium: 500
- Semibold: 600
- Bold: 700
## 3. 间距系统
### 间距单位 (基于 4px 网格)
```css
--space-xs: 4px;
--space-sm: 8px;
--space-md: 12px;
--space-lg: 16px;
--space-xl: 20px;
--space-2xl: 24px;
--space-3xl: 32px;
--space-4xl: 48px;
--space-5xl: 64px;
```
### 内边距规范
- 卡片内边距:20px
- 按钮内边距:8px 16px
- 输入框内边距:10px 12px
- 表格单元格:12px
- 弹窗内边距:25px 20px
### 外边距规范
- 组件间距:20px
- 段落间距:16px
- 按钮间距:8px
- 表单项间距:12px
## 4. 圆角系统
### 圆角规范
```css
--border-radius-xs: 4px;
--border-radius-sm: 6px;
--border-radius-md: 8px;
--border-radius-lg: 10px;
--border-radius-xl: 12px;
--border-radius-2xl: 16px;
--border-radius-full: 50%;
```
### 应用场景
- 按钮:6px
- 输入框:8px
- 卡片:10px
- 弹窗:10px
- 图片:6px
- 头像:50%
## 5. 阴影系统
### 阴影等级
```css
--shadow-xs: 0 0.1rem 0.75rem 0.25rem rgba(0, 0, 0, 0.05);
--shadow-sm: 0 0.1rem 1rem 0.25rem rgba(0, 0, 0, 0.05);
--shadow-md: 0 0.5rem 1.5rem 0.5rem rgba(0, 0, 0, 0.075);
--shadow-lg: 0 1rem 2rem 1rem rgba(0, 0, 0, 0.1);
--shadow-card: 0px 3px 4px 0px rgba(0, 0, 0, 0.03);
```
### 应用场景
- 卡片阴影:shadow-card
- 悬浮效果:shadow-sm
- 弹窗阴影:shadow-lg
- 按钮悬浮:shadow-xs
## 6. 边框系统
### 边框颜色
```css
--border-color: #eaebf1;
--border-dashed-color: #dbdfe9;
--border-card-color: #f1f1f4;
```
### 边框宽度
- 默认:1px
- 粗边框:2px
- 表格边框:1px
## 7. 动画系统
### 缓动曲线
```css
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in: cubic-bezier(0.4, 0, 1, 1);
```
### 动画时长
- 快速:0.15s
- 标准:0.3s
- 慢速:0.5s
### 常用动画
- 淡入淡出:opacity transition
- 悬浮效果:transform scale
- 按钮点击:transform scale(0.95)
- 页面切换:fade + slide
## 8. 组件规范
### 按钮 (Button)
#### 基础规范
- **尺寸系统**:Large(40px) / Default(32px) / Small(28px)
- **圆角规范**:6px(默认) / 8px(大) / 4px(小) / 50%(圆形)
- **字体权重**:500 (Medium)
- **过渡动画**:cubic-bezier(0.4, 0, 0.2, 1) 0.3s
- **字母间距**:0.02em
#### 按钮类型 - 全部采用轮廓式设计
- **Primary按钮**:轮廓式主色设计,主色边框和文字,5%透明度主色背景
- **Success按钮**:轮廓式成功色设计,成功色边框和文字,5%透明度成功色背景
- **Warning按钮**:轮廓式警告色设计,警告色边框和文字,5%透明度警告色背景
- **Danger按钮**:轮廓式危险色设计,危险色边框和文字,5%透明度危险色背景
- **Info按钮**:轮廓式信息色设计,信息色边框和文字,5%透明度信息色背景
- **Default按钮**:白色背景,灰色边框,灰色文字
#### 变体样式
- **Plain按钮**:与标准按钮完全相同的轮廓式设计,无差异化
- **Outline按钮**:轮廓式设计(现已作为全部按钮的标准样式)
- **Text按钮**:无背景边框,彩色文字,悬浮10%透明背景
- **Link按钮**:下划线样式,主色文字,无背景
#### 交互效果 - 轮廓式按钮专用
- **悬浮状态**:上移1px + 背景透明度变为10% + 边框透明度变为80% + 彩色阴影
- **点击状态**:98%缩放 + 0.1s快速过渡 + 背景透明度变为15%
- **禁用状态**:50%透明度,禁用所有交互和变换
- **加载状态**:70%透明度 + 遮罩层效果
**详细规范**:
- **默认状态**:5%透明度彩色背景 + 100%彩色边框
- **悬浮状态**:10%透明度彩色背景 + 80%透明度彩色边框 + `0 4px 12px rgba(color, 0.2)` 阴影
- **点击状态**:15%透明度彩色背景 + 边框保持80%透明度
#### 特殊状态
- **圆形按钮**:宽高相等,50%圆角,主要用于图标按钮
- **按钮组**:相邻按钮圆角归零,-1px右边距无缝连接
- **阴影规范**:轮廓式按钮悬浮阴影统一为 `0 4px 12px rgba(color, 0.2)`
#### 🎨 轮廓式按钮设计系统(2024年版本)
**设计理念**:全面采用轮廓式(Outline)按钮设计,提供更加优雅、现代和一致的用户界面体验。
**核心优势**:
- ✅ **视觉轻量化**:减少视觉重量,避免界面过于厚重
- ✅ **层次分明**:通过透明度变化清晰表达交互状态
- ✅ **品牌一致性**:所有彩色按钮都保持品牌色彩的纯净表达
- ✅ **可访问性优化**:高对比度的边框和文字确保良好的可读性
**技术实现**:
```scss
// 轮廓式按钮核心模式(适用于所有按钮,包括MessageBox)
.el-button--[type] {
border: 1px solid rgb(var(--art-[type])) !important;
color: rgb(var(--art-[type])) !important;
background: rgba(var(--art-[type]), 0.05) !important;
&:hover {
background: rgba(var(--art-[type]), 0.1) !important;
border-color: rgba(var(--art-[type]), 0.8) !important;
box-shadow: 0 4px 12px rgba(var(--art-[type]), 0.2) !important;
}
&:active {
background: rgba(var(--art-[type]), 0.15) !important;
}
}
// MessageBox 专用样式确保一致性
.el-message-box .el-message-box__btns .el-button {
// 继承全局轮廓式按钮样式,使用!important确保优先级
}
```
**适用范围**:
- ✅ 全局所有 primary、success、warning、danger、info 按钮
- ✅ 页面表单、表格操作按钮
- ✅ 确认弹窗(MessageBox)中的所有按钮
- ✅ 普通弹窗(Dialog)中的所有按钮
- ✅ 导航和功能按钮
**实施位置**:
- 样式文件:`src/assets/styles/art-element-ui.scss`
- 优先级:使用 `!important` 确保全局覆盖
- 兼容性:与现有 Element Plus 组件完全兼容
### 输入框 (Input)
- 边框:1px solid --border-color
- 圆角:8px
- 内边距:10px 12px
- 聚焦状态:主色边框
- 错误状态:红色边框
### 卡片 (Card)
- 背景:白色
- 圆角:10px
- 阴影:shadow-card
- 内边距:20px
- 边框:可选 1px --border-card-color
### 左侧菜单 (Sidebar Menu)
#### 基础规范
- **菜单宽度**: 250px(展开) / 54px(收起)
- **背景色**: 浅色主题白色 / 暗色主题深色
- **圆角**: 4px (菜单项内边距)
- **间距**: 外边距8px,内边距2px
- **过渡动画**: 0.3s ease 流畅过渡
#### 菜单项状态
- **默认状态**:
- 文字:`--art-text-gray-700`
- 图标:`--art-text-gray-600`
- 背景:透明
- **悬浮状态**:
- 文字:`--art-text-gray-800`
- 图标:主题色 `rgb(var(--art-primary))`
- 背景:8%主题色透明 `rgba(var(--art-primary), 0.08)`
- **选中状态**:
- 文字:主题色 `rgb(var(--art-primary))`
- 图标:主题色 `rgb(var(--art-primary))`
- 背景:10%主题色透明 `rgba(var(--art-primary), 0.1)`
#### 嵌套子菜单
- **背景透明化**: 子菜单项背景透明
- **悬浮效果**: 6%主题色透明背景
- **选中效果**: 10%主题色透明背景
- **层级缩进**: 标准Element Plus缩进
- **圆角统一**: 4px内边距圆角
#### 暗色主题适配
- **悬浮背景**: 15%主题色透明 `rgba(var(--art-primary), 0.15)`
- **选中背景**: 20%主题色透明 `rgba(var(--art-primary), 0.2)`
- **子菜单悬浮**: 12%主题色透明背景
- **颜色继承**: 与浅色主题文字图标颜色保持一致
#### 收起状态
- **容器宽度**: 54px固定宽度
- **菜单项高度**: 48px,确保统一高度
- **图标规范**: 16x16px,美观合理
- **完美居中**: 使用Flexbox确保水平垂直居中
- **一级菜单特殊处理**: 使用`.el-menu > .el-menu-item`选择器确保优先级
- **tooltip支持**: 兼容`.el-tooltip`和`.el-menu-tooltip__trigger`元素
- **统一对齐**: 所有菜单项(一级、多级)完全一致的居中效果
- **提示框**: Element Plus tooltip显示完整菜单名
- **展开动画**: 0.28s流畅过渡动画
### 表格 (Table)
- 表头背景:--gray-100
- 斑马纹:--gray-50
- 边框:1px --border-color
- 悬浮行:--gray-100 背景
### 弹窗 (Modal/Dialog)
- 背景:白色
- 圆角:10px
- 阴影:shadow-lg
- 动画:scale + fade
- 遮罩:rgba(0,0,0,0.5)
#### 确认弹窗按钮样式规范
**重要原则**:确认弹窗(MessageBox.confirm)中的按钮与全局轮廓式按钮规范保持完全一致,确保整个系统的设计统一性。
**设计理念**:确认弹窗中的按钮采用轮廓式设计,与页面中的其他按钮保持一致的视觉风格,通过统一的轮廓式设计语言提供现代化、轻量化的用户体验。
- **确定按钮(Primary)**:使用轮廓式主色设计
- 背景:5%透明度主色 `rgba(var(--art-primary), 0.05)`
- 边框:1px 主色边框 `rgb(var(--art-primary))`
- 文字颜色:主色 `rgb(var(--art-primary))`
- 悬浮效果:
- 背景:10%透明度主色 `rgba(var(--art-primary), 0.1)`
- 边框:80%透明度主色 `rgba(var(--art-primary), 0.8)`
- 阴影:`0 4px 12px rgba(var(--art-primary), 0.2)`
- 上移1px效果保持
- 点击效果:
- 背景:15%透明度主色 `rgba(var(--art-primary), 0.15)`
- 98%缩放效果保持
- **其他类型按钮**:使用对应色彩的轮廓式设计
- **Success按钮**:轮廓式成功色设计,成功色边框和文字,5%透明度背景
- **Warning按钮**:轮廓式警告色设计,警告色边框和文字,5%透明度背景
- **Danger按钮**:轮廓式危险色设计,危险色边框和文字,5%透明度背景
- **Info按钮**:轮廓式信息色设计,信息色边框和文字,5%透明度背景
- 交互效果:与Primary按钮保持一致的轮廓式悬浮和点击效果
- **取消按钮**:使用默认按钮样式(保持轻量化)
- 背景:主背景色 `var(--art-main-bg-color)`
- 边框:1px 灰色边框 `var(--art-border-color)`
- 文字颜色:`var(--art-text-gray-700)`
- 阴影:`0 1px 3px rgba(0, 0, 0, 0.1)`
- **统一规范**:
- 圆角:8px
- 高度:32px
- 内边距:0 16px
- 字体权重:500
- 过渡动画:`all 0.3s cubic-bezier(0.4, 0, 0.2, 1)`
- 字母间距:0.02em
**设计统一性说明**:
- **全局按钮统一**:所有按钮(页面按钮和确认弹窗按钮)都采用轮廓式设计
- **视觉一致性**:确保整个系统的按钮风格保持完全一致
- **现代化体验**:通过统一的轮廓式设计提供现代化、轻量化的用户体验
- **交互规范**:所有按钮都遵循相同的悬浮、点击、透明度变化规范
**实现位置**:
- 样式文件:`src/assets/styles/art-element-ui.scss`
- 选择器:`.el-message-box .el-message-box__btns .el-button`
- 优先级:使用 `!important` 确保样式优先级
- 适用场景:confirm、alert、prompt等所有MessageBox弹窗
- 设计原则:与全局轮廓式按钮规范保持完全一致
#### MessageBox 按钮布局规范
**按钮顺序规范**:确认弹窗(MessageBox)中的按钮顺序遵循国内用户习惯,确定按钮在左侧,取消按钮在右侧。
**布局实现**:
- **按钮容器**:使用 `flex-direction: row-reverse` 实现按钮顺序调整
- **确定按钮**:`order: 2` 确保排在左侧(用户优先操作位置)
- **取消按钮**:`order: 1` 排在右侧(次要操作位置)
- **按钮间距**:使用 `gap: 12px` 确保按钮之间的合理间距
**设计理念**:
- **符合习惯**:遵循国内用户的操作习惯,确定操作在左,取消操作在右
- **视觉引导**:确定按钮的主色调设计在左侧能够更好地引导用户操作
- **一致性保证**:所有确认弹窗的按钮顺序保持完全一致
**技术实现**:
```scss
// MessageBox 按钮顺序调整
.el-message-box .el-message-box__btns {
display: flex !important;
flex-direction: row-reverse !important;
justify-content: flex-start !important;
gap: 12px !important;
}
.el-message-box .el-message-box__btns .el-button.el-button--primary {
order: 2 !important; // 确定按钮排在前面(左侧)
}
.el-message-box .el-message-box__btns .el-button.el-button--default,
.el-message-box .el-message-box__btns .el-button:not([class*="el-button--"]) {
order: 1 !important; // 取消按钮排在后面(右侧)
}
```
**应用场景**:
- ✅ confirm 确认弹窗:确定在左,取消在右
- ✅ alert 提示弹窗:确定按钮居左显示
- ✅ prompt 输入弹窗:确定在左,取消在右
- ✅ 所有自定义 MessageBox 弹窗
**用户体验考虑**:
- **操作优先级**:确定操作作为主要操作放在左侧,符合从左到右的阅读习惯
- **降低误操作**:确定按钮的突出位置减少用户误点取消的情况
- **一致性体验**:整个系统的确认弹窗都遵循相同的按钮顺序
#### MessageBox 按钮统一性原则
**核心要求**:MessageBox(确认弹窗)中的所有按钮必须与页面中的其他按钮保持完全一致的轮廓式设计。
**统一性体现**:
- ✅ **视觉风格**:相同的边框、背景、文字颜色规范
- ✅ **交互效果**:相同的悬浮、点击、透明度变化效果
- ✅ **尺寸规格**:相同的高度、圆角、内边距、字体权重
- ✅ **颜色系统**:使用相同的色彩变量和透明度规范
**实施保证**:
```scss
// 确保MessageBox按钮与全局按钮完全一致
.el-message-box .el-message-box__btns .el-button {
// 所有样式属性都使用!important确保优先级
// 严格遵循全局轮廓式按钮规范
}
```
**验收标准**:
- MessageBox中的按钮与页面按钮在视觉上无任何差异
- 所有交互状态的表现完全一致
- 不同类型的按钮(primary、success、warning等)都遵循统一规范
## 9. 布局规范
### 栅格系统
- 容器最大宽度:1200px
- 栅格列数:24列
- 间距:20px
### 页面布局
- 顶栏高度:60px
- 侧边栏宽度:240px (展开) / 80px (收起)
- 内容区域:自适应
- 底部高度:60px
### 响应式断点
```scss
$device-phone: 500px; // 手机
$device-ipad: 800px; // 平板
$device-ipad-pro: 1180px; // 平板 Pro
$device-notebook: 1600px; // 笔记本
```
## 10. 主题系统
### 主题切换
- 支持浅色/暗色主题
- 使用 CSS 变量实现
- 平滑过渡动画
- 本地存储偏好
### 颜色模式
- 浅色模式:明亮、清晰
- 暗色模式:柔和、护眼
- 跟随系统:自动切换
## 11. 交互规范
### 悬浮效果 (Hover)
- 按钮:背景变浅 + 轻微放大
- 卡片:阴影加深
- 图标:颜色变化 + 动画
- 链接:颜色变化
### 点击效果 (Active)
- 按钮:轻微缩小
- 卡片:阴影减弱
- 输入框:聚焦边框
### 加载状态
- 骨架屏:灰色占位
- 进度条:主色进度
- 加载动画:旋转图标
## 12. 图标系统
### 图标规范
- 尺寸:16px, 20px, 24px
- 线条粗细:1.5px
- 风格:线性图标
- 颜色:继承文字色或主题色
### 图标用法
- 按钮图标:16px
- 菜单图标:20px
- 页面图标:24px
- 装饰图标:根据需要
## 13. 移动端适配
### 移动端规范
- 最小点击区域:44px
- 字体适当放大
- 间距适当增加
- 简化交互方式
- 优化触摸体验
### 响应式布局
- 移动端优先
- 灵活的栅格系统
- 可收起的侧边栏
- 简化的导航方式
## 14. 可访问性 (Accessibility)
### 颜色对比度
- 文字对比度:4.5:1 以上
- 大文字对比度:3:1 以上
- 状态指示:不仅依赖颜色
### 交互可访问性
- 键盘导航支持
- 屏幕阅读器支持
- 焦点指示清晰
- 错误信息明确
## 15. 实施原则
### 开发规范
1. 优先使用 CSS 变量
2. 统一使用 SCSS 预处理器
3. 组件化开发
4. 响应式设计
5. 性能优化
### 维护规范
1. 定期更新设计规范
2. 保持组件库的一致性
3. 及时修复视觉问题
4. 收集用户反馈
### 质量保证
1. 多设备测试
2. 多浏览器兼容
3. 性能监控
4. 用户体验评估
---
## 注意事项
1. **一致性优先**:确保整个系统的视觉一致性
2. **用户体验**:以用户体验为核心进行设计
3. **性能考虑**:优化动画和样式性能
4. **可维护性**:编写可维护的样式代码
5. **扩展性**:为未来的功能扩展预留空间
## 🚀 重大更新记录
### 2024年 - 全局轮廓式按钮系统
**更新时间**:2024年
**核心变更**:将整个系统的按钮设计从填充式改为轮廓式设计
**影响范围**:
- ✅ 全局所有 primary、success、warning、danger、info 按钮
- ✅ 页面表单和表格中的操作按钮
- ✅ 确认弹窗按钮(包括 confirm、alert、prompt)
- ✅ 导航和功能按钮
**设计理念**:
- 提供更加轻量化、现代化的视觉体验
- 保持品牌色彩的纯净表达
- 通过透明度变化清晰表达交互状态
- 提升界面的整体协调性和专业感
**技术特点**:
- 使用 `!important` 确保全局覆盖优先级
- 与 Element Plus 组件完全兼容
- 支持所有交互状态(hover、active、disabled、loading)
- 统一的阴影和透明度规范
**后续维护**:
- 新增按钮类型应遵循轮廓式设计原则
- 保持透明度和阴影规范的一致性
- 确保在所有主题模式下的兼容性
### 2024年 - 确认弹窗按钮统一化设计
**更新时间**:2024年
**核心变更**:将确认弹窗(MessageBox)中的按钮与全局轮廓式按钮规范保持完全一致
**影响范围**:
- ✅ confirm 确认弹窗按钮
- ✅ alert 提示弹窗按钮
- ✅ prompt 输入弹窗按钮
- ✅ 所有 MessageBox 类型的弹窗按钮
**设计理念**:
- **全局统一**:所有按钮都使用轮廓式设计,确保系统的视觉一致性
- **现代化体验**:通过统一的轮廓式设计提供现代化、轻量化的用户体验
- **交互一致性**:所有按钮的悬浮、点击效果保持完全一致
- **维护简便**:统一的设计规范降低维护成本
**技术特点**:
- 确认按钮:轮廓式主色设计 + 主色文字
- 其他类型按钮:对应色彩的轮廓式设计
- 取消按钮:保持轻量化的默认样式
- 最高优先级:使用 `!important` 确保样式覆盖
**实施位置**:
- 样式文件:`src/assets/styles/art-element-ui.scss`
- 选择器:`.el-message-box .el-message-box__btns .el-button`
### 2024年 - MessageBox 按钮位置优化
**更新时间**:2024年
**核心变更**:调整确认弹窗(MessageBox)中的按钮顺序,确定按钮在左侧,取消按钮在右侧,符合国内用户操作习惯
**影响范围**:
- ✅ confirm 确认弹窗的按钮布局
- ✅ alert 提示弹窗的按钮布局
- ✅ prompt 输入弹窗的按钮布局
- ✅ 所有自定义 MessageBox 弹窗的按钮布局
**设计理念**:
- **用户习惯优先**:遵循国内用户的操作习惯,主要操作(确定)在左侧
- **视觉引导优化**:确定按钮的主色调设计在左侧能够更好地引导用户操作
- **降低误操作**:确定按钮的突出位置减少用户误点取消的情况
- **一致性保证**:整个系统的确认弹窗按钮顺序保持完全一致
**技术实现**:
- 使用 CSS Flexbox 的 `flex-direction: row-reverse` 调整按钮顺序
- 通过 `order` 属性精确控制按钮位置
- 使用 `gap` 属性确保按钮间距的一致性
- 保持与轮廓式按钮样式的完美兼容
**用户体验提升**:
- 符合从左到右的阅读和操作习惯
- 减少用户在确认操作时的认知负担
- 提升整体操作的直观性和效率
**实施位置**:
- 文件:`src/assets/styles/art-element-ui.scss`
- 选择器:`.el-message-box .el-message-box__btns`
- 配合:`src/plugins/modal.ts` 中的按钮类名配置
## 16. 项目架构规范
### 目录结构标准
```
src/
├── api/ # API接口定义
│ ├── [module]/ # 模块化API
│ │ ├── index.ts # API方法定义
│ │ └── types.ts # 类型定义
│ ├── types.ts # 通用类型
│ └── login.ts # 登录相关API
├── assets/ # 静态资源
│ ├── styles/ # 样式文件
│ │ ├── art-variables.scss # 设计变量
│ │ ├── art-element-ui.scss # 组件样式覆盖
│ │ ├── art-dark.scss # 暗色主题
│ │ └── index.scss # 样式入口
│ └── images/ # 图片资源
├── components/ # 通用组件
│ └── [ComponentName]/ # 组件目录(PascalCase)
│ ├── index.vue # 组件主文件
│ └── types.ts # 组件类型定义(可选)
├── views/ # 页面视图
│ └── [module]/ # 模块化页面
│ └── [feature]/ # 功能页面
│ ├── index.vue # 主页面文件
│ └── components/ # 页面专用组件(可选)
├── layout/ # 布局组件
├── router/ # 路由配置
├── store/ # 状态管理
├── utils/ # 工具函数
├── plugins/ # 插件配置
├── types/ # 全局类型定义
└── main.ts # 应用入口
```
### 文件命名规范
- **文件夹**:使用 kebab-case(小写+连字符)
- **Vue组件文件**:使用 PascalCase 或 kebab-case
- **TypeScript文件**:使用 camelCase
- **样式文件**:使用 kebab-case
- **常量文件**:使用 UPPER_SNAKE_CASE
### 模块组织原则
1. **按功能模块划分**:每个业务模块独立组织
2. **API与页面对应**:api目录结构与views保持一致
3. **类型定义集中**:每个模块都有对应的types.ts
4. **组件复用优先**:通用组件放在components目录
## 17. Vue组件开发规范
### 组件结构标准
```vue
```
### TypeScript类型定义规范
```typescript
// types.ts
export interface ComponentProps {
title: string;
visible: boolean;
data?: any[];
}
export interface ComponentEmits {
(e: 'update:visible', value: boolean): void;
(e: 'confirm', data: any): void;
}
// 响应式数据类型
export interface ComponentState {
loading: boolean;
formData: FormData;
}
```
### 组件通信规范
1. **Props向下传递**:父组件向子组件传递数据
2. **Emits向上传递**:子组件向父组件传递事件
3. **v-model双向绑定**:表单组件使用v-model
4. **Provide/Inject**:跨级组件通信
5. **Pinia状态管理**:全局状态共享
## 18. 页面开发规范
### 列表页面标准模板
```vue
```
### 页面样式规范
```scss
.page-container {
height: calc(100vh - 85px);
display: flex;
flex-direction: column;
overflow: hidden;
box-sizing: border-box;
padding: 8px 8px 0 8px !important;
}
.table-card {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.table-card :deep(.el-card__body) {
flex: 1;
display: flex;
flex-direction: column;
padding: 20px 20px 0 20px;
}
```
### 数据处理规范
```typescript
// 页面数据结构
const data = reactive>({
form: { ...initFormData },
queryParams: {
pageNum: 1,
pageSize: 10,
// 查询参数
},
rules: {
// 验证规则
}
});
// 表格高度计算
const tableHeight = computed(() => {
const searchHeight = showSearch.value ? 120 : 0;
const toolbarHeight = 50;
const paginationHeight = 60;
const otherHeight = 90;
return windowHeight.value - searchHeight - toolbarHeight - paginationHeight - otherHeight;
});
```
## 19. API开发规范
### API接口定义标准
```typescript
// api/[module]/index.ts
import request from '@/utils/request';
import type { AxiosPromise } from 'axios';
import type { DataVO, DataForm, DataQuery } from './types';
/**
* 查询数据列表
* @param query 查询参数
*/
export const listData = (query?: DataQuery): AxiosPromise => {
return request({
url: '/api/data/list',
method: 'get',
params: query
});
};
/**
* 查询数据详细信息
* @param id 数据ID
*/
export const getData = (id: string | number): AxiosPromise => {
return request({
url: `/api/data/${id}`,
method: 'get'
});
};
/**
* 新增数据
* @param data 数据信息
*/
export const addData = (data: DataForm) => {
return request({
url: '/api/data',
method: 'post',
data: data
});
};
/**
* 修改数据
* @param data 数据信息
*/
export const updateData = (data: DataForm) => {
return request({
url: '/api/data',
method: 'put',
data: data
});
};
/**
* 删除数据
* @param id 数据ID或ID数组
*/
export const delData = (id: string | number | Array) => {
return request({
url: `/api/data/${id}`,
method: 'delete'
});
};
```
### API类型定义规范
```typescript
// api/[module]/types.ts
export interface DataVO {
/** 主键ID */
id: string | number;
/** 数据名称 */
name: string;
/** 数据状态 */
status: string;
/** 创建时间 */
createTime?: string;
/** 更新时间 */
updateTime?: string;
}
export interface DataForm extends BaseEntity {
/** 主键ID */
id?: string | number;
/** 数据名称 */
name?: string;
/** 数据状态 */
status?: string;
}
export interface DataQuery extends PageQuery {
/** 数据名称 */
name?: string;
/** 数据状态 */
status?: string;
/** 日期范围参数 */
params?: any;
}
```
### 错误处理规范
```typescript
// 统一错误处理已在request.ts中实现
// 业务层只需要使用try-catch处理特殊情况
const handleSubmit = async () => {
try {
await addData(formData);
proxy?.$modal.msgSuccess('操作成功');
getList();
} catch (error) {
// 特殊错误处理(可选)
console.error('操作失败:', error);
}
};
```
## 20. 工具组件使用规范
### RightToolbar 工具栏
```vue
```
### Pagination 分页组件
```vue
```
### DictTag 字典标签
```vue
```
### ImageUpload 图片上传
```vue
```
## 21. 样式开发规范
### SCSS变量使用
```scss
// 使用设计变量
.component {
background-color: var(--art-main-bg-color);
border: 1px solid var(--art-border-color);
border-radius: var(--border-radius-md);
padding: var(--space-lg);
color: var(--art-text-gray-700);
}
// 响应式设计
@media screen and (max-width: $device-phone) {
.component {
padding: var(--space-sm);
}
}
```
### 暗色主题适配
```scss
// 组件支持暗色主题
.component {
background-color: var(--art-main-bg-color);
// 暗色主题下自动适配
html.dark & {
border-color: var(--art-border-color);
color: var(--art-text-gray-700);
}
}
```
### CSS类命名规范
- **组件容器**:`.component-name-container`
- **元素**:`.component-name__element`
- **修饰符**:`.component-name--modifier`
- **状态**:`.is-active`, `.is-disabled`, `.is-loading`
- **工具类**:`.text-center`, `.mb-4`, `.p-2`
## 22. 权限控制规范
### 页面权限
```vue
新增
```
### 路由权限配置
```typescript
{
path: '/user',
component: Layout,
meta: {
title: '用户管理',
icon: 'user',
roles: ['admin', 'user'], // 角色权限
permissions: ['system:user:view'] // 功能权限
}
}
```
## 23. 性能优化规范
### 组件懒加载
```typescript
// 路由懒加载
const UserManagement = () => import('@/views/system/user/index.vue');
// 组件异步加载
const LazyComponent = defineAsyncComponent(() => import('./LazyComponent.vue'));
```
### 列表优化
```vue
```
### 图片优化
```vue
加载中...
加载失败
```
## 24. 国际化规范
### 多语言配置
```typescript
// lang/zh_CN.ts
export default {
common: {
add: '新增',
edit: '修改',
delete: '删除',
search: '搜索',
reset: '重置'
},
user: {
username: '用户名',
email: '邮箱',
status: '状态'
}
};
```
### 使用方式
```vue
{{ $t('common.add') }}
```
## 25. 测试规范
### 单元测试
```typescript
// 组件测试
import { mount } from '@vue/test-utils';
import UserForm from '@/components/UserForm/index.vue';
describe('UserForm', () => {
test('should render correctly', () => {
const wrapper = mount(UserForm, {
props: {
visible: true,
data: {}
}
});
expect(wrapper.find('.user-form').exists()).toBe(true);
});
});
```
### E2E测试
```typescript
// 页面流程测试
describe('User Management', () => {
test('should add user successfully', async () => {
await page.goto('/user');
await page.click('[data-test="add-button"]');
await page.fill('[data-test="username"]', 'testuser');
await page.click('[data-test="submit-button"]');
await expect(page.locator('.el-message')).toContainText('操作成功');
});
});
```
## 26. 构建和部署规范
### 环境配置
```typescript
// .env.development
VITE_APP_ENV = 'development'
VITE_APP_BASE_API = '/dev-api'
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
// .env.production
VITE_APP_ENV = 'production'
VITE_APP_BASE_API = '/prod-api'
VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
```
### 构建优化
```typescript
// vite.config.ts
export default defineConfig({
build: {
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash].[ext]',
manualChunks: {
'element-plus': ['element-plus'],
'vue-vendor': ['vue', 'vue-router', 'pinia']
}
}
}
}
});
```
## 27. 代码质量保证
### ESLint配置规范
```typescript
// eslint.config.ts
export default [
{
rules: {
// Vue相关规则
'vue/no-unused-vars': 'error',
'vue/require-default-prop': 'off',
'vue/multi-word-component-names': 'off',
// TypeScript相关规则
'@typescript-eslint/no-explicit-any': 'warn',
'@typescript-eslint/no-unused-vars': 'error',
// 通用规则
'no-console': 'warn',
'no-debugger': 'error'
}
}
];
```
### 代码提交规范
```bash
# 提交信息格式
git commit -m "feat(user): 新增用户管理功能"
# 提交类型
feat: 新功能
fix: 修复bug
docs: 文档更新
style: 代码格式调整
refactor: 重构代码
test: 测试相关
chore: 构建工具或辅助工具的变动
```
### 代码审查清单
- [ ] 代码符合项目规范
- [ ] 类型定义完整
- [ ] 组件可复用性良好
- [ ] 性能优化到位
- [ ] 无安全隐患
- [ ] 测试覆盖充分
- [ ] 文档更新及时
---
此规范基于 Art Design Pro 的优秀设计理念,结合现代 Web 设计趋势和 plus-ui 项目的实际实现,为 Plus UI 提供统一的设计语言和完整的开发标准。通过严格遵循此规范,可以确保项目的高质量、可维护性和团队协作效率。
## 26. 代码调整记录规范
### 📝 重要提醒:代码调整记录要求
**每次使用Cursor修改前端代码时,都必须在项目根目录的【代码调整记录.md】文件中记录调整信息。**
### 记录格式标准
### 记录要求
1. **及时性**: 每次代码调整完成后立即记录
2. **完整性**: 包含所有必要信息字段
3. **准确性**: 详细描述实际的调整内容
4. **可追溯性**: 便于后续查看和维护
### Cursor AI使用提醒
当您要求Cursor AI进行代码调整时,请提醒AI:
```
请在完成代码调整后,帮我在【代码调整记录.md】文件中记录本次调整的相关信息,
包括调整时间、目的、涉及文件、具体内容等。
```
### 文件管理
- 记录文件位置: 项目根目录 `代码调整记录.md`
- 记录保留期: 建议保留至少6个月的调整记录
- 定期整理: 每月可将过期记录归档到 `docs/change-logs/` 目录
这个记录制度有助于:
✅ 追踪代码变更历史
✅ 团队协作信息共享
✅ 问题排查和回溯
✅ 知识积累和经验总结
✅ 项目维护和交接
## 26. 代码调整记录规范
### 📝 重要提醒:代码调整记录要求
**每次使用Cursor修改前端代码时,都必须在项目根目录的【代码调整记录.md】文件中记录调整信息。**
### 记录格式标准
每次调整后请按以下格式记录:
```
## 调整记录 - YYYY-MM-DD HH:mm:ss
**调整时间**: YYYY-MM-DD HH:mm:ss
**调整人**: [开发者姓名/Cursor AI辅助]
**调整目的**: [简述调整原因和目标]
**涉及文件**:
- src/views/module/file.vue
- src/api/module/file.ts
- src/components/ComponentName/index.vue
**调整内容详述**:
1. 具体调整了哪些代码
2. 修改了哪些功能
3. 优化了哪些性能
4. 修复了哪些问题
**技术细节**:
- 使用的技术栈: Vue 3.5.13 + TypeScript 5.8.3 + Element Plus 2.9.8
- 遵循的设计规范: Art Design Pro轮廓式按钮系统
- CSS变量使用: --art-*变量系统
- 其他重要技术决策
**测试验证**:
- [ ] 功能测试通过
- [ ] 样式规范检查通过
- [ ] TypeScript类型检查通过
- [ ] 响应式布局测试通过
- [ ] 暗色主题兼容性测试通过
**备注**: 其他需要说明的内容
---
```
### 记录要求
1. **及时性**: 每次代码调整完成后立即记录
2. **完整性**: 包含所有必要信息字段
3. **准确性**: 详细描述实际的调整内容
4. **可追溯性**: 便于后续查看和维护
### Cursor AI使用提醒
当您要求Cursor AI进行代码调整时,请提醒AI:
"请在完成代码调整后,帮我在【代码调整记录.md】文件中记录本次调整的相关信息,包括调整时间、目的、涉及文件、具体内容等。"
### 文件管理
- 记录文件位置: 项目根目录 `代码调整记录.md`
- 记录保留期: 建议保留至少6个月的调整记录
- 定期整理: 每月可将过期记录归档到 `docs/change-logs/` 目录
这个记录制度有助于:
✅ 追踪代码变更历史
✅ 团队协作信息共享
✅ 问题排查和回溯
✅ 知识积累和经验总结
✅ 项目维护和交接
### ⚠️ 强制要求
**所有通过Cursor AI进行的代码调整都必须在【代码调整记录.md】中留下记录,这是项目管理的强制性要求。**