|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+# 商品分类 — 前端技术方案(C 端 · shop-app)
|
|
|
2
|
+
|
|
|
3
|
+> **依据:** 《商品分类功能需求.md》v1.0.1、《商品分类技术方案.md》v1.0
|
|
|
4
|
+> **关联:** 《商城首页功能需求.md》v1.0.2、《商城首页技术方案.md》v1.1
|
|
|
5
|
+> **范围:** 消费者 APP **`shop-app`** 全部分类页(A)、一级分类商品页(B)、二级商品列表页(C);**不** 改后端、**不** 实现搜索执行与商品详情。
|
|
|
6
|
+> **实现状态:** 页面与 API 封装已落地,待与 `/api/category/**` 联调。
|
|
|
7
|
+
|
|
|
8
|
+---
|
|
|
9
|
+
|
|
|
10
|
+## 1. 技术栈与约定
|
|
|
11
|
+
|
|
|
12
|
+| 项 | 说明 |
|
|
|
13
|
+|----|------|
|
|
|
14
|
+| 框架 | uni-app **Vue 3** + **uview-plus** |
|
|
|
15
|
+| 请求 | `@/utils/request`(与 ruoyi-ui 响应 `code`/`msg`/`data` 一致;商品列表为 `rows`/`total`) |
|
|
|
16
|
+| 鉴权 | 分类三接口 **`header: { isToken: false }`**(`@Anonymous`) |
|
|
|
17
|
+| 开发代理 | `config/index.js` 中 `H5_USE_PROXY=true` 时走 `/dev-api`(见 `vite.config.js`) |
|
|
|
18
|
+| 参考页面 | `pages/index/index.vue`(商城首页样式)、`components/mall/*`(搜索/商品卡片) |
|
|
|
19
|
+
|
|
|
20
|
+---
|
|
|
21
|
+
|
|
|
22
|
+## 2. 页面与路由
|
|
|
23
|
+
|
|
|
24
|
+| 页面 | 需求代号 | 路径 | 入口 |
|
|
|
25
|
+|------|----------|------|------|
|
|
|
26
|
+| 全部分类(Tab) | **A** | `pages/category/index` | 底部 Tab「分类」;首页「更多」`switchTab` |
|
|
|
27
|
+| 一级分类商品 | **B** | `pages/category/level1` | 首页点击一级类目 `navigateTo` + `level1Id` |
|
|
|
28
|
+| 二级商品列表 | **C** | `pages/category/goods-list` | A 页点击二级 `navigateTo` + `categoryId` |
|
|
|
29
|
+
|
|
|
30
|
+**`pages.json` 注册:**
|
|
|
31
|
+
|
|
|
32
|
+```text
|
|
|
33
|
+pages/category/index → navigationBarTitleText: 分类
|
|
|
34
|
+pages/category/level1 → 动态 setNavigationBarTitle(level1Name)
|
|
|
35
|
+pages/category/goods-list → 动态 setNavigationBarTitle(level2Name)
|
|
|
36
|
+```
|
|
|
37
|
+
|
|
|
38
|
+**路由参数:**
|
|
|
39
|
+
|
|
|
40
|
+| 页面 | Query | 说明 |
|
|
|
41
|
+|------|-------|------|
|
|
|
42
|
+| B | `level1Id`, `level1Name` | 一级上下文 |
|
|
|
43
|
+| C | `categoryId`, `level1Id`, `level1Name`, `level2Name` | 二级列表 + 面包屑展示 |
|
|
|
44
|
+
|
|
|
45
|
+---
|
|
|
46
|
+
|
|
|
47
|
+## 3. 文件清单
|
|
|
48
|
+
|
|
|
49
|
+| 类型 | 路径 | 说明 |
|
|
|
50
|
+|------|------|------|
|
|
|
51
|
+| A 页 | `shop-app/pages/category/index.vue` | 左一级 / 右二级 |
|
|
|
52
|
+| B 页 | `shop-app/pages/category/level1.vue` | 搜索 + Tab + 列表 |
|
|
|
53
|
+| C 页 | `shop-app/pages/category/goods-list.vue` | 搜索 + 面包屑 + 列表 |
|
|
|
54
|
+| 列表块 | `shop-app/components/category/GoodsListBlock.vue` | 排序 + 分页列表(B/C 共用) |
|
|
|
55
|
+| 搜索入口 | `shop-app/components/mall/SearchEntry.vue` | 占位「搜索兽药、饲料、店铺」 |
|
|
|
56
|
+| 商品网格 | `shop-app/components/mall/GoodsGrid.vue` | 双列卡片 |
|
|
|
57
|
+| 排序条 | `shop-app/components/mall/SortToolbar.vue` | 四档 sortBy |
|
|
|
58
|
+| API | `shop-app/api/category.js` | tree / level2-tabs / goods |
|
|
|
59
|
+| 常量 | `shop-app/constants/categorySort.js` | `DEFAULT_SORT_BY`、`SORT_OPTIONS` |
|
|
|
60
|
+| 映射 | `shop-app/utils/categoryDisplay.js` | 分类树、Tab、占位图、热门标 |
|
|
|
61
|
+| 映射 | `shop-app/utils/goodsDisplay.js` | 商品卡片(与首页热销字段一致) |
|
|
|
62
|
+
|
|
|
63
|
+---
|
|
|
64
|
+
|
|
|
65
|
+## 4. 接口封装
|
|
|
66
|
+
|
|
|
67
|
+**模块:** `shop-app/api/category.js`
|
|
|
68
|
+
|
|
|
69
|
+| 方法 | HTTP | 路径 | 响应 |
|
|
|
70
|
+|------|------|------|------|
|
|
|
71
|
+| `getCategoryTree()` | GET | `/api/category/tree` | `AjaxResult` → `data: CategoryVisibleVO[]` |
|
|
|
72
|
+| `getLevel2Tabs(level1Id)` | GET | `/api/category/{level1Id}/level2-tabs` | `data: CategoryVisibleChildVO[]` |
|
|
|
73
|
+| `getCategoryGoods(params)` | GET | `/api/category/goods` | `TableDataInfo` → `rows`, `total` |
|
|
|
74
|
+
|
|
|
75
|
+**`getCategoryGoods` Query:**
|
|
|
76
|
+
|
|
|
77
|
+| 参数 | 默认 | 说明 |
|
|
|
78
|
+|------|------|------|
|
|
|
79
|
+| categoryId | 必填 | 平台 **二级** ID |
|
|
|
80
|
+| sortBy | `sales_desc` | `sales_desc` / `sales_asc` / `price_desc` / `price_asc` |
|
|
|
81
|
+| pageNum | 1 | 页码 |
|
|
|
82
|
+| pageSize | 10 | 每页条数(组件可配) |
|
|
|
83
|
+
|
|
|
84
|
+**错误处理:** 请求 `silent: true`;失败时列表区空态,**不** Toast 刷屏(对齐 GC14)。
|
|
|
85
|
+
|
|
|
86
|
+---
|
|
|
87
|
+
|
|
|
88
|
+## 5. 页面结构
|
|
|
89
|
+
|
|
|
90
|
+### 5.1 A — 全部分类 `pages/category/index`
|
|
|
91
|
+
|
|
|
92
|
+```text
|
|
|
93
|
+全部分类(Tab)
|
|
|
94
|
+├── SearchEntry(§3 搜索占位)
|
|
|
95
|
+├── 加载中 / 空态(失败文案「分类加载失败」)
|
|
|
96
|
+└── 左右分栏
|
|
|
97
|
+ ├── 左 scroll-y:一级列表(选中高亮 + 左侧绿条)
|
|
|
98
|
+ └── 右 scroll-y:二级宫格(图 + 名 + 可选「热」标)
|
|
|
99
|
+ └── 点击二级 → navigateTo C 页
|
|
|
100
|
+```
|
|
|
101
|
+
|
|
|
102
|
+| 行为 | 实现 |
|
|
|
103
|
+|------|------|
|
|
|
104
|
+| 数据 | `onShow` → `GET /tree` |
|
|
|
105
|
+| 默认一级 | `selectedIndex = 0`(排序已由后端保证) |
|
|
|
106
|
+| 切换一级 | 仅刷新右侧 `children`,不跳转 |
|
|
|
107
|
+| 空树 | `u-empty`「暂无分类」 |
|
|
|
108
|
+
|
|
|
109
|
+### 5.2 B — 一级分类商品 `pages/category/level1`
|
|
|
110
|
+
|
|
|
111
|
+```text
|
|
|
112
|
+一级分类商品页
|
|
|
113
|
+├── SearchEntry
|
|
|
114
|
+├── 一级标题(level1Name)
|
|
|
115
|
+├── 二级 Tab(scroll-x,失败/空态独立)
|
|
|
116
|
+└── GoodsListBlock(当前 Tab 的 categoryId)
|
|
|
117
|
+```
|
|
|
118
|
+
|
|
|
119
|
+| 行为 | 实现 |
|
|
|
120
|
+|------|------|
|
|
|
121
|
+| 数据 | `onShow` → `GET /{level1Id}/level2-tabs` |
|
|
|
122
|
+| 默认 Tab | 第一个二级 |
|
|
|
123
|
+| 切换 Tab(C1) | `scrollTopKey++` → 子组件 watch 后 **列表回顶** 并 `reload` |
|
|
|
124
|
+| 排序 | Tab 切换 **保留** `sortBy`(父组件 state 不变) |
|
|
|
125
|
+| 商品点击 | 暂 Toast「商品详情开发中」 |
|
|
|
126
|
+
|
|
|
127
|
+### 5.3 C — 二级列表 `pages/category/goods-list`
|
|
|
128
|
+
|
|
|
129
|
+```text
|
|
|
130
|
+二级商品列表页
|
|
|
131
|
+├── SearchEntry
|
|
|
132
|
+├── 面包屑:level1Name > level2Name
|
|
|
133
|
+└── GoodsListBlock(categoryId)
|
|
|
134
|
+```
|
|
|
135
|
+
|
|
|
136
|
+| 行为 | 实现 |
|
|
|
137
|
+|------|------|
|
|
|
138
|
+| 无 Tab | 仅展示当前二级商品 |
|
|
|
139
|
+| 返回 | 系统返回栈 → A 页 |
|
|
|
140
|
+
|
|
|
141
|
+### 5.4 商品列表块 `GoodsListBlock`(B/C 共用 §7)
|
|
|
142
|
+
|
|
|
143
|
+```text
|
|
|
144
|
+GoodsListBlock
|
|
|
145
|
+├── SortToolbar(四档排序)
|
|
|
146
|
+└── scroll-view
|
|
|
147
|
+ ├── GoodsGrid(双列)
|
|
|
148
|
+ ├── 空态「该分类下暂无商品」
|
|
|
149
|
+ └── 底部「加载中 / 没有更多了」
|
|
|
150
|
+```
|
|
|
151
|
+
|
|
|
152
|
+| 项 | 实现 |
|
|
|
153
|
+|----|------|
|
|
|
154
|
+| 默认排序 | `sales_desc`(GC9) |
|
|
|
155
|
+| 分页 | 上拉 `scrolltolower` 加载下一页 |
|
|
|
156
|
+| 卡片字段 | 主图、名称、售价、店铺名(GC10) |
|
|
|
157
|
+| 图片 | `resolveFileUrl`;无图 `/static/logo.png` |
|
|
|
158
|
+
|
|
|
159
|
+---
|
|
|
160
|
+
|
|
|
161
|
+## 6. 与商城首页协作
|
|
|
162
|
+
|
|
|
163
|
+| 首页操作 | 前端跳转 |
|
|
|
164
|
+|----------|----------|
|
|
|
165
|
+| 点击一级类目 | `navigateTo` `/pages/category/level1?level1Id=&level1Name=` |
|
|
|
166
|
+| 点击「更多」 | `switchTab` `/pages/category/index` |
|
|
|
167
|
+
|
|
|
168
|
+**勿混用接口:** 首页横向导航用 `/api/home/categories`(仅一级);分类模块用 `/api/category/**`。
|
|
|
169
|
+
|
|
|
170
|
+---
|
|
|
171
|
+
|
|
|
172
|
+## 7. 业务规则映射(前端)
|
|
|
173
|
+
|
|
|
174
|
+| 规则 | 前端实现 |
|
|
|
175
|
+|------|----------|
|
|
|
176
|
+| GC1 | 仅消费 `/api/category` 平台树 |
|
|
|
177
|
+| GC3 / GC-S2 | `SearchEntry` 固定占位文案 |
|
|
|
178
|
+| GC4 | A → C 跳转带 `categoryId` |
|
|
|
179
|
+| GC5 / C1 | B Tab + `scrollTopKey` 回顶重载 |
|
|
|
180
|
+| GC5a | C 面包屑 `level1 > level2` |
|
|
|
181
|
+| GC6 | 依赖后端 Facade 过滤空壳一级 |
|
|
|
182
|
+| GC9 | `SortToolbar` 四档 `sortBy` |
|
|
|
183
|
+| GC10 | `GoodsGrid` 字段 |
|
|
|
184
|
+| GC12 / GC13 | 不做可购校验;列表不展示库存/销量 |
|
|
|
185
|
+| GC14 | tree / tabs / goods **独立加载**与空态 |
|
|
|
186
|
+| GC15 | 无编辑能力 |
|
|
|
187
|
+
|
|
|
188
|
+---
|
|
|
189
|
+
|
|
|
190
|
+## 8. 联调检查清单
|
|
|
191
|
+
|
|
|
192
|
+| # | 项 |
|
|
|
193
|
+|---|-----|
|
|
|
194
|
+| 1 | `BASE_API` / H5 代理可访问 `/api/category/tree` |
|
|
|
195
|
+| 2 | A 页左列一级、右列二级与后台 `show_flag` 一致 |
|
|
|
196
|
+| 3 | B 页 Tab 数量与 `level2-tabs` 一致,切换后 `goods` 的 `categoryId` 变化 |
|
|
|
197
|
+| 4 | 排序切换后 `sortBy` query 正确 |
|
|
|
198
|
+| 5 | 分页:`total` 大于 `pageSize` 时可上拉加载 |
|
|
|
199
|
+| 6 | 首页一级 → B、首页更多 → A、A 二级 → C 链路通畅 |
|
|
|
200
|
+
|
|
|
201
|
+---
|
|
|
202
|
+
|
|
|
203
|
+## 9. 待建设(非本方案)
|
|
|
204
|
+
|
|
|
205
|
+| 项 | 说明 |
|
|
|
206
|
+|----|------|
|
|
|
207
|
+| 搜索输入页 / 结果 | GC-S1 |
|
|
|
208
|
+| 商品详情 | 列表点击跳转 |
|
|
|
209
|
+| 深度链接校验 | 不可见分类友好提示 |
|
|
|
210
|
+
|
|
|
211
|
+---
|
|
|
212
|
+
|
|
|
213
|
+## 10. 修订记录
|
|
|
214
|
+
|
|
|
215
|
+| 版本 | 说明 |
|
|
|
216
|
+|------|------|
|
|
|
217
|
+| **v1.0** | 首版:A/B/C 三页、公共组件、API 封装;对齐功能需求 v1.0.1、后端技术方案 v1.0 |
|
|
|
218
|
+
|
|
|
219
|
+---
|
|
|
220
|
+
|
|
|
221
|
+*文档版本:v1.0 · 工程目录 `shop-app` · 关联《商品分类功能需求.md》v1.0.1、《商品分类技术方案.md》v1.0*
|