xsh_1997 преди 2 седмици
родител
ревизия
27aa0dd5ad
променени са 2 файла, в които са добавени 222 реда и са изтрити 1 реда
  1. 221 0
      doc/消费者APP/商品分类/商品分类前端技术方案.md
  2. 1 1
      doc/消费者APP/商品分类/商品分类技术方案.md

+ 221 - 0
doc/消费者APP/商品分类/商品分类前端技术方案.md

@@ -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*

+ 1 - 1
doc/消费者APP/商品分类/商品分类技术方案.md

@@ -344,7 +344,7 @@ CategoryAppServiceImpl
344 344
 | `GET /api/category/goods` | **待实现** |
345 345
 | `CategoryAppController` / `CategoryAppServiceImpl` | **待创建** |
346 346
 | `CategoryAppMapper.xml` | **待创建** |
347
-| C 端分类前端 | **未实现** |
347
+| C 端分类前端 | **已实现**(见《商品分类前端技术方案.md》v1.0) |
348 348
 
349 349
 ---
350 350