# FastapiAdmin 前端 UX/UI 审计报告(Web + 移动端) - 审计轮次:摸底审计第 1 轮(**只读,未修改任何仓库文件**,本报告为唯一新增文件) - 审计对象:`frontend/web`(Vue3 + Vite + TS + Element Plus 2.14.3 + Tailwind v4 + Pinia)、`frontend/app`(uni-app + wot-ui + UnoCSS presetWot)、`frontend/docs`(VitePress) - 需求基准:`REQUIREMENTS.md` - 审计方式:静态代码证据(grep / AST 级脚本统计 / 依赖包类型定义核对 / 后端模型注释交叉验证) - 未执行:未启动 dev server、未安装依赖、未截图、未上真机。所有需运行期或设备才能确认的项均归入第 8 节「需人工/真机验证清单」,**不计为缺陷**。 --- ## 1. 结论摘要 | 维度 | Web | 移动端 | 结论 | |---|---|---|---| | 状态设计完整性 | 加载/骨架/空态/二次确认**齐全**;**错误态与重试入口系统性缺失** | 骨架/空态/下拉刷新/二次确认齐全;错误态缺失,且失败被误渲染为「不存在」 | 两端共同短板是**错误态** | | 交互一致性 | 分页+搜索+批量+导入导出 | 触底加载+搜索+筛选 Tab,无批量/导出 | 差异多为平台合理差异,但**确认机制与状态色语义**真不一致 | | 可访问性 | 76 处可点击元素无键盘可达性;表单无 label;图标按钮无替代文本 | 0 个 aria 属性(原生端可访问性依赖系统 TalkBack/VoiceOver) | Web 侧问题可静态证明 | | 设计体系一致性 | **236 处硬编码色值散落在 50 个业务文件**,绕过动态主题令牌 | 81 处 / 11 文件(其中 44 处集中在 3 个登录类页面);共享组件基本走令牌 | Web 偏离显著重于移动端 | | 文案与术语一致性 | **101 个 views 文件中 85 个完全不含 i18n**;1063 处硬编码中文 | 14 个页面 **100% 走 i18n** | 两端 i18n 纪律差距最大 | **最高优先级 4 项(P1)**:P1-1 通知状态枚举两端语义冲突、P1-2 Web i18n 近乎未落地、P1-3 列表页无错误态/重试、P1-4 移动端把接口失败渲染成「不存在」。 **先要说清的口径修正**:任务背景描述「Web 端 … + uno.config.ts」与事实不符。`uno.config.ts` 只存在于 `frontend/app/uno.config.ts`(UnoCSS + `@wot-ui/unocss-preset`);Web 端使用的是 **Tailwind v4**(`frontend/web/src/styles/tailwind.css` 的 `@theme` 块,`package.json` 依赖 `@tailwindcss/vite` + `tailwindcss@^4.3.0`,无 unocss 依赖)。因此「设计令牌」在两端是**两套独立体系**,Web 侧令牌载体是 `@theme` + `:root`/`.dark` CSS 变量,移动端是 `presetWot` + `theme.json` + `uni.scss`。 --- ## 2. 可验证问题清单 级别定义:**P1 高**(用户可见的错误信息 / 无法完成的交互 / 数据语义错误);**P2 中**(一致性或可访问性缺陷,影响部分用户或造成理解成本);**P3 低**(维护性与体验打磨)。 ### 2.1 P1 — 高 #### P1-1 通知公告 `status` 枚举在 Web 端与后端/移动端语义冲突(数据被错误呈现) - **现象**:同一后端字段 `status`,三处定义不一致: | 来源 | 取值语义 | 证据 | |---|---|---| | 后端模型(权威) | `0:草稿 1:已发布 2:已归档` | `backend/app/modules/system/notice/model.py:16` | | 移动端 | `0:草稿 1:已发布 2:已归档` | `frontend/app/src/subPages/module_system/notices/index.vue:25-27`、`:31` | | **Web** | `0:启用 1:停用`(**缺 2**) | `frontend/web/src/views/module_system/notice/index.vue:188-191`、`:254`、`:403-404` | - **影响**: 1. 状态为 `2`(已归档)的公告,在 Web 列表里落到 `resolveTagText` 的兜底分支,渲染为**灰色标签 + 原始数字「2」**(`frontend/web/src/components/display/fa-descriptions/index.vue:64-72`);搜索栏的「状态」下拉也只有 0/1 两项(`:226`),**无法筛选已归档公告**。 2. 状态 `0/1` 的语义在 Web 被标成「启用/停用」而非「草稿/已发布」,审核流程判断会被误导。 - **建议**:以 `backend/app/modules/system/notice/model.py` 的注释为单一真值,Web 端 `STATUS_OPTIONS`/列 map/详情 map(`:188-191`、`:254`、`:403-404`)补 `2:已归档` 并改为 `0:草稿 1:已发布 2:已归档`;两端共用一份枚举常量。**这是本轮唯一发现的数据语义级错误,建议优先核对是否已有线上影响。** #### P1-2 Web 端 i18n 近乎未落地(切英文后业务界面仍为中文) - **现象**: - `frontend/web/src/views/**/*.vue` 共 **101** 个文件,其中 **85 个(84%)完全不含 `$t(` / `useI18n`**。 - `