Files
vibe_coding/docs/guides/ui-specs-admin.md
2026-03-05 21:27:11 +08:00

229 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🖥️ UI 规范 — 管理端Case-Database-Frontend-admin
> 管理端设计规范。AI 在 `Case-Database-Frontend-admin/` 中新建页面或组件时参考本文档。
> 核心原则:**桌面优先、功能完整、Element Plus 标准优先**
---
## 1. 设计系统
| 项目 | 选型 |
|---|---|
| UI 组件库 | Element Plus优先使用标准组件不自定义重复造轮子 |
| CSS 方案 | Tailwind CSS辅助布局不覆盖 Element Plus 样式) |
| 图标 | Element Plus Icons`@element-plus/icons-vue` |
| 字体 | 系统字体栈 |
| 布局框架 | 侧边导航 + 顶部栏 + 内容区(标准后台布局) |
---
## 2. 色彩系统
```css
:root {
/* 主色Element Plus 默认蓝) */
--el-color-primary: #409EFF;
/* 管理端背景层级 */
--admin-bg-sidebar: #001529; /* 深色侧边栏 */
--admin-bg-header: #FFFFFF; /* 白色顶栏 */
--admin-bg-content: #F0F2F5; /* 内容区浅灰 */
--admin-bg-card: #FFFFFF; /* 卡片/表格白 */
/* 状态色 */
--status-active: #52C41A; /* 启用/正常 */
--status-inactive: #D9D9D9; /* 停用/禁用 */
--status-pending: #FAAD14; /* 待处理 */
--status-danger: #FF4D4F; /* 危险/错误 */
}
```
Element Plus 主题色配置(`src/styles/element-vars.scss`
```scss
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
$colors: (
'primary': ('base': #409EFF),
)
);
```
---
## 3. 布局规范
### 整体框架
```
┌─────────────────────────────────────────────────────────┐
│ 顶栏60px 固定Logo + 面包屑 + 用户信息 + 通知 │
├──────────────┬──────────────────────────────────────────┤
│ │ 内容区padding: 16px
│ 侧边栏 │ ┌──────────────────────────────────────┐ │
220px │ │ 页面标题 + 操作按钮(顶部工具栏) │ │
│ │ ├──────────────────────────────────────┤ │
│ 折叠后 │ │ 主内容(表格/表单/卡片) │ │
│ → 64px │ │ │ │
│ │ └──────────────────────────────────────┘ │
└──────────────┴──────────────────────────────────────────┘
```
### 响应式
管理端以桌面端为主,但需支持:
- `≥ 1280px`:完整布局(侧边栏展开)
- `1024px ~ 1279px`侧边栏折叠64px 图标模式)
- `< 1024px`:侧边栏收起为抽屉(移动端兜底)
---
## 4. Element Plus 组件使用规范
### 数据表格el-table
```vue
<el-table
v-loading="loading"
:data="tableData"
stripe
border
highlight-current-row
style="width: 100%"
>
<!-- 数据列 -->
<el-table-column prop="id" label="ID" width="80" sortable />
<el-table-column prop="name" label="名称" min-width="180" show-overflow-tooltip />
<!-- 状态列Tag -->
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag :type="row.status === 1 ? 'success' : 'danger'">
{{ row.status === 1 ? '启用' : '停用' }}
</el-tag>
</template>
</el-table-column>
<!-- 操作列固定右侧 -->
<el-table-column label="操作" fixed="right" width="160">
<template #default="{ row }">
<el-button v-permission="'module:edit'" link type="primary" @click="handleEdit(row)">编辑</el-button>
<el-popconfirm title="确定删除?" @confirm="handleDelete(row.id)">
<template #reference>
<el-button v-permission="'module:delete'" link type="danger">删除</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<!-- 分页固定格式 -->
<el-pagination
v-model:current-page="query.page"
v-model:page-size="query.page_size"
:page-sizes="[10, 20, 50, 100]"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
class="mt-4 justify-end"
@change="fetchData"
/>
```
### 搜索表单
```vue
<!-- 搜索栏折叠设计超过 3 个条件可折叠 -->
<el-card class="mb-4" shadow="never">
<el-form :model="query" inline @keyup.enter="handleSearch">
<el-form-item label="关键词">
<el-input v-model="query.keyword" placeholder="请输入" clearable style="width: 200px" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</el-card>
```
### 弹窗表单
```vue
<el-dialog v-model="dialogVisible" :title="isEdit ? '编辑' : '新建'" width="600px" @close="handleDialogClose">
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" :loading="submitting" @click="handleSubmit">确定</el-button>
</template>
</el-dialog>
```
规则:
- 弹窗宽度:简单表单 500px复杂表单 700-900px
- 弹窗关闭时必须调用 `formRef.value?.resetFields()`
- 提交按钮加 `:loading` 防重复提交
---
## 5. 页面标准结构
每个管理端页面遵循以下结构:
```vue
<template>
<div class="admin-page">
<!-- 页面头部标题 + 主要操作按钮 -->
<div class="mb-4 flex items-center justify-between">
<h2 class="text-lg font-semibold text-gray-800">页面标题</h2>
<el-button v-permission="'module:create'" type="primary" @click="handleCreate">
<el-icon><Plus /></el-icon> 新建
</el-button>
</div>
<!-- 搜索区 -->
<!-- 表格区 -->
<!-- 分页区 -->
<!-- 弹窗区 -->
</div>
</template>
<script setup>
// 1. 导入
// 2. 响应式状态
// 3. 表单/验证规则
// 4. 数据获取
// 5. 事件处理CRUD
// 6. 生命周期
</script>
```
---
## 6. 间距规范
| 场景 | 间距 |
|---|---|
| 内容区内边距 | `p-4`16px |
| 卡片间距 | `mb-4`16px |
| 表单项间距 | Element Plus 默认(`el-form` 管理) |
| 操作按钮间距 | `ml-2`8px同行按钮 |
---
## 7. 状态规范
| 状态 | 实现方式 |
|---|---|
| 加载中 | `v-loading="loading"``el-table``el-card` |
| 空状态 | `el-empty`(有描述、有图) |
| 错误状态 | `el-result` type="error"(提供重试按钮) |
| 操作成功 | `ElMessage.success('操作成功')` |
| 操作失败 | `ElMessage.error(error.message)` |
| 危险操作确认 | `el-popconfirm`(行内)/ `ElMessageBox.confirm`(批量) |
---
*最后更新: 2026-02-26*