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

7.1 KiB
Raw Permalink Blame History

🖥️ 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. 色彩系统

: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

@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

<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"
/>

搜索表单

<!-- 搜索栏折叠设计超过 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>

弹窗表单

<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. 页面标准结构

每个管理端页面遵循以下结构:

<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-416px
卡片间距 mb-416px
表单项间距 Element Plus 默认(el-form 管理)
操作按钮间距 ml-28px同行按钮

7. 状态规范

状态 实现方式
加载中 v-loading="loading"el-tableel-card
空状态 el-empty(有描述、有图)
错误状态 el-result type="error"(提供重试按钮)
操作成功 ElMessage.success('操作成功')
操作失败 ElMessage.error(error.message)
危险操作确认 el-popconfirm(行内)/ ElMessageBox.confirm(批量)

最后更新: 2026-02-26