Files
his/MD/specs/UI_DESIGN_IRON_RULES.md
华佗 db5fb88627 docs(specs): 添加UI设计铁律法则 - 十大设计法则+医疗HIS专项规范
- 新增 MD/specs/UI_DESIGN_IRON_RULES.md (404行)
  - 十大UI设计铁律法则: 希克/费茨/米勒/雅各布/格式塔/多赫蒂/尼尔森/泰斯勒/峰终/冯雷斯托夫
  - HIS医疗系统专项UI规范: 色彩体系/间距系统/字体/表格/表单/弹窗/交互反馈
  - 医疗特殊交互: 危急值/医嘱/处方/费用/电子签名/打印
  - 设计文档必备模板: UI布局+交互清单+调用流程+状态流转+异常处理
  - 违反检查清单

- 更新铁律体系
  - RULES.md: 新增铁律14 - 设计文档必须包含UI设计和调用流程
  - MD/specs/IRON_RULES.md: 新增铁律#9详细说明
  - MD/specs/FRONTEND_DEVELOPMENT_STANDARD.md: 新增UI设计法则速查表

- 同步7个AI工具配置: AGENTS.md/.cursorrules/.copilot/.windsurf/.cline/.qwen/.aider
2026-06-06 11:12:02 +08:00

405 lines
17 KiB
Markdown
Raw 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.

