# 移动端「发起审批」列表 · 卡片网格对齐 Web > 日期:2026-08-11 > 范围:`mobile-h5/pages/oa/start/index.vue`(模板列表页) > 视觉 Demo:`mobile-ui/zkxw-mobile-oa-start-cards-demo.html` > 对齐:`web-admin/src/views/oa-approval/start/index.vue` + `OaAppIcon` + `utils/oa-app-icons.ts` > 父设计:`docs/superpowers/specs/2026-08-11-mobile-oa-start-approval-design.md` §6.1 --- ## 1. 背景与目标 ### 1.1 现状 - 小程序列表页已有:搜索、分组 Tab、按分组分段、列表行式卡片(横向全宽:图标 + 文案 + 右侧「发起」)。 - Logo 仅支持图片 URL 或首字文字兜底,**未解析** Web 的 `ep:IconName|#bg` 串,色板与 Web 不一致。 - Web 发起审批为:**分类标题独立一行** + **卡片网格**(`oa-apps__card-row` 换行)+ `OaAppIcon` 彩色底/图标色。 ### 1.2 目标 1. 列表展示改为与 Web 同构的**卡片网格**(手机默认每行 2 张)。 2. **每一类标题独立一行**(分组名 + 红点 +「N 个表单」),其下再排该组卡片。 3. **保留**搜索框下方的分类 Tab(全部 / 各组名)。 4. Logo 的背景色、图标色与 Web `OA_APP_ICON_COLOR_PAIRS` **完全一致**;支持 `ep:…` 与图片 URL。 ### 1.3 非目标 - 不改发起后的 web-view / H5 填写页。 - 不改接口契约(仍用现有 `fetchOaTemplates` + `fetchOaGroupList`)。 - 不把 Web `#10b981` 当作页面主色;页面骨架与「发起」按钮仍用三墙 `#0a9f6d`。 --- ## 2. 已确认决策 | 决策点 | 结论 | |--------|------| | 布局 | 卡片网格,对齐 Demo(2 列) | | 分类标题 | 独立一行,对齐 Web `section-head` | | 顶部分类 Tab | **保留**(搜索下方) | | Logo 色 | 与 Web `OA_APP_ICON_COLOR_PAIRS` 一致 | | 实现路径 | 小程序内解析 `ep:` + 内联 SVG 映射(不依赖 Element Plus) | --- ## 3. 方案说明(推荐) 在 `mobile-h5` 增加轻量工具 `utils/oa-app-icons.js`(色对、解析、默认值从 Web `oa-app-icons.ts` **逐字拷贝色表与规则**),页面用组件或内联块渲染图标: - `ep:Document|#d1fae5` → 32×32、圆角 8、背景 `#d1fae5`、SVG 描边/填充 `#059669` - 非 `ep:` 的 URL → 图片铺满方块(与 Web `kind=image` 一致) - 空值 → 默认 `ep:Document` + 默认绿对 **备选未采用**:整页 web-view 渲染列表(过重);把图标做成独立 H5 CDN(多一次网络与域名配置)。 --- ## 4. UI 结构 页面自上而下: 1. 搜索(占位「请输入审批单名称」) 2. 横向分类 Tab:全部 + `groupOptions` 3. 提示文案「选择一个审批单即可发起」 4. Body:按 `displayGroups` 分段 - **Section head(独占一行)**:`name` · 红点 `#f87171` · 右对齐 `N 个表单` - **Card row**:CSS grid `1fr 1fr`,gap ~10–16rpx - **Card**:上区 icon + name/desc;下区顶部分隔线 + 右对齐「发起」 5. 空态 / 加载态保持现有文案 交互:点卡片或「发起」→ 现有 `onPick` → webview。 数据逻辑:沿用现有 `displayGroups`(搜索 + Tab 过滤 + 按组桶 + 未分组),**不改分组算法**。 --- ## 5. Logo 规范 | 项 | 值 | |----|-----| | 尺寸 | 32×32(对齐 Web `OaAppIcon` sm) | | 圆角 | 8px | | 色对 | 与 Web 锁定 8 组(禁止灰):见 `OA_APP_ICON_COLOR_PAIRS` | | 解析 | `resolveOaAppIcon` / `parseEpIconUrl` 行为对齐 Web | | 图标集 | Web `OA_APP_EP_ICON_NAMES` 子集须覆盖;未知名回退 `Document` | | 页面主色 | 三墙 `#0a9f6d`(按钮/Tab active);**不**用色对覆盖整页主题 | 色对权威源:`web-admin/src/utils/oa-app-icons.ts`。mobile 侧拷贝后若 Web 变更,须同步更新并在 PR 注明。 --- ## 6. 实现文件(预期) | 文件 | 变更 | |------|------| | `mobile-h5/utils/oa-app-icons.js` | 新增:色对、解析、可选 SVG path 映射 | | `mobile-h5/pages/oa/start/index.vue` | 模板改为 section-head + card-row;接图标解析 | | `mobile-ui/zkxw-mobile-oa-start-cards-demo.html` | 已作为视觉冻结参考 | 可选:抽 `components/OaAppIcon.vue`(若页面内联过长再抽)。 --- ## 7. 验收 1. 「全部」下:各组标题各占一行,组内卡片 2 列网格;组间顺序与 Web 一致(按 group 列表,未分组最后)。 2. 切 Tab / 搜索后:仅展示匹配项;仍有标题行 + 网格。 3. `ep:` 模板:背景色、图标色与 Web 同模板一致(同 `iconUrl` 字符串)。 4. 图片型 `iconUrl`:方块内 aspectFill。 5. 点发起仍进入现有 webview 流程。 6. Demo HTML 与真机列表在结构上可目视对照通过。 --- ## 8. 风险 - 小程序内联 SVG:部分图标需用 `rich-text` 或 `image`(base64/svg 文件);优先用 uni-app 支持的方式(可先 `image` + 本地/内联 data URI,或用 `text` 首字仅作临时——**验收要求禁止长期首字兜底替代 ep 色标**)。 - 图标字形与 Element Plus 不完全像素级一致可接受,**色与语义名必须一致**。