--- description: UserDashboard 页面样式与布局设计指南 - 供后续页面设计参考 --- # UserDashboard 页面样式与布局设计指南 ## 概述 此文档描述了 `UserDashboard.vue` 页面的样式和布局设计模式,可作为后续页面设计的参考标准。该页面采用 **Vue 3 + Vuetify 3 + TypeScript** 技术栈,实现了一个**分层钻取式(Drill-Down)导航**的 Dashboard 界面。 --- ## 1. 整体页面结构 ### 1.1 布局架构 ``` ┌─────────────────────────────────────────────────────────────┐ │ 顶部工具栏 (Top Bar) │ │ - 面包屑导航 (Breadcrumbs) │ │ - 全局搜索框 (Search Autocomplete) │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 主内容区域 (Main Content Area) │ │ - 可滚动区域 │ │ - 根据导航层级动态切换内容组件 │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────┘ ``` ### 1.2 根容器设置 ```vue ``` **设计要点:** - 使用 `fluid` 流式布局 - `d-flex flex-column` 实现垂直弹性布局 - `h-100` 占满高度 - `pa-0` 移除内边距 - 宽度 `95%` 留出两侧适当边距 --- ## 2. 顶部工具栏设计 ### 2.1 结构 ```vue
``` ### 2.2 设计要点 - **固定高度**:使用 `flex-shrink-0` 防止压缩 - **背景色**:`bg-white` 白色背景 - **底部边框**:`border-b` 分隔线 - **内边距**:`px-4 py-2` 水平16px,垂直8px - **内容对齐**:`d-flex align-center` 水平排列垂直居中 ### 2.3 面包屑导航设计 ```vue
层级名称 mdi-chevron-right
``` **特点:** - 使用 `v-btn variant="text"` 作为可点击导航项 - 使用 `mdi-chevron-right` 图标作为分隔符 - 图标尺寸 `size="small"`,间距 `mx-2` - 当前层级设置 `:disabled="true"` 表示不可点击 ### 2.4 搜索框设计 ```vue ``` **特点:** - `variant="outlined"` 外框样式 - `density="compact"` 紧凑型高度 - `bg-color="grey-lighten-5"` 浅灰色背景 - `prepend-inner-icon="mdi-magnify"` 搜索图标 - `hide-details` 隐藏辅助文本空间 - `clearable` 可清除按钮 --- ## 3. 主内容区域设计 ### 3.1 滚动容器 ```vue
``` **设计要点:** - `flex-grow-1` 填充剩余空间 - `overflow-y-auto` 垂直滚动 - `overflow-x-hidden` 隐藏水平滚动 - 自定义滚动条样式 ### 3.2 自定义滚动条样式 ```css .custom-scrollbar { scrollbar-width: thin; scrollbar-color: rgba(0, 0, 0, 0.2) transparent; } .custom-scrollbar::-webkit-scrollbar { width: 6px; height: 6px; } .custom-scrollbar::-webkit-scrollbar-track { background: transparent; } .custom-scrollbar::-webkit-scrollbar-thumb { background-color: rgba(0, 0, 0, 0.2); border-radius: 3px; } ``` **特点:** - 细滚动条 `width: 6px` - 透明轨道 - 半透明滚动条滑块 - 圆角处理 --- ## 4. 列表组件设计模式 ### 4.1 通用列表结构 ```vue 图标 列表标题 {{ item.name }} ... ``` ### 4.2 列表项悬停效果 ```css .v-list-item { transition: all 0.2s ease; } .v-list-item:hover { background-color: rgba(var(--v-theme-primary), 0.08); } ``` --- ## 5. 数据表格设计模式 ### 5.1 表格工具栏 ```vue mdi-hammer-wrench 表格标题 操作按钮 ``` ### 5.2 数据表格 ```vue ``` ### 5.3 状态标签设计 ```vue {{ getStatusIcon(status) }} {{ status }} ``` **状态颜色映射:** ```typescript const statusColors = { 'SUCCESS': 'success', 'FAILURE': 'error', 'UNSTABLE': 'warning', 'ABORTED': 'grey', 'RUNNING': 'info' } ``` --- ## 6. 详情页面设计模式 ### 6.1 详情页头部 ```vue
标题 状态
操作1 操作2
``` ### 6.2 详情卡片分组 ```vue mdi-icon 卡片标题 ``` ### 6.3 详情项组件 (DetailItem) ```vue
{{ icon }} {{ label }}
{{ value }}
``` **胶囊样式 CSS:** ```css .value-capsule { transition: all 0.2s ease; min-height: 44px; border: 1px solid rgba(0, 0, 0, 0.05); } .value-capsule:hover { background-color: rgba(var(--v-theme-on-surface), 0.08) !important; border-color: rgba(0, 0, 0, 0.1); } .copy-btn { opacity: 0; transition: opacity 0.2s ease; } .value-capsule:hover .copy-btn { opacity: 1; } ``` --- ## 7. 弹窗设计模式 ### 7.1 标准弹窗 ```vue 弹窗标题 内容 取消 确认 ``` ### 7.2 全屏弹窗(日志查看器) ```vue 全屏弹窗标题 ``` --- ## 8. 状态处理模式 ### 8.1 加载状态 ```vue
``` ### 8.2 错误状态 ```vue {{ error }} ``` ### 8.3 空状态 ```vue ``` --- ## 9. 颜色规范 ### 9.1 主题颜色使用 | 用途 | 颜色 | Vuetify类/变量 | |------|------|----------------| | 主要操作 | 蓝色 | `primary` | | 次要操作 | 灰色 | `secondary` | | 成功状态 | 绿色 | `success` | | 错误状态 | 红色 | `error` | | 警告状态 | 橙色 | `warning` | | 提示信息 | 蓝色 | `info` | | 禁用/中性 | 灰色 | `grey` | ### 9.2 背景颜色 - 页面背景:默认(白色/浅灰) - 卡片背景:`bg-surface` - 输入框背景:`bg-grey-lighten-5` - 胶囊值背景:`bg-grey-lighten-5` --- ## 10. 间距规范 ### 10.1 Vuetify 间距系统 | 值 | 像素 | 使用场景 | |----|------|----------| | 1 | 4px | 极小间距 | | 2 | 8px | 小间距 | | 3 | 12px | 中等间距 | | 4 | 16px | 标准间距 | | 5 | 24px | 大间距 | | 6 | 32px | 超大间距 | ### 10.2 常用间距组合 - 卡片内边距:`pa-4`(16px) - 列表项底部间距:`mb-2`(8px) - 详情项底部间距:`mb-5`(24px) - 按钮组间距:`ga-2` 或 `ga-3` --- ## 11. 图标使用规范 ### 11.1 常用图标 | 用途 | 图标 | |------|------| | 组织 | `mdi-domain` / `mdi-folder-network` | | 仓库 | `mdi-source-repository` | | 分支 | `mdi-source-branch` | | 构建 | `mdi-hammer-wrench` | | 搜索 | `mdi-magnify` | | 导航 | `mdi-chevron-right` / `mdi-arrow-left` | | 刷新 | `mdi-refresh` | | 关闭 | `mdi-close` | | 复制 | `mdi-content-copy` | | 外部链接 | `mdi-open-in-new` | | 日志 | `mdi-text-box-outline` | ### 11.2 图标尺寸 - 列表项图标:`size="small"` 或默认 - 状态标签图标:`size="x-small"` - 头像图标:默认(在 `v-avatar` 内) - 面包屑分隔符:`size="small"` --- ## 12. 组件化设计原则 ### 12.1 组件拆分原则 1. **单一职责**:每个组件只负责一个功能 2. **可复用性**:将通用 UI 模式抽取为独立组件 3. **Props 驱动**:通过 Props 传递数据,通过 Events 传递交互 ### 12.2 本项目组件结构 ``` components/ ├── projects/ │ ├── DashboardBreadcrumbs.vue # 面包屑导航 │ ├── OrganizationList.vue # 组织列表 │ ├── RepositoryList.vue # 仓库列表 │ ├── BranchList.vue # 分支列表 │ ├── BuildList.vue # 构建列表 │ └── BuildDetails.vue # 构建详情 ├── common/ │ └── DetailItem.vue # 详情项组件 └── jenkins/ ├── BuildTrigger.vue # 构建触发器 └── LogViewer.vue # 日志查看器 ``` --- ## 13. 交互模式 ### 13.1 导航模式 - **钻取式导航**:点击列表项进入下一层级 - **面包屑回溯**:点击面包屑返回上层 - **全局搜索**:快速跳转到任意层级 ### 13.2 动画效果 - 过渡动画:`transition: all 0.2s ease` - 弹窗动画:`transition="dialog-bottom-transition"` - 悬停效果:背景色变化、元素显现 ### 13.3 自动刷新 - 列表数据刷新:10秒间隔(有运行中任务时3秒) - 详情数据刷新:3秒间隔(仅运行中状态) --- ## 使用示例 ### 创建新的钻取式页面 ```vue ``` ---