# HealthLink-HIS UI 设计铁律
> **文档类型**: 设计规范
> **适用范围**: 全项目前端UI设计与交互
> **版本**: v1.0
> **编制日期**: 2026-06-06
> **最后更新**: 2026-06-06
---
## 一、总则
> **设计文档必须写清楚前端页面UI布局、交互效果、前后端调用流程。**
> 没有明确UI设计的模块禁止直接编码。
### 设计文档必备要素
每个新模块/页面的设计文档必须包含:
| # | 要素 | 说明 |
|---|------|------|
| 1 | **页面线框图/布局描述** | 每个区域放什么组件、尺寸比例、栅格布局 |
| 2 | **交互效果清单** | 每个按钮/操作触发什么效果(弹窗、抽屉、跳转、动画) |
| 3 | **前后端调用流程** | 每个用户操作 → 对应API → 参数 → 返回数据 → 前端渲染 |
| 4 | **状态流转图** | 数据状态变化 → UI如何响应 |
| 5 | **异常/边界处理** | 空数据、加载中、错误状态的UI表现 |
| 6 | **响应式断点** | 不同屏幕尺寸下的布局适配方案 |
---
## 二、十大UI设计铁律法则
> 以下法则源自认知心理学、人机交互学、HCI经典理论。
> 医疗HIS系统因涉及生命安全**全部铁律等级提升为P0**。
### 法则1: 希克定律 (Hick's Law) — 选择越少越好
> **决策时间 = a + b × log₂(选项数量)**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 菜单层级 | 一级菜单 ≤ 7项二级菜单 ≤ 9项 | 医生工作站左侧导航 |
| 表单字段 | 单页表单 ≤ 12个字段超出用分步表单 | 患者登记、医嘱录入 |
| 按钮组 | 主要操作按钮 ≤ 3个/区域 | 处方页面:保存/提交/打印 |
| 弹窗选项 | 弹窗内选项 ≤ 5个 | 确认对话框不超过3个按钮 |
**违反案例**: 某页面一次展示20个筛选条件 → 医生找不到关键字段
**正确做法**: 默认显示5个常用条件"更多筛选"展开高级选项
### 法则2: 费茨定律 (Fitts's Law) — 目标要大要近
> **移动时间 = a + b × log₂(距离/尺寸 + 1)**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 可点击区域 | 最小 44×44px移动端 48×48px | 移动护理PDA场景 |
| 主要操作 | 放在用户视线自然落点(右下/顶部) | 保存按钮固定在表单右下 |
| 危险操作 | 与安全操作保持物理距离 ≥ 100px | 删除按钮远离保存按钮 |
| 快捷入口 | 高频操作提供快捷键/快捷入口 | F2=保存, F3=打印 |
**违反案例**: "确认发药"和"取消发药"按钮紧挨着 → 误点
**正确做法**: 确认按钮绿色大按钮,取消按钮灰色小按钮,间距 ≥ 80px
### 法则3: 米勒定律 (Miller's Law) — 记忆负荷 ≤ 7±2
> **短时记忆容量7 ± 2 个信息块**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 信息分组 | 每组 ≤ 7个条目 | 检验报告分组显示 |
| 导航层级 | 总层级 ≤ 4层 | 菜单→子菜单→功能→详情 |
| 表格列数 | 默认显示 ≤ 8列其余可配置 | 处方列表核心列8个 |
| 标签页 | Tab标签 ≤ 6个超出用下拉 | 患者详情Tab |
**违反案例**: 患者信息页一次展示30个字段 → 医生记不住哪个要改
**正确做法**: 按"基本信息/病史/过敏/诊断"分组,每组 ≤ 7个字段
### 法则4: 雅各布定律 (Jakob's Law) — 用户要的是熟悉感
> **用户把时间花在别的系统上,期望你的系统有一样的操作方式**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 布局模式 | 遵循医疗软件行业惯例 | 左导航+顶部栏+内容区 |
| 表格操作 | 行末操作按钮(编辑/删除/查看) | 与主流HIS系统一致 |
| 搜索模式 | 顶部搜索栏+筛选条件+表格 | 通用管理后台模式 |
| CRUD流程 | 列表→新增弹窗→编辑弹窗→详情抽屉 | 标准若依模式 |
**违反案例**: 新模块把"新增"放在表格底部 → 用户习惯在顶部找
**正确做法**: "新增"按钮统一在表格上方左侧
### 法则5: 格式塔原则 (Gestalt Principles) — 分组要明确
| 子原则 | 规则 | HIS场景 |
|--------|------|---------|
| **接近性** | 相关元素间距 < 不相关元素间距 | 表单label与input间距8px字段组间距24px |
| **相似性** | 同类操作用相同颜色/形状 | 所有"保存"用蓝色所有"删除"用红色 |
| **连续性** | 视觉引导线引导阅读流 | 表单从上到下从左到右 |
| **封闭性** | 卡片/分组用边框或背景色区分 | 患者信息分区用卡片包裹 |
| **图底关系** | 内容层 > 背景层,弹窗要有遮罩 | Dialog背景半透明遮罩 |
**违反案例**: 表单字段间距不一致 → 视觉混乱
**正确做法**: 统一间距系统8/12/16/24/32px
### 法则6: 多赫蒂阈值 (Doherty Threshold) — 响应要快
> **系统响应 < 400ms 时用户生产力提升4倍**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 接口响应 | 核心接口 ≤ 200ms普通 ≤ 500ms | 挂号、查询必须 ≤ 200ms |
| 加载反馈 | 等待 > 200ms 显示loading | el-table加载用v-loading |
| 操作反馈 | 点击后 ≤ 100ms 有视觉响应 | 按钮点击立即变灰防重复提交 |
| 列表分页 | 默认20条/页,禁止一次加载全部 | 处方列表分页 |
| 骨架屏 | 首屏加载用Skeleton占位 | 患者列表页骨架屏 |
**违反案例**: 查询接口3秒无响应 → 用户反复点击
**正确做法**: 200ms内显示loading超时5s提示"查询超时"
### 法则7: 尼尔森十大可用性原则 (Nielsen's 10 Heuristics)
| # | 原则 | HIS应用规则 |
|---|------|------------|
| 1 | **系统状态可见** | 每个操作后显示结果:保存成功✓、提交成功✓、审批中⏳ |
| 2 | **贴近真实世界** | 使用医疗术语挂号、处方、医嘱不用技术术语CRUD、API |
| 3 | **用户控制与自由** | 每个操作可撤销:提交可撤回、删除有确认、编辑可取消 |
| 4 | **一致性和标准** | 全系统统一:按钮颜色、弹窗样式、表格样式、表单校验 |
| 5 | **防错优先** | 危险操作二次确认;必填字段标红*;格式校验实时提示 |
| 6 | **识别而非记忆** | 下拉选择 > 手动输入;最近使用列表;搜索联想 |
| 7 | **灵活高效** | 快捷键;批量操作;常用模板;收藏功能 |
| 8 | **简洁美观** | 去掉无关信息;留白适度;视觉层次清晰 |
| 9 | **容错帮助** | 错误信息说人话:"身份证号格式错误"而非"Invalid input" |
| 10 | **帮助文档** | 复杂功能提供操作引导Help Tooltip |
**违反案例**: 删除后无提示 → 用户不确定是否成功
**正确做法**: 删除后 `ElMessage.success('删除成功')` 并刷新列表
### 法则8: 泰斯勒定律 (Tesler's Law) — 复杂性守恒
> **每个系统都有不可消除的复杂性,必须 somewhere 被处理**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 简单前端复杂后端 | 用户操作尽量简单,复杂逻辑放后端 | 医保结算:用户点"结算",后端算所有费用 |
| 智能默认值 | 80%场景用默认值,减少用户输入 | 科室默认当前科室,药品默认常用规格 |
| 渐进式披露 | 先展示核心信息,高级选项折叠 | 医嘱默认常用,"更多选项"展开完整 |
| 自动化 | 能自动填充的不手动输入 | 选择患者自动填充病历号、性别、年龄 |
**违反案例**: 开医嘱要手动输入药品剂量、频次、途径 → 复杂
**正确做法**: 提供"常用医嘱模板",一键套用,仅需微调
### 法则9: 峰终定律 (Peak-End Rule) — 关键时刻要做好
> **用户记住的是体验的峰值和结束时刻**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 操作峰值 | 关键操作给正向反馈 | 挂号成功→大✓动画+患者信息卡 |
| 结束体验 | 流程结束给明确结果 | 收费完成→打印凭条+成功提示 |
| 错误峰值 | 错误也要优雅处理 | 校验失败→精确定位错误字段+红色高亮 |
| 批量操作 | 批量完成后给统计 | "成功导入58条失败2条" |
**违反案例**: 批量导入完成后无提示 → 用户不知道是否成功
**正确做法**: 弹出结果面板:"✓ 成功58条 / ✗ 失败2条点击查看"
### 法则10: 冯·雷斯托夫效应 (Von Restorff Effect) — 隔离记忆
> **在相似事物中,与众不同的那个更容易被记住**
| 维度 | 规则 | HIS场景 |
|------|------|---------|
| 紧急标记 | 危急值用红色醒目样式 | 危急值报告→红色闪烁标签 |
| 当前选中 | 选中项明显高亮 | 菜单选中项蓝色背景+左侧条 |
| 重要操作 | 主要按钮用强调色 | "提交处方"蓝色实心,"取消"灰色描边 |
| 通知徽标 | 未读消息用Badge | 右上角铃铛红点+数字 |
**违反案例**: 危急值和普通信息用同一颜色 → 医生忽略
**正确做法**: 危急值红色脉冲动画 + 声音提醒
---
## 三、HIS医疗系统专项UI规范
### 3.1 色彩体系
| 用途 | 颜色 | HEX | 说明 |
|------|------|-----|------|
| 主色 | 医疗蓝 | #1890ff | 品牌色、主要按钮 |
| 成功 | 安全绿 | #52c41a | 操作成功、正常状态 |
| 警告 | 警示橙 | #faad14 | 注意、待处理 |
| 危险 | 危急红 | #ff4d4f | 危急值、删除、错误 |
| 信息 | 信息灰 | #909399 | 辅助信息、次要文本 |
| 背景 | 浅灰 | #f5f7fa | 页面背景 |
| 卡片 | 白色 | #ffffff | 卡片/弹窗背景 |
**状态色标准**:
```
待诊 → #909399(灰) 已诊 → #1890ff(蓝)
已收费 → #52c41a(绿) 已发药 → #722ed1(紫)
危急 → #ff4d4f(红脉冲) 已完成 → #b7eb8f(浅绿)
```
### 3.2 间距系统 (8px基准)
| Token | 值 | 用途 |
|-------|-----|------|
| xs | 4px | 图标与文字间距 |
| sm | 8px | 表单项内间距、紧凑行距 |
| md | 12px | 表单项之间间距 |
| lg | 16px | 卡片内边距、区块间距 |
| xl | 24px | 区域分隔 |
| xxl | 32px | 页面级边距 |
### 3.3 字体规范
| 场景 | 字号 | 字重 | 说明 |
|------|------|------|------|
| 页面标题 | 20px | 600 | h1 |
| 区块标题 | 16px | 600 | h2 |
| 正文 | 14px | 400 | 默认 |
| 辅助文字 | 12px | 400 | 说明、提示 |
| 数据突出 | 24px | 700 | 统计数字、金额 |
| 危急值 | 16px | 700 | 红色加粗 |
### 3.4 表格设计规范
| 规则 | 说明 |
|------|------|
| 列数 | 默认 ≤ 8列超出用横向滚动或配置列 |
| 行高 | 48px紧凑40px宽松56px |
| 操作列 | 固定右侧,宽度 ≥ 160px |
| 排序 | 默认按时间倒序,支持点击列头排序 |
| 分页 | 20条/页可切换10/20/50/100 |
| 空状态 | 无数据时显示空状态插画+文字"暂无数据" |
| 加载 | v-loading指令骨架屏或旋转图标 |
| 斑马纹 | 奇偶行交替背景色 #fafafa |
### 3.5 表单设计规范
| 规则 | 说明 |
|------|------|
| 布局 | 简单表单用inline复杂用labelWidth=120px |
| 必填标记 | 红色 * 号在label前 |
| 校验时机 | blur时校验非实时提交时全量校验 |
| 错误提示 | 字段下方红色文字,与字段左对齐 |
| 按钮位置 | 表单底部右侧,主按钮在右 |
| 禁用态 | 禁用字段灰底+灰字+禁止光标 |
| 加载态 | 提交按钮loading态防重复提交 |
### 3.6 弹窗/抽屉规范
| 类型 | 适用场景 | 规则 |
|------|---------|------|
| Dialog | 简单表单≤6字段 | 宽度400-600px标题+内容+底部按钮 |
| Drawer | 复杂表单/详情查看 | 宽度60%,右侧滑入,含关闭按钮 |
| Modal | 确认操作 | 标题+内容+确认/取消,危险操作红色确认 |
| Fullscreen | 大表单/复杂编辑 | 全屏,顶栏标题+关闭,底部操作栏 |
### 3.7 交互反馈规范
| 操作 | 反馈方式 | 示例 |
|------|---------|------|
| 保存成功 | ElMessage.success | "保存成功" |
| 保存失败 | ElMessage.error | "保存失败XXX原因" |
| 删除确认 | ElMessageBox.confirm | "确定要删除该记录吗?" |
| 表单校验 | 字段下方红色文字 | "请输入患者姓名" |
| 加载中 | v-loading | 旋转图标覆盖表格 |
| 空数据 | 空状态组件 | 插画+"暂无挂号记录" |
| 网络错误 | ElMessage.error | "网络异常,请重试" |
| 无权限 | ElMessage.warning | "您没有该操作权限" |
### 3.8 医疗HIS特殊交互
| 场景 | 交互要求 |
|------|---------|
| **危急值** | 红色脉冲动画 + 弹窗强制确认 + 声音提醒 + 操作记录 |
| **医嘱审核** | 双人审核弹窗,审核人签章,不可撤销提示 |
| **处方开具** | 药品搜索联想 + 剂量自动计算 + 相互作用预警弹窗 |
| **费用结算** | 费用明细折叠/展开 + 医保/自费分类 + 打印预览 |
| **患者搜索** | 模糊搜索+拼音首字母+身份证号+病历号 多维度 |
| **电子签名** | 手写板签名+密码验证 双重认证 |
| **打印功能** | 套打对齐微调 + 批量打印 + 预览 |
| **权限控制** | 按钮级权限 v-hasPermi + 数据权限过滤 |
---
## 四、设计文档模板
> 每个新模块必须按此模板编写设计文档
```markdown
# 模块名 设计文档
## 1. 页面列表
| 页面 | 路由 | 类型 | 说明 |
|------|------|------|------|
| 列表页 | /module/list | 管理页 | ... |
| 新增弹窗 | - | Dialog | ... |
## 2. 页面布局设计
### 2.1 列表页
```
┌─────────────────────────────────┐
│ 搜索区 [关键词] [筛选] [搜索] │
├─────────────────────────────────┤
│ 操作区 [+新增] [导出] [批量删除] │
├─────────────────────────────────┤
│ 数据表格 (el-table) │
│ 列1 | 列2 | 列3 | ... | 操作 │
├─────────────────────────────────┤
│ 分页 [1] [2] [3] ... │
└─────────────────────────────────┘
```
## 3. 交互效果清单
| 操作 | 触发方式 | 效果 | 反馈 |
|------|---------|------|------|
| 点击"新增" | 按钮click | 打开Dialog | - |
| 点击"保存" | 按钮click | 提交API→关闭Dialog→刷新列表 | success消息 |
| 点击"删除" | 按钮click | 二次确认弹窗→调用API→刷新 | success消息 |
| 表单校验 | blur/submit | 字段下方提示 | error文字 |
## 4. 前后端调用流程
### 4.1 查询列表
```
用户操作: 页面加载/点击搜索
→ 前端: GET /api/v1/module/list?pageNum=1&pageSize=20&keyword=xxx
→ 后端: Controller.list() → AppService.query() → Service.page()
→ 返回: {code:200, data:{rows:[...], total:100}}
→ 前端: el-table渲染 rowspagination渲染 total
```
### 4.2 新增记录
```
用户操作: 点击"新增"→填写表单→点击"保存"
→ 前端: POST /api/v1/module {field1, field2, ...}
→ 后端: Controller.add() → AppService.create() → Service.save()
→ 返回: {code:200, msg:"操作成功"}
→ 前端: ElMessage.success → 关闭Dialog → getList()
```
## 5. 状态流转
| 状态 | 值 | 下一状态 | 触发条件 |
|------|-----|---------|---------|
| 草稿 | 0 | 已提交 | 用户点击提交 |
| 已提交 | 1 | 已审核 | 审核人点击审核 |
## 6. 异常处理
| 场景 | UI表现 |
|------|--------|
| 网络断开 | ElMessage.error("网络异常") |
| 数据为空 | 空状态插画+"暂无数据" |
| 权限不足 | 按钮隐藏/v-if控制 |
| 加载中 | v-loading覆盖 |
```
---
## 五、违反检查清单
> 代码审查时对照此清单逐项检查
```
□ 页面布局是否遵循左导航+顶部栏+内容区?
□ 每页功能按钮是否 ≤ 3个主要操作
□ 表单字段是否 ≤ 12个超出是否分步/折叠?
□ 可点击区域是否 ≥ 44px
□ 危险操作是否与安全操作保持距离?
□ 加载等待是否显示loading
□ 操作成功/失败是否有明确反馈?
□ 删除操作是否有二次确认?
□ 表格是否分页是否默认20条
□ 空数据是否有空状态提示?
□ 色彩是否符合色彩体系?
□ 间距是否使用8px基准系统
□ 字体是否符合字体规范?
□ 弹窗类型选择是否合理?
□ 表单校验是否blur触发
□ 医疗特殊交互(危急值/医嘱等)是否按规范实现?
□ 设计文档是否包含UI布局+交互清单+调用流程?
```
---
## 六、参考文献
| 来源 | 内容 |
|------|------|
| Hick (1952) | Hick's Law — 选择反应时间 |
| Fitts (1954) | Fitts's Law — 运动时间与目标尺寸 |
| Miller (1956) | Miller's Law — 7±2信息块 |
| Jakob Nielsen | 10 Usability Heuristics |
| Gestalt Psychology | 接近性/相似性/连续性/封闭性/图底 |
| Doherty & Thadhani (1982) | 400ms响应阈值 |
| Larry Tesler | 复杂性守恒定律 |
| Kahneman | 峰终定律 |
| Hedwig von Restorff | 隔离效应 |
| ISO 9241-210 | 以人为中心的交互系统设计 |
| GB/T 33758-2017 | 人机交互系统人机界面设计原则 |
| WS/T 500-2017 | 电子病历共享文档规范 |
---
> ⚠️ 本文件是UI设计铁律的唯一信源。所有前端模块设计文档必须遵守本规范。