# 小程序端 UI 规范(山峡化工) > **适用范围**:`miniprogram`(客户端 / 供应商端 / 配送员端)及工作台 WebView 业务 H5(`web-admin` `/m/**`) > **现行视觉权威**:本文各节;工作台 WebView 列表卡与确认弹窗分别见 §12.3、§12.6。 > **参考实现**:`web-admin/src/views/m/crm/customer/index.vue`、`web-admin/src/views/m/crm/product/index.vue`;确认弹窗见 `web-admin/src/utils/mp-crm-confirm.ts`。 > **附件宫格参考**:`miniprogram/pages/bx/invoice/mine.vue`(我的发票夹)。 > **历史来源**:早期 `mobile-ui/`、`bak/mobile-ui/` HTML 原型不在当前仓库中,不再作为必读或验收依据;其有效布局、Token 和 class 映射规则保留在本文。旧 expense-card 仅适用 §12.3.1 的过渡范围。 --- ## 目录 1. 设计目标与适配范围 2. 设计 Token(颜色 / 字体 / 间距 / 圆角) 3. 三端统一视觉骨架 4. 客户端页面规范 5. 供应商端页面规范 6. 配送员端页面规范 7. 组件规范(分类、卡片、结算条、状态标签、菜单宫格) 8. 交互与可用性规范 9. 页面改造检查清单 10. 约束与落地策略 11. 从 Demo 到 uni-app 的 class 映射建议 12. 工作台 WebView 业务页(CRM / 危化品证等) --- ## 1. 设计目标与适配范围 - 目标:在不改变业务流程的前提下,提升小程序三端的视觉一致性、操作效率和信息可读性。 - 原则: - 同品牌:统一绿色与大麦黄品牌感。 - 同骨架:标题区、统计区、功能区、任务/列表区的结构节奏一致。 - 角色可分:允许角色页面在信息密度和状态强调上有差异,但不打破整体系统。 - 设备宽度:以 `375px` 为主基线,兼容 `414px`。 --- ## 2. 设计 Token(颜色 / 字体 / 间距 / 圆角) ### 2.1 颜色 ```scss // 品牌主色 $brand-green: #0a9f6d; $brand-green-dark: #087f57; $brand-green-soft: #e9f9f2; // 品牌辅助 $barley-yellow: #d6a343; $barley-yellow-soft: #fff7e8; // 中性色 $bg-page: #f5f8f7; $surface: #ffffff; $text-primary: #1f2a26; $text-muted: #6b7b74; $border: #dcebe4; // 语义色 $danger: #d14343; $warning: #cf8a19; $success: #189b65; ``` ### 2.2 字体与字号 - 字体:`-apple-system, BlinkMacSystemFont, "PingFang SC", sans-serif` - 标题:`18px / 20px` - 正文:`13px / 14px` - 辅助:`11px / 12px` - 数字金额:`16px / 20px`,建议半粗体以上(600/700) ### 2.3 间距与圆角 - 间距节奏:`8 / 10 / 12 / 14 / 16` - 卡片圆角:`12px / 14px / 16px` - 大容器圆角:`18px / 22px` - 胶囊按钮:`14px / 17px / 20px` --- ## 3. 三端统一视觉骨架 ### 3.1 页面结构 - 顶部 Header(渐变品牌区) - 统计或关键提示区(可选) - 功能入口区(宫格) - 主业务区(商品/任务/订单列表) - 底部固定区(仅客户端:首页结算条 + TabBar) ### 3.2 Header 统一规则 - 渐变:绿色系 `linear-gradient(145deg, $brand-green-dark, $brand-green)` - 标题左对齐,退出/操作按钮右对齐 - 下缘采用较大圆角(20~24px)形成模块感 #### 自定义导航与微信胶囊(SHALL) - 使用 `navigationStyle: custom` 的页面,业务顶栏 SHALL 避开状态栏与右上角胶囊。 - 量纲 SHALL 来自 `statusBarHeight` 与 `getMenuButtonBoundingClientRect`(见 `utils/safeArea.js`)。 - CSS 变量:`--sq-safe-top`、`--sq-nav-height`、`--sq-header-height`、`--sq-capsule-right-safe`;微信端 SHALL 通过顶栏根节点内联 style 注入,不得仅依赖 H5 `document`。 - 白底顶栏:总高 `--sq-header-height`,内容行高 `--sq-nav-height`,右侧列预留 `--sq-capsule-right-safe`,该列 SHALL NOT 放置可点击业务按钮。 - 渐变大头:`padding-top` 含 `--sq-safe-top`,`padding-right` 含 `--sq-capsule-right-safe`。 ### 3.3 卡片与容器 - 默认白底 + 浅边框(`$border`) - 阴影轻量,避免厚重 - 卡片内部信息按“标题 -> 次级说明 -> 操作”组织 --- ## 4. 客户端页面规范 ### 4.1 首页 - 顶部:地址 + 搜索框 - 分类区: - 一级分类为“两行五列(每页 10 个)” - 多页横向滑动,页数对应滑块数量 - 滑块支持点击翻页 - 二级分类:左侧竖向列表 + 右侧商品区 - 商品卡:图、名称、规格、价格、加购按钮 - 底部结算条:数量、总价、去结算主按钮 ### 4.2 购物车 - 供应站分组展示 - 商品行含规格、价格、加减数量器 - 结算区固定在底部,主按钮突出 ### 4.3 订单 - 顶部状态筛选(全部/待支付/待配送/配送中/已完成) - 订单卡片显示:订单号、状态、时间、配送节点、金额 - 操作按钮按主次分层(主按钮优先关键操作) ### 4.4 个人中心 - 头部用户信息 + 统计 - 常用功能列表(地址/发票/结算/退款/客服) - 优惠券与退出登录操作置于可快速触达区域 --- ## 5. 供应商端页面规范 - 结构:工作台头部 -> 统计 -> 常用功能 -> 备货任务列表 - 常用功能采用 4 列宫格,标签简短直观 - 任务卡展示关键信息: - 任务号 - 状态标签(待备货 / 备货中) - 配送员与截止时间 - 商品缩略信息 - 件数与金额、主操作按钮 --- ## 6. 配送员端页面规范 - 与供应商端保持同风格、同配色、同布局节奏 - 功能菜单放在任务列表上方(与供应商端摆放逻辑一致) - 任务区域需突出: - 取货信息 - 配送信息 - 联系动作 - 件数和主操作按钮(如“导航并取货”) --- ## 7. 组件规范 ### 7.0 商品图片与多媒体规范(强约束) > 目的:统一三端商品图片展示口径,避免运营上传图片后在不同页面“变形/撑高/被截断”。 #### 7.0.1 商品主图(列表缩略图) - **推荐比例**:`1:1`(正方形) - **推荐尺寸**:`800×800` ~ `2000×2000` 像素(JPG/PNG/WebP) - **小程序展示规则**: - 列表/购物车/订单/任务里的商品缩略图容器为固定方图 - 图片采用 **居中裁切填充**(`aspectFill`):非 1:1 的图片会被裁切到方形,主体请尽量居中 #### 7.0.2 商品轮播图(详情页顶部 Banner) - **推荐比例**:`4:3` - **推荐尺寸**:宽度约 `750px`(例如 `750×562`) - **小程序展示规则**: - 详情页顶部轮播区域按 **4:3** 容器展示 - 图片采用 **居中裁切填充**(`aspectFill`):非 4:3 的图片会被裁切,主体请尽量居中 #### 7.0.3 商品详情媒体(详情图/视频列表) - **图片比例**:不强制比例(建议宽度约 `750px`) - **小程序展示规则(图片)**: - 采用 **宽度自适应高度**(`widthFix`):图片按屏幕宽度铺满,高度随原图等比变化 - 建议避免在图片最顶部/最底部放置关键小字,留出适当上下留白以适配不同机型 - **小程序展示规则(视频)**: - 建议 `720p` 以内,并尽量缩短时长以利加载 ### 7.1 分类卡片(客户端首页) - 每页 2 行 * 5 列 - 卡片允许“无背景/无边框”简洁样式,但激活态需可辨识 - 图标/图片占位应较大(提高扫读效率) ### 7.2 分类分页滑块 - 有几页就有几个滑块 - 当前页滑块高亮 - 可点击切换页,并与滑动同步 ### 7.3 状态标签 - `warning`:待处理(琥珀) - `success`:进行中/完成(绿色系) - `danger`:异常/风险(红色) - 避免同屏过多高饱和颜色 ### 7.4 底部结算条(客户端) - 信息结构:数量 -> 总价 -> 主按钮 - 主按钮保持最高视觉优先级 - 结算条整体与页面保持品牌一致(浅色底或深色底二选一,保持统一) ### 7.5 功能宫格 - 推荐 3 或 4 列 - 图标尺寸、文字字号、卡片高度统一 - 文案优先“动词 + 对象”(如:查看任务、我的报价) --- ## 8. 交互与可用性规范 - 触达尺寸:可点击元素不小于 `44x44` - 点击反馈:按钮/卡片需有明确反馈(颜色/阴影/位移之一) - 滑动冲突:一级分类横滑区域不要与主内容纵向滚动冲突 - 信息层级:同一块内容避免超过 2 个主视觉焦点 - 文本策略:长文本省略 + 关键字段完整可见(订单号、金额、状态) --- ## 9. 页面改造检查清单 - [ ] 是否遵循本规范 Token(颜色/间距/圆角/字号) - [ ] 三端是否保持同品牌风格和一致骨架 - [ ] 客户端分类是否满足“2 行 5 列 + 分页滑块” - [ ] 配送员端菜单是否在任务列表上方 - [ ] 供应商端与配送员端配色和组件风格是否一致 - [ ] 底部结算条层级是否清晰、按钮是否突出 - [ ] 状态标签颜色语义是否一致 - [ ] 若为工作台 WebView 业务页:是否满足第 12 节清单 --- ## 10. 约束与落地策略 - 以本文档为小程序 / WebView UI 改造的视觉权威;工作台 WebView **扁平列表卡**遵循 §12.3 并参考客户/产品列表实现;旧 expense-card 仅适用 §12.3.1 的过渡范围。 - 改造时优先顺序: 1) 统一 Token 2) 统一布局骨架 3) 页面组件映射 4) 细节与动效优化 - 后续新增页面需先在本规范补充“页面结构和组件映射”,再落代码。 --- ## 11. 从 Demo 到 uni-app 的 class 映射建议 > 目的:保留历史 Demo 的有效结构映射,供 `miniprogram/pages/**.vue` 实现参考,无需读取已移除的原型。 > 建议:优先保留 Demo class 名,若历史页面已存在 class,可做“旧类名 = 新类名别名”过渡。 ### 11.1 客户端首页映射(`pages/client/home/home.vue`) | Demo 区块 | Demo class | 建议 uni-app class | |---|---|---| | 页面根容器 | `phone` | `client-home-page` | | 顶部头部 | `top`, `top-row`, `search` | `client-header`, `client-header-row`, `client-search` | | 一级分类分页容器 | `first-level` | `client-first-level` | | 一级分类分页项 | `first-page` | `client-first-page` | | 一级分类卡片 | `first-chip` | `client-first-chip` | | 一级分类滑块组 | `first-level-indicator` | `client-first-indicator` | | 一级分类滑块项 | `indicator-dot` | `client-first-indicator-dot` | | 分类主布局 | `category-layout` | `client-category-layout` | | 二级分类侧栏 | `second-level`, `second-item` | `client-second-level`, `client-second-item` | | 商品区 | `goods-area`, `goods-list`, `goods-card` | `client-goods-area`, `client-goods-list`, `client-goods-card` | | 底部结算条 | `cart-bar`, `cart-inner`, `settle` | `client-cart-bar`, `client-cart-inner`, `client-settle-btn` | ### 11.2 客户端购物车映射(`pages/client/cart/cart.vue`) | Demo 区块 | Demo class | 建议 uni-app class | |---|---|---| | 页面头部 | `top`, `title`, `sub` | `cart-header`, `cart-title`, `cart-sub` | | 店铺分组卡 | `store`, `store-head`, `store-name` | `cart-store-card`, `cart-store-head`, `cart-store-name` | | 商品行 | `item`, `thumb`, `name`, `spec` | `cart-item-row`, `cart-item-thumb`, `cart-item-name`, `cart-item-spec` | | 数量控制 | `qty`, `qbtn`, `qnum` | `cart-qty`, `cart-qty-btn`, `cart-qty-num` | | 底部结算 | `bar`, `total`, `btn` | `cart-footer`, `cart-total`, `cart-checkout-btn` | ### 11.3 客户端订单映射(`pages/client/order/order.vue`) | Demo 区块 | Demo class | 建议 uni-app class | |---|---|---| | 顶部筛选 | `tabs`, `tab` | `order-tabs`, `order-tab-item` | | 订单卡 | `order`, `head`, `no` | `order-card`, `order-card-head`, `order-no` | | 状态标签 | `status pending/delivering` | `order-status status-pending/status-delivering` | | 订单商品摘要 | `goods`, `img`, `meta` | `order-goods-row`, `order-goods-thumb`, `order-goods-meta` | | 卡片底部动作 | `ft`, `actions`, `btn` | `order-footer`, `order-actions`, `order-action-btn` | ### 11.4 客户端个人中心映射(`pages/client/profile/profile.vue`) | Demo 区块 | Demo class | 建议 uni-app class | |---|---|---| | 头部用户区 | `header`, `user`, `avatar`, `name` | `profile-header`, `profile-user`, `profile-avatar`, `profile-name` | | 统计区 | `stats`, `s` | `profile-stats`, `profile-stat-item` | | 功能列表 | `card`, `row`, `left`, `arrow` | `profile-menu-card`, `profile-menu-row`, `profile-menu-left`, `profile-menu-arrow` | | 退出按钮 | `logout` | `profile-logout-btn` | ### 11.5 供应商端映射(`pages/supplier/home/home.vue`) | Demo 区块 | Demo class | 建议 uni-app class | |---|---|---| | 头部 | `header`, `topline`, `merchant` | `supplier-header`, `supplier-header-top`, `supplier-merchant` | | 统计卡 | `stats`, `stat` | `supplier-stats`, `supplier-stat-item` | | 功能宫格 | `tools`, `tool`, `icon` | `supplier-tools`, `supplier-tool-item`, `supplier-tool-icon` | | 任务列表 | `tasks`, `task` | `supplier-task-list`, `supplier-task-card` | | 任务状态 | `tag pending/stocking` | `supplier-task-tag tag-pending/tag-stocking` | ### 11.6 配送员端映射(`pages/deliverer/home/home.vue`) | Demo 区块 | Demo class | 建议 uni-app class | |---|---|---| | 头部与统计 | 同供应商结构 | `deliverer-header`, `deliverer-stats` | | Tab 区 | `tabs`, `tab` | `deliverer-tabs`, `deliverer-tab-item` | | 菜单宫格(在任务上方) | `tools`, `tool` | `deliverer-tools`, `deliverer-tool-item` | | 任务卡 | `task`, `line1`, `status` | `deliverer-task-card`, `deliverer-task-head`, `deliverer-task-status` | | 取货/配送信息块 | `blk`, `phone-row`, `dial` | `deliverer-info-block`, `deliverer-phone-row`, `deliverer-dial-btn` | ### 11.7 危化品证上传 H5(运输管理) - 列表路径 `/m/pl/plan-cert`,详情路径 `/m/pl/plan-cert/:id`,均复用 `MpWebviewShell`;**视觉骨架以第 12 节扁平折叠卡为准**(绿顶栏 + 可选业务 Tab + 三栏筛选含「更多」+ 扁平卡);存量 expense-card / style-align 为过渡,改造时迁到 12.3。SHALL NOT 再使用与骨架冲突的独立密集 `cert-*` 工具条 / Chip 硬挤。 - 卡片列表与左右边界留白约 12px;详情为独立页面,顶部只保留普通绿顶栏和固定标题,不使用票根、Hero 或记录摘要等特殊区。 - 业务规则:筛选与齐备/上传权限、详情段次与产品信息、证书上传分组等仍服从运输业务与既有 API;不展示导出。 - 附件上传确认对齐第 12.5 节发票夹宫格;确认弹窗对齐第 12.6 节;375px/414px 无整页横滚,触达 ≥ 44px。 ### 11.8 实施建议(迁移顺序) 1. **先挂 class,不改业务逻辑**:先在现有模板上补 class,确保样式可落。 2. **再替换样式变量**:将页面颜色/间距替换为本规范 Token。 3. **最后收敛重复样式**:把通用样式抽到 `src/styles` 或公共组件。 4. **状态类统一命名**:统一 `tag-*` / `status-*`,减少后续维护成本。 5. **交互类保持语义化**:如 `*-indicator-dot`、`*-checkout-btn`,便于后续脚本绑定。 --- ## 12. 工作台 WebView 业务页(CRM / 危化品证等) > **列表卡参考实现**:`web-admin/src/views/m/crm/customer/index.vue`、`web-admin/src/views/m/crm/product/index.vue`;规范见本节 §12.3。 > **确认弹窗参考实现**:`web-admin/src/utils/mp-crm-confirm.ts`;规范见本节 §12.6。 > **过渡范围**:旧 expense-card 见 §12.3.1,不作为新页面标准。 > **OpenSpec**:`openspec/changes/zkxw-engineering-standards/specs/ui-conventions/spec.md` →「工作台 WebView 业务页」 > **色板**:本节与全文 §2 一致,主色 `#0a9f6d`,**禁止** Fresh Mint `#10b981`。 适用于小程序工作台菜单打开的 H5(`/m/crm/*`、`/m/pl/plan-cert` 等)。参考实现:客户管理、产品管理。附件宫格仍参考「我的发票夹」。 ### 12.1 列表页骨架(自上而下) | 顺序 | 区块 | 说明 | |------|------|------| | 1 | 绿顶栏 | 返回、标题(固定页面名);胶囊搜索可放在顶栏内(对齐 `MpBusinessHeader`) | | 2 | 业务 Tab(可选) | 仅业务有多视图/多状态时出现(如客户视图);**不是**每页必有;无需要时不硬塞状态 Tab | | 3 | 三栏筛选 | 紧贴搜索下方;固定 3 格:前 2 项京东式下拉,第 3 项「更多」 | | 4 | 列表卡片 | 见 12.3 扁平折叠卡;与左右边界留白(约 12px);条数汇总在卡片之后;滚到底继续加载,不再放「加载更多」按钮 | | 5 | Speed Dial / 批量底栏 | 新增用右下角「+」;批量仅勾选后出底栏 | 禁止:顶栏下再堆「新增 / 筛选 / 显示 / 刷新」多行工具条。 ### 12.2 「更多」筛选弹窗 底部 Sheet 收纳**全部**条件,控件类型: - **单选 Chip**:状态、类型、视图 - **模糊检索**:文本关键字 - **日期 / 日期时间** - **日期区间 / 数值区间** 以上为共用筛选能力集合;每个页面只展示桌面端/后端已支持并能真实生效的字段,不得为了展示某种控件伪造无效筛选。危化品证页当前无独立“证书上传时间”查询字段,保持与 Web 端字段一致。 顶栏只保留标题和「关闭」。重置、确定放在底栏,对齐客户管理(`mp-customer-filter-vant__foot`)。不要把这两个按钮放进顶栏左右文字。重置会清空并立即查询。「更多」内有额外条件时,顶栏「更多」显示「更多·已筛」。 ### 12.3 列表卡片(扁平折叠卡,新标准) CRM 管理与运输管理中的产品危化属性标签统一使用 `MpProductHazardTag`:易制毒显示「毒」(红色 `#dc2626`),易制爆显示「爆」(黄色 `#ca8a04`),均为白字、24px 高度。列表、详情、编辑及产品选择弹窗保持一致;完整属性名称保留在无障碍标签中。 CRM 管理六个界面及运输计划、危化品证上传界面的普通操作按钮统一为 30px 高、28px 行高,上下可见留白约为原 44px 按钮的一半;左右内边距不变。此规则包含对应弹窗的操作按钮,优先于通用 44px 高度规则;返回、Tab、勾选控件和圆形加号维持原尺寸。 紧凑按钮规则以 `.mp-wv-root` 页面容器及其弹层容器为范围,覆盖详情、编辑、审批、选择器及辅助子页面。新增原生操作按钮使用 `.mp-compact-action` 接入统一尺寸,不能依赖页面类名白名单。 1. 顶行:标题(单行省略)+ 浅底状态标签;可勾选时勾选在标题左侧 2. meta 行:弱文案摘要(如 `状态 · 编号 · 时间`),无色块底 3. 预览区:少量关键字段,左右 label/value;**无灰底 / 绿底色块** 4. 「更多字段 / 收起」:展开按钮上方无虚线 5. 展开区:其余字段扁平 KV;空值 `—` 6. 虚线底栏:允许多钮;**每卡仅一个实心主色按钮**(通常「查看」);危险操作用浅底危险描边 有金额业务:金额进 meta/预览/展开之一,不用独立金额色块区作为默认层。字段集对齐 PC 约定可见列(或已确认固定全集);不做移动端「显示字段」勾选驱动卡片。 建议 class(H5):`mp-wv-card` + `mp-*-list-card` / `__meta` / `__preview` / `__toggle` / `__extra` / `__row`(结构不得缺层)。 #### 12.3.1 过渡:旧 `expense-card` 存量可暂留:标题+Tag → 可选金额大区 → 副信息 → 灰底 KV → 时间 → 虚线底栏。**新增与改造必须用 12.3**;不得新建灰底 KV / 绿底强调条列表卡。客户、产品、报价已达标;合同、危化证等仍用旧卡者为过渡、待改造。仅一个底栏按钮时按内容宽度靠右,不拉满整行。 ### 12.4 独立详情页 详情使用独立路由页面,支持直达、刷新和返回,SHALL NOT 放入 Bottom Sheet 或桌面弹窗。结构为:普通绿顶栏(返回 + 固定页面标题)→ 业务 **Tab**(如有)→ 信息卡(上标签下值或 section+h3+KV)→ 底栏主操作。编号、状态、金额等业务信息放入正文;顶部不设置票根、Hero、动态记录标题、副标题或状态标签等特殊区。审批流使用头像时间轴,附件回显见 12.5。 ### 12.5 附件上传与回显(对齐我的发票夹) - 宫格约 **72×72**,圆角 8px,`att-grid` / `att-img` / `att-add` / `att-doc-thumb` - 图:缩略填充;非图:扩展名 + 文件名 - 编辑:角标删除 + 虚线「+」 - 不把管理端 140×96 附件卡直接搬到手机端作为主形态 ### 12.6 确认弹窗 - 白底圆角约 14–16px;遮罩无 blur;底栏**横排**取消 | 确认,等宽、高约 40px;禁止纵向堆叠 - 普通确认:确认键三墙绿实心 `#0a9f6d` - 删除/不可恢复:危险警示视觉 + 确认键危险红 `#dc2626`(文案如「确认删除」) - 参考实现:`web-admin/src/utils/mp-crm-confirm.ts` ### 12.7 改造检查清单(WebView 业务页) - [ ] Token 为三墙绿,无 `#10b981` 主色 - [ ] 列表卡为扁平折叠范式,无新建灰底 KV / 绿底强调条 - [ ] 列表卡符合 §12.3,并对照客户/产品列表参考实现 - [ ] 业务 Tab 仅需要时出现;顺序:绿顶栏(含搜索)→ 可选 Tab → 三栏筛选 → 扁平卡 - [ ] 「更多」含业务实际需要的非 Chip 条件;已筛有提示 - [ ] 确认弹窗横排;删除为危险红语义 - [ ] 详情为独立路由、普通绿顶栏且无票根/顶部特殊区;Tab 为锚点;底栏固定;附件为发票夹宫格 - [ ] 搜索与筛选为输入即查;表单可见控件为 Vant,选择器用底部弹层并支持即时模糊检索 - [ ] 对照客户/产品/报价单页面目视验收后再合入 ### 12.8 样式改造补遗(报价单已落地) 后续 H5 改造以客户、产品、报价单页面为准。规范正文见 OpenSpec「H5 样式改造补遗(以报价单管理落地为准)」。要点:绿头 Tab 白字均分、筛选行白字透明底、更多筛选底栏重置/确定、滚动分页、即时检索、表单绿竖条标题与固定底栏、左右只留壳层间距、明细与选择器用 Vant 底部弹层、详情 Tab 作锚点且字段与 Web 查看弹窗一致。