Files
shanxia2.0/docs/miniprogram-ui-spec-sanqiang.md

451 lines
22 KiB
Markdown
Raw Permalink 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.
# 小程序端 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 查看弹窗一致。