# 管理端 UI/UX 深度优化变更总结（apps/admin）

> 目标：深度优化用户操作的 UI/UX（表单、列表、反馈、导航、加载态、错误态、空状态、移动端适配等），
> 保持现有 Ant Design 体系与功能不变，最终通过类型检查、lint 与测试验证。
> 本文件按类别汇总已落地改动与验证记录，供 review 使用。

## 一、错误态（失败不再伪装成"空数据/0 值"，均带重试）

- 工作台 Dashboard：全部接口失败时显示 `QueryErrorState` + 重试（此前静默显示 0 值）。
- 考试详情页：失败显示错误态 + 重试（此前空白页）。
- 机构列表 / 操作日志：失败显示错误态 + 重试（此前弹 toast 后渲染空表）。
- 部分失败反馈：Dashboard 部分接口失败改为页面内可关闭 `Alert`（此前每次切换日期弹 toast）。

## 二、加载态

- 6 个页面骨架屏替代整页 Spin：工作台（统计卡片骨架）、教师工作台、班级详情、考试详情、宿舍可视化、AI 配置。
- 学生表展开行（多班型对比）加载中显示 Spin + 提示，不再空白。
- 班级花名册导出按钮 loading（try/finally）。

## 三、空状态

- 复用统一 `QueryEmpty`（描述 + 主操作按钮引导）：学生/宿舍/押金/账单/教室/教师/钱包/机构等列表页已覆盖。

## 四、表单

- 新增 `useSubmitShortcut`：Cmd/Ctrl+Enter 提交，覆盖 12+ 弹窗（学生、宿舍/床位/柜子、押金×4、费用×3、教室、租赁、班级添加学员/教师）。
- 15 个表单统一 `scrollToFirstError`：校验失败自动滚动到首个错误字段。
- 防重复提交：考勤时段配置、班级添加学员/教师补齐 `confirmLoading`（其余弹窗已具备）。

## 五、列表

- 表格横向滚动：10+ 个缺失 `scroll.x` 的表格补齐（学生资料 4 Tab、考勤明细、考勤机、钱包、宿舍抽屉、教师工作台、押金弹窗等）。
- 移动端操作列固定：学生/宿舍/押金/账单/教室/教师/钱包 7 个主列表操作列 `fixed: 'right'`。
- 手动刷新入口：新增 `RefreshButton`，接入 8 个列表页（学生/宿舍/押金/教室/账单/教师/机构；钱包原有）。
- 分页/跨页勾选/已选提示均已具备，未改动。

## 六、反馈

- 通知铃铛：全部已读失败给出错误提示；无未读时按钮置灰；铃铛改为可聚焦按钮 + `aria-label`。
- 统一消息桥（App context）已具备；导出/删除/保存反馈已具备。

## 七、导航

- 新增 `ScrollToTop`：路由切换后滚动复位到顶部。
- 新增全局 `BackTop`：长列表滚动超过 400px 后浮现"回到顶部"按钮（尊重 reduced-motion）。
- 登录页用户名自动聚焦。
- 路由标签（RouteDock）窄屏压缩尺寸，避免横向裁切。

## 八、移动端适配

- 表格横向滚动 + 操作列固定（见"列表"）。
- `Descriptions` 响应式列数：班级详情、账单详情×2、学生档案、集成配置（此前固定列数在窄屏过挤）。
- 内容区 padding 已按 breakpoint 响应式（MainLayout 原有）。

## 九、无障碍与质感（全局 CSS）

- `:focus-visible` 品牌蓝焦点环（键盘导航可见）。
- `@media (prefers-reduced-motion: reduce)` 关闭动画/平滑滚动。
- `::selection` 品牌色；WebKit 细滚动条；`html` 平滑滚动。

## 新增文件

- `components/RefreshButton.tsx`、`components/ScrollToTop.tsx`、`components/BackTop.tsx`
- `hooks/useSubmitShortcut.ts`
- `components/ux.integration.test.tsx`（5 个浏览器用例：RefreshButton / useSubmitShortcut 激活与未激活 / ScrollToTop / BackTop）

## 验证记录

| 检查 | 结果 |
| --- | --- |
| typecheck（admin + server） | ✅ |
| lint（oxlint + eslint） | ✅ 0 warning / 0 error |
| admin vitest（浏览器） | ✅ 31 文件 / 166 用例 |
| server jest | ✅ 191 用例 |
| aislop scan --changes | ✅ 100/100 |

## 未做/后续（可选）

- 运行时视觉走查：需要 MySQL + 后端 + 前端环境（当前本地未运行），用于最终逐页截图核对。
- AI 助手抽屉：已具备响应式/空态/取消/技能锁定，`submit` 已有请求中防护，未做额外改动。
