ui-ux-decision-guide
Skill0 starsChanged 15 days agoMITView on GitHub
后台系统的 UI/UX 控件选型决策规范。包含弹窗 Modal 与抽屉 Drawer 与新页面的选择判据及尺寸、六种提示形态(message/notification/Alert/Tooltip/Popover/Hint)对照、列表页要不要条件搜索与分页与无限滚动、表格与卡片的选择、操作按钮收纳规则、空态/加载态/错误态三态、表单单列与双列与分步、危险操作确认分级、标准页面骨架。当不确定该做弹窗还是抽屉、提示用哪种、列表要不要搜索分页、按钮放哪、或写新页面需要统一骨架时使用。
In this repository22 other files it gives its agents.
- api-contract-designSkill
- async-loading-stabilitySkill
- auth-pages-specSkill
- data-visualizationSkill
- deployment-opsSkill
- design-intelligenceSkill
- form-design-specSkill
- frontend-marketing-pagesSkill
- go-backend-architectureSkill
- i18n-specSkill
- jwt-session-authSkill
- media-file-managementSkill
- mobile-responsive-layoutSkill
- motion-animation-specSkill
- mysql-schema-designSkill
- notification-centerSkill
- react-frontend-architectureSkill
- rich-media-inputSkill
- table-advancedSkill
- testing-strategySkill
- web-project-bootstrapSkill
- web-tech-stackSkill
The file
Files
定位:决策表,不是审美
后台系统的交互形态高度收敛——同一类场景应该用同一种控件。 本文给判据和数字,照选。不要每个页面重新设计。
一、弹窗 / 抽屉 / 新页面(最高频的模糊点)
1.1 决策树(按顺序问)
① 是"确认类"操作吗(删除、提交、审批)?
→ 是:Modal(小,宽 420-480) 结束
② 内容是只读查看吗?
→ 是:Drawer(不离开列表,保留上下文)
→ 否:继续
③ 表单字段数?
├─ ≤ 7 个 → Modal(宽 600)
├─ 8–20 个 → Drawer(宽 640-720)
└─ > 20 个或分步 → 新页面(路由 + URL)
④ 操作完还要回头看列表吗?
→ 要:Drawer(列表在旁边,关掉就回来)
→ 不要:Modal 或新页面都行1.2 三种形态的对照
| 维度 | Modal 弹窗 | Drawer 抽屉 | 新页面 |
| 宽度 | 420–600 | 480–800 | 全屏 |
| 上下文保留 | ❌ 遮挡列表 | ✅ 列表可见 | ❌ 跳走 |
| 可分享 URL | ❌ | ⚠️ 可用 query | ✅ 原生 |
| 内容容量 | 少 | 中 | 多 |
| 适合 | 确认、简单表单、选人 | 编辑、详情、中表单 | 复杂表单、多 tab 详情 |
1.3 尺寸规范(直接用,别自己定)
| 场景 | 尺寸 |
| 确认弹窗(删除/提交) | Modal,宽 420,无标题栏图标 |
| 简单表单(≤7 字段) | Modal,宽 600 |
| 选人/选商品弹窗 | Modal,宽 800,内含搜索 + 表格 |
| 详情抽屉 | Drawer,宽 600 |
| 编辑表单(8–12 字段) | Drawer,宽 640 |
| 复杂表单(13–20 字段) | Drawer,宽 720 |
| 超大表单 | 新页面 |
移动端例外:< 768px 时,Drawer 一律变全屏,Modal 变底部弹出(placement="bottom")。
1.4 一条决定性判据
用户操作完,需要立刻对照列表看结果吗? 需要 → Drawer(列表还在) 不需要 → Modal
例:批量改状态 → Modal(改完看列表,但操作本身不需要对照) 例:编辑订单备注 → Drawer(一边看订单信息一边改)
二、提示形态:六种,用错就烦人
| 形态 | 用途 | 时长 | 位置 | 例 |
| message(toast) | 一次性操作反馈 | 2–3s 自动消失 | 顶部居中 | "保存成功" / "删除失败" |
| notification | 需要阅读的通知 | 4.5s 或手动关 | 右上角 | "导出已完成,点击下载" |
| Alert(页内横幅) | 持续状态,要一直看到 | 常驻 | 内容区顶部 | "账户未实名,部分功能受限" |
| Tooltip | 图标/短词的解释 | hover | 元素旁 | 图标含义 |
| Popover | 较长的说明,可含链接/按钮 | 点击 | 元素旁 | "冻结金额是什么?" |
| Hint(? 图标 + 气泡) | 表单字段填写说明 | 常驻图标 | label 旁 | 字段旁的 ? |
判断口诀
一次性结果反馈 → message
需要用户读一段 → notification
状态一直存在 → Alert
解释某个元素 → Tooltip(短)/ Popover(长)
解释一个字段 → Hint
需要用户做决定 → 不是提示,是 Modalagent 常犯的三个错
| 错误 | 后果 | 正确 |
| 用 message 显示需要读的详细信息 | 一闪就没,用户没看清 | 用 notification 或 Alert |
| 用 Alert 显示"保存成功" | 成功提示常驻不消失 | 用 message |
用 alert() / window.confirm() | 阻塞、样式丑、移动端体验差 | message / Modal.confirm |
提示文案规范
- 成功:动词 + 结果:「保存成功」「已删除 3 条」
- 失败:原因 + 下一步:「余额不足,请先充值」(不要只说"操作失败")
- 不要用感叹号,不要用"亲"
- 不要在文案里暴露技术细节(SQL、堆栈)
三、列表页:搜索与分页要不要
3.1 要不要条件搜索
| 数据量 / 场景 | 方案 |
| < 50 条,只是浏览 | 不加(浪费空间) |
| ≥ 50 条 | 顶部一个关键词输入框 |
| 需要按状态/类型/时间找 | 加下拉 + 日期选择(3–5 个条件) |
| 条件 > 5 个 | 默认显示 3 个,其余放「展开」 |
判据:用户会不会"按某个条件精确找一条记录"? 会 → 必须加。
3.2 要不要分页
| 数据量 | 方案 |
| < 30 条 | 不分页,全显示 |
| 30–1000 | 分页,pageSize = 20 |
| > 1000 | 分页 + 服务端筛选(绝不能一次拉全量) |
| 内容流(Feed) | 无限滚动 |
后台系统一律用分页,不用无限滚动。 理由:要跳到第 N 页、要知道总数、要能分享 URL。
3.3 分页组件规范
- 位置:表格右下角
- 显示:
共 128 条+ 页码 +20 条/页切换 - pageSize 选项:10 / 20 / 50 / 100
- 总数为 0 时不显示分页(显示空态)
- 换 pageSize 时 page 重置为 1
- 筛选变更时 page 重置为 1
3.4 排序
- 默认按
created_at DESC(新的在前) - 可排序列在表头加排序图标
- 服务端排序,不要前端排
四、表格 vs 卡片
| 用什么 | 场景 |
| 表格 | 结构化数据、要横向对比、列 ≥ 4、后台管理 |
| 卡片列表 | 图文混排、要视觉吸引、字段少(< 6)、前台展示 |
后台管理 95% 用表格。 不要为了"好看"把表格改成卡片。
表格列规范
- 前 1–2 列固定(ID / 名称)
- 操作列 固定在右侧,宽 120–180
- 长文本列设
ellipsis+ Tooltip,不要撑宽 - 状态列用
StatusTag(颜色来自constants/options) - 金额列右对齐、等宽字体、两位小数
- 时间列统一格式
YYYY-MM-DD HH:mm - 行高默认(不要自定义)
- 斑马纹可选,行 hover 高亮必须有
五、操作按钮放哪
5.1 行内操作
| 数量 | 方案 |
| 1–3 个 | 全部行内文字按钮 |
| 4–5 个 | 前 2 个行内,其余进「更多 ▾」下拉 |
| > 5 个 | 只留「详情」行内,其余全进下拉 |
顺序:查看 → 编辑 → 其他 → 删除(删除永远在最后,且红色)
5.2 页面级操作
PageContainer 右上角:
[次要操作] [主要操作]
例:[导出] [新建订单]- 主操作只用一个(主色按钮)
- 其余用默认按钮
- 危险操作(批量删除)放在工具栏,且需要先勾选
5.3 批量操作
- 勾选后才出现工具栏:「已选 3 项」+ [批量删除] [批量导出] [取消选择]
- 批量操作必须有数量提示
- 危险批量操作二次确认要显示数量
六、三态:空、加载、错误
6.1 空态分三种,文案不同
| 类型 | 触发 | 文案 | CTA |
| 初次无数据 | 一条都没有 | 「还没有订单,创建第一个吧」 | [新建订单] |
| 筛选无结果 | 有数据但筛不到 | 「没有符合条件的订单,试试调整筛选」 | [清空筛选] |
| 无权限 | 有数据但看不到 | 「没有查看权限,请联系管理员」 | 无 |
不要三种都用「暂无数据」。
6.2 加载态
| 场景 | 用什么 |
| 首屏 / 整页 | Skeleton 骨架屏 |
| 局部区域刷新 | Spin(区块内) |
| 按钮提交 | Button loading={true} + 禁用 |
| 表格翻页 | Table loading |
| 图片加载 | 占位图 + 淡入 |
不要用全屏 loading 遮罩——挡住用户所有操作。
6.3 错误态
| 层级 | 展示 |
| 字段错误 | 表单内联红字(Form.Item 的 help) |
| 请求失败 | 区块内 Result status="error" + [重试] |
| 页面级 404/403 | 独立页面 |
| 网络断开 | 顶部 Alert 横幅(常驻直到恢复) |
七、表单布局
| 字段数 | 布局 |
| ≤ 6 | 单列,label 宽 120 左对齐 |
| 7–15 | 双列(el-row 24 栅格,每个 span=12) |
| > 15 或逻辑分组 | 分组 + 分步(Steps 或 Collapse) |
表单细则
- label 必须有,不用 placeholder 代替
- 必填标红星在 label 前
- 字段顺序:重要/常用在前,选填在后
- 长文本用 TextArea(
rows=3),不要单行 Input - 日期用 DatePicker,不要手输
- 金额用 InputNumber,
precision=2,右侧加单位 - 提交按钮固定在表单底部或 Drawer footer
- 提交中必须禁用按钮(防重复提交)
- 取消时若有改动,二次确认
八、危险操作确认分级
| 级别 | 操作 | 确认方式 |
| 低 | 删除单条无关联数据 | Modal.confirm:「确定删除这条记录?」 |
| 中 | 批量删除、状态变更不可逆 | Modal,显示数量:「确定删除选中的 3 条?」 |
| 高 | 删除有子数据的分类/用户、清空数据 | Modal + 要求输入名称确认 |
| 极高 | 重置系统、批量清空 | 输入名称 + 二次验证码 |
三、四级必须说明后果:「删除后该分类下的 12 个商品将一并删除,此操作不可恢复。」
九、标准页面骨架(每个页面照这个搭)
<PageContainer title="订单管理" extra={[导出, 新建]}>
┌─ 页头:标题 + 面包屑 + 操作按钮(右)
├─ SearchForm:关键词 | 状态▾ | 日期范围 | [查询] [重置] [展开▾]
├─ 工具栏:[已选 N 项] [批量删除] ... [列设置] [刷新]
├─ ProTable:三态 + 状态标签 + 操作列固定右
└─ 分页:右下角,共 N 条 | 页码 | 20 条/页
</PageContainer>新建页面时,先套这个骨架,再填内容。不要重新设计页面结构。
十、决策速查表(agent 直接查)
| 你的情况 | 用什么 |
| 问"确定删除吗" | Modal.confirm,宽 420 |
| 表单 6 个字段 | Modal,宽 600 |
| 表单 12 个字段 | Drawer,宽 640 |
| 表单 25 个字段 | 新页面 |
| 只读看详情 | Drawer,宽 600 |
| 多 tab 复杂详情 | 新页面 |
| 保存成功 | toast.success('保存成功') |
| 需要用户读一段话 | notification |
| 账户异常要一直提示 | Alert |
| 解释图标含义 | Tooltip |
| 解释表单字段 | Hint(? 图标) |
| 列表 200 条 | 关键词搜索 + 分页 pageSize=20 |
| 列表 20 条 | 不分页,可能不加搜索 |
| 列表 5000 条 | 服务端筛选 + 分页 + 禁止全量 |
| 后台数据展示 | 表格,不是卡片 |
| 行内 6 个操作 | 前 2 个 + 「更多」下拉 |
| 列表为空且从没有数据 | Empty + [新建] |
| 列表为空但是筛出来的 | Empty + [清空筛选] |
| 首屏加载 | Skeleton |
| 按钮提交中 | loading + 禁用 |
十一、反面清单
- ❌ 20 个字段的表单塞进 Modal(滚动条里填表)
- ❌ 一个确认弹窗宽 800(内容只有一行字)
- ❌ 用
message展示需要读的详细信息 - ❌ 用
alert()/window.confirm() - ❌ 三种空态都用「暂无数据」
- ❌ 数据 20 条也上分页
- ❌ 后台列表用无限滚动
- ❌ 把表格改成卡片"为了好看"
- ❌ 全屏 loading 遮罩
- ❌ 危险操作没有二次确认
- ❌ 删除按钮放在操作列第一个
- ❌ 每个页面自己设计一套结构(不套骨架)
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

