agentleFS
OugeXOugeX/dsh-web-dev-mode/skills/ui-ux-decision-guide/SKILL.md

ui-ux-decision-guide

Skill0 starsChanged 15 days agoMITView on GitHub

后台系统的 UI/UX 控件选型决策规范。包含弹窗 Modal 与抽屉 Drawer 与新页面的选择判据及尺寸、六种提示形态(message/notification/Alert/Tooltip/Popover/Hint)对照、列表页要不要条件搜索与分页与无限滚动、表格与卡片的选择、操作按钮收纳规则、空态/加载态/错误态三态、表单单列与双列与分步、危险操作确认分级、标准页面骨架。当不确定该做弹窗还是抽屉、提示用哪种、列表要不要搜索分页、按钮放哪、或写新页面需要统一骨架时使用。

The file

Files
SKILL.md

定位:决策表,不是审美

后台系统的交互形态高度收敛——同一类场景应该用同一种控件。 本文给判据和数字,照选。不要每个页面重新设计。


一、弹窗 / 抽屉 / 新页面(最高频的模糊点)

1.1 决策树(按顺序问)

① 是"确认类"操作吗(删除、提交、审批)?
   → 是:Modal(小,宽 420-480)  结束

② 内容是只读查看吗?
   → 是:Drawer(不离开列表,保留上下文)
   → 否:继续

③ 表单字段数?
   ├─ ≤ 7 个        → Modal(宽 600)
   ├─ 8–20 个       → Drawer(宽 640-720)
   └─ > 20 个或分步  → 新页面(路由 + URL)

④ 操作完还要回头看列表吗?
   → 要:Drawer(列表在旁边,关掉就回来)
   → 不要:Modal 或新页面都行

1.2 三种形态的对照

维度Modal 弹窗Drawer 抽屉新页面
宽度420–600480–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
需要用户做决定   → 不是提示,是 Modal

agent 常犯的三个错

错误后果正确
用 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 + 禁用

十一、反面清单

  1. ❌ 20 个字段的表单塞进 Modal(滚动条里填表)
  2. ❌ 一个确认弹窗宽 800(内容只有一行字)
  3. ❌ 用 message 展示需要读的详细信息
  4. ❌ 用 alert() / window.confirm()
  5. ❌ 三种空态都用「暂无数据」
  6. ❌ 数据 20 条也上分页
  7. ❌ 后台列表用无限滚动
  8. ❌ 把表格改成卡片"为了好看"
  9. ❌ 全屏 loading 遮罩
  10. ❌ 危险操作没有二次确认
  11. ❌ 删除按钮放在操作列第一个
  12. ❌ 每个页面自己设计一套结构(不套骨架)

Download now (ZIP)

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
What did you use it for? e.g. Reviewing pull requests in a Rails app

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.