|
|
@@ -1,9 +1,9 @@
|
|
1
|
1
|
# 我的服务 — 前端技术方案(C 端 · shop-app)
|
|
2
|
2
|
|
|
3
|
|
-> **依据:** 《我的服务功能需求.md》v1.1、《我的服务技术方案.md》v1.2
|
|
|
3
|
+> **依据:** 《我的服务功能需求.md》v1.1、《我的服务技术方案.md》v1.3(仅作接口对照,**本文档独立维护**)
|
|
4
|
4
|
> **关联:** 《会员注册登录前端技术方案.md》(登录前置)、后续《订单管理》等(地址被结算引用)
|
|
5
|
5
|
> **范围:** C 端 **个人资料、修改密码、收货地址、商家入驻**;**不** 改后端、**不** 实现我的订单/消息中心/换绑手机。
|
|
6
|
|
-> **实现状态:** 我的 Tab + 分包页面已落地;资料页已对齐 v1.2(**无出生日期**),待联调。
|
|
|
6
|
+> **实现状态:** 已对齐 v1.3(地址 `regionCode`/`regionName` + 省市区级联),待联调。
|
|
7
|
7
|
|
|
8
|
8
|
---
|
|
9
|
9
|
|
|
|
@@ -13,10 +13,11 @@
|
|
13
|
13
|
|----|------|
|
|
14
|
14
|
| 框架 | uni-app **Vue 3** + **uview-plus** |
|
|
15
|
15
|
| 请求 | `@/utils/request`;须登录接口默认带 `Authorization: Bearer {token}` |
|
|
16
|
|
-| 登录前置 | **MS0**:子功能经 `ensureApiToken` / `navigateMinePage` 拦截,引导 `PAGE_LOGIN` |
|
|
17
|
|
-| 上传 | `@/utils/upload` → `POST /common/upload`,返回 `url` 写入表单 |
|
|
18
|
|
-| 样式 | `styles/mine.scss`(与登录页绿色主色一致) |
|
|
19
|
|
-| 路由 | 业务页在 **`subpackage/account/`**;Tab 仍在 **`pages/mine/index`** |
|
|
|
16
|
+| 登录前置 | **MS0**:子功能经 `ensureApiToken` / `navigateMinePage` 拦截 |
|
|
|
17
|
+| 上传 | `@/utils/upload` → `POST /common/upload` |
|
|
|
18
|
+| 省市区 | `GET /api/region/tree`(匿名)+ `up-cascader`;逻辑对齐 `ruoyi-ui/utils/region.js` |
|
|
|
19
|
+| 样式 | `styles/mine.scss` |
|
|
|
20
|
+| 路由 | 业务页在 **`subpackage/account/`**;Tab 在 **`pages/mine/index`** |
|
|
20
|
21
|
|
|
21
|
22
|
---
|
|
22
|
23
|
|
|
|
@@ -25,20 +26,14 @@
|
|
25
|
26
|
| 页面 | 路径 | 包 | 入口 |
|
|
26
|
27
|
|------|------|-----|------|
|
|
27
|
28
|
| 我的(服务入口) | `pages/mine/index` | 主包 Tab | TabBar「我的」 |
|
|
28
|
|
-| 个人资料 | `subpackage/account/profile` | 分包 | 我的 → 编辑个人资料 / 点头像 |
|
|
|
29
|
+| 个人资料 | `subpackage/account/profile` | 分包 | 我的 → 编辑个人资料 |
|
|
29
|
30
|
| 修改密码 | `subpackage/account/password` | 分包 | 我的 → 修改密码 |
|
|
30
|
31
|
| 收货地址列表 | `subpackage/account/address-list` | 分包 | 我的 → 收货地址 |
|
|
31
|
32
|
| 地址编辑 | `subpackage/account/address-edit` | 分包 | 列表新增/编辑 |
|
|
32
|
|
-| 商家入驻 | `subpackage/account/entry-apply` | 分包 | 我的 → 我要入驻 |
|
|
33
|
|
-| 我的入驻申请 | `subpackage/account/entry-list` | 分包 | 我的 → 我的入驻申请 |
|
|
|
33
|
+| 商家入驻 | `subpackage/account/entry-apply` | 分包 | 我要入驻 |
|
|
|
34
|
+| 我的入驻申请 | `subpackage/account/entry-list` | 分包 | 我的入驻申请 |
|
|
34
|
35
|
| 申请详情 | `subpackage/account/entry-detail` | 分包 | 列表项 |
|
|
35
|
36
|
|
|
36
|
|
-**Query:**
|
|
37
|
|
-
|
|
38
|
|
-| 页面 | 参数 | 说明 |
|
|
39
|
|
-|------|------|------|
|
|
40
|
|
-| address-edit | `mode=add\|edit`、`id` | 编辑时传 `addressId` |
|
|
41
|
|
-
|
|
42
|
37
|
**路径常量:** `utils/pageRoute.js` → `PAGE_PROFILE`、`PAGE_PASSWORD`、`PAGE_ADDRESS_*`、`PAGE_ENTRY_*`
|
|
43
|
38
|
|
|
44
|
39
|
---
|
|
|
@@ -47,23 +42,15 @@
|
|
47
|
42
|
|
|
48
|
43
|
| 类型 | 路径 | 说明 |
|
|
49
|
44
|
|------|------|------|
|
|
50
|
|
-| 我的 Tab | `shop-app/pages/mine/index.vue` | 登录态、菜单分区、退出 |
|
|
51
|
|
-| 资料 | `shop-app/subpackage/account/profile.vue` | 只读 ID/手机号/会员名;可编昵称/头像/邮箱/性别 |
|
|
52
|
|
-| 密码 | `shop-app/subpackage/account/password.vue` | 旧密码 + 新密码 + 确认 |
|
|
53
|
|
-| 地址列表 | `shop-app/subpackage/account/address-list.vue` | 默认置顶、设默认、删改 |
|
|
54
|
|
-| 地址编辑 | `shop-app/subpackage/account/address-edit.vue` | 省市区手填 + 详细地址 |
|
|
55
|
|
-| 入驻申请 | `shop-app/subpackage/account/entry-apply.vue` | 分步:类型→主体→经营→店铺→提交 |
|
|
56
|
|
-| 入驻列表 | `shop-app/subpackage/account/entry-list.vue` | 状态、驳回原因摘要 |
|
|
57
|
|
-| 入驻详情 | `shop-app/subpackage/account/entry-detail.vue` | 公示期、驳回、完成说明 |
|
|
|
45
|
+| 我的 Tab | `shop-app/pages/mine/index.vue` | 服务菜单入口 |
|
|
|
46
|
+| 资料/密码/地址/入驻 | `shop-app/subpackage/account/*.vue` | 各子页 |
|
|
58
|
47
|
| 会员 API | `shop-app/api/member.js` | profile / password / address |
|
|
|
48
|
+| 地区 API | `shop-app/api/region.js` | `GET /api/region/tree` |
|
|
59
|
49
|
| 入驻 API | `shop-app/api/merchantEntry.js` | agreement / apply / my |
|
|
60
|
|
-| 导航 | `shop-app/utils/mineNav.js` | 登录后 `navigateTo` |
|
|
61
|
|
-| 入驻常量 | `shop-app/utils/entryConstants.js` | 状态文案、阻塞判断 |
|
|
62
|
|
-| 入驻表单 | `shop-app/utils/entryForm.js` | 空白表单、分步校验、提交体 |
|
|
63
|
|
-| 图片上传 | `shop-app/components/mine/ImageUpload.vue` | 头像/证件/Logo |
|
|
64
|
|
-| 地区 | `shop-app/components/mine/RegionFields.vue` | 省市区三栏 |
|
|
65
|
|
-| 入驻字段块 | `shop-app/components/mine/entry/*.vue` | 个人/企业分步表单项 |
|
|
66
|
|
-| 协议 | `shop-app/components/account/AgreementBlock.vue` | 入驻提交勾选 |
|
|
|
50
|
+| 地区工具 | `shop-app/utils/region.js` | normalize、路径回显、解析区县 |
|
|
|
51
|
+| 地区组件 | `shop-app/components/mine/RegionFields.vue` | **级联选择**(替换手填三栏) |
|
|
|
52
|
+| 入驻表单 | `shop-app/utils/entryForm.js` | 分步校验、提交体 |
|
|
|
53
|
+| 其它 | `mineNav.js`、`entryConstants.js`、`ImageUpload`、`entry/*` | 见 v1.0 |
|
|
67
|
54
|
|
|
68
|
55
|
---
|
|
69
|
56
|
|
|
|
@@ -84,119 +71,99 @@
|
|
84
|
71
|
|
|
85
|
72
|
#### 个人资料(v1.2)
|
|
86
|
73
|
|
|
87
|
|
-| 字段 | GET 展示 | PUT 可写 | 说明 |
|
|
88
|
|
-|------|:--------:|:--------:|------|
|
|
89
|
|
-| memberId | 是 | 否 | 用户 ID(只读) |
|
|
90
|
|
-| memberCode | 是 | 否 | 会员名称(登录账号,只读) |
|
|
91
|
|
-| mobile | 是 | 否 | 手机号(只读) |
|
|
92
|
|
-| nickName | 是 | 是 | 必填,前端 `maxlength=30` |
|
|
93
|
|
-| avatar | 是 | 是 | 图片上传 URL |
|
|
94
|
|
-| email | 是 | 是 | 可空,格式校验 |
|
|
95
|
|
-| sex | 是 | 是 | `0` 男 / `1` 女 / `2` 保密 |
|
|
96
|
|
-| ~~birthday~~ | — | — | **v1.2 已移除**,与后端 `MemberProfileAppVO` 一致 |
|
|
|
74
|
+可写:`nickName`、`avatar`、`email`、`sex`。**无** `birthday`。
|
|
97
|
75
|
|
|
98
|
|
-> **说明:** 入驻申请中的 **出生日期**(个人主体 `birthDate`、法人 `legalBirthDate`)属于 **商户主体字段**,与个人资料无关,仍在 `entry-apply` 分步表单中填写。
|
|
|
76
|
+#### 收货地址(v1.3 · 重要变更)
|
|
99
|
77
|
|
|
100
|
|
-**密码 Body:** `oldPassword`、`newPassword`、`confirmPassword`。
|
|
|
78
|
+| 字段 | 说明 |
|
|
|
79
|
+|------|------|
|
|
|
80
|
+| `regionCode` | 区县级 `code`(字符串提交) |
|
|
|
81
|
+| `regionName` | 省/市/区,**`/` 拼接**(如 `青海省/西宁市/城西区`) |
|
|
|
82
|
+| `detailAddress` | 街道门牌 |
|
|
|
83
|
+| ~~province/city/district~~ | **已废弃**,勿再提交 |
|
|
101
|
84
|
|
|
102
|
|
-**地址 Body:** `consigneeName`、`mobile`、`regionCode`、`regionName`、`detailAddress`、`isDefault`(`0`/`1`)。
|
|
|
85
|
+列表项 `MemberAddressVO`:`regionCode`、`regionName`、`fullAddress`(后端拼接展示用)。
|
|
103
|
86
|
|
|
104
|
|
-### 4.2 入驻 `/api/merchant/entry`
|
|
|
87
|
+### 4.2 省市区 `/api/region`
|
|
105
|
88
|
|
|
106
|
89
|
| 方法 | HTTP | 路径 | 鉴权 |
|
|
107
|
90
|
|------|------|------|------|
|
|
108
|
|
-| `getEntryAgreement` | GET | `/agreement` | 匿名 |
|
|
109
|
|
-| `getEntryStatus` | GET | `/status` | 匿名 |
|
|
110
|
|
-| `submitEntryApply` | POST | `/apply` | Token |
|
|
111
|
|
-| `getMyEntryApplies` | GET | `/my` | Token |
|
|
|
91
|
+| `getRegionTree` | GET | `/tree` | **匿名** |
|
|
112
|
92
|
|
|
113
|
|
-**提交 Body:** `subject` + `biz` + `shop` + `agreementAccepted`(结构见 `utils/entryForm.js`)。
|
|
|
93
|
+响应:树节点 `code`、`name`、`type`(1 省 2 市 3 区县)、`children`。
|
|
114
|
94
|
|
|
115
|
|
-**申请状态:**
|
|
|
95
|
+**前端规则:**
|
|
116
|
96
|
|
|
117
|
|
-| applyStatus | 含义 |
|
|
118
|
|
-|-------------|------|
|
|
119
|
|
-| `0` | 待审核 |
|
|
120
|
|
-| `3` | 公示中 |
|
|
121
|
|
-| `1` | 已完成入驻 |
|
|
122
|
|
-| `2` | 审核未通过 |
|
|
|
97
|
+- `normalizeRegionTree` 供 `up-cascader` 使用;
|
|
|
98
|
+- 确认时 `parseRegionSelection`:**末级须 type=3**;
|
|
|
99
|
+- `regionName = 路径名称 join('/')`;
|
|
|
100
|
+- `regionCode = 末级 code`。
|
|
123
|
101
|
|
|
124
|
|
-**阻塞新申请:** 存在 status `0` 或 `3` 时不可再提交(**MS-E6**)。
|
|
|
102
|
+### 4.3 入驻 `/api/merchant/entry`
|
|
125
|
103
|
|
|
126
|
|
-**入驻前置:** 后端要求会员 `nick_name` 非空;须先在资料页填写昵称。
|
|
|
104
|
+与 v1.2 相同;经营/注册地址字段为 `bizRegionCode`/`bizRegionName`、`regRegionCode`/`regRegionName`,UI 共用 `RegionFields`。
|
|
127
|
105
|
|
|
128
|
106
|
---
|
|
129
|
107
|
|
|
130
|
|
-## 5. 我的 Tab 结构(`pages/mine/index`)
|
|
|
108
|
+## 5. 地区组件(`RegionFields.vue`)
|
|
131
|
109
|
|
|
132
|
110
|
```text
|
|
133
|
|
-顶栏(绿渐变)
|
|
134
|
|
-├── 未登录:提示 + 登录 / 注册
|
|
135
|
|
-└── 已登录:头像、昵称、手机号 → 点击进个人资料
|
|
136
|
|
-
|
|
137
|
|
-账号管理 → 个人资料、修改密码
|
|
138
|
|
-收货地址 → 地址列表
|
|
139
|
|
-商家入驻 → 我要入驻、我的入驻申请
|
|
140
|
|
-退出登录
|
|
|
111
|
+点击「所在地区」行
|
|
|
112
|
+ → 弹出 up-cascader(省 → 市 → 区)
|
|
|
113
|
+ → 确认后 emit:
|
|
|
114
|
+ regionCode、regionName、pathCodes(回显用)
|
|
|
115
|
+ 兼容 code、name(入驻 applyRegion 使用)
|
|
141
|
116
|
```
|
|
142
|
117
|
|
|
143
|
|
----
|
|
144
|
|
-
|
|
145
|
|
-## 6. 关键交互与规则
|
|
|
118
|
+**使用页面:**
|
|
146
|
119
|
|
|
147
|
|
-| 规则 | 前端落实 |
|
|
148
|
|
-|------|----------|
|
|
149
|
|
-| MS0 | 子页 `ensureApiToken` |
|
|
150
|
|
-| MS-P1 | 用户 ID、手机号、会员名称只读 |
|
|
151
|
|
-| MS-P2 | 昵称必填、≤30 字 |
|
|
152
|
|
-| MS-P3 | 头像须上传成功 |
|
|
153
|
|
-| MS-P4 | 保存后 `fetchUserInfo` 刷新 Tab |
|
|
154
|
|
-| MS-W1~W3 | `PUT /password` |
|
|
155
|
|
-| MS-A1~A4 | 地址默认互斥、删除确认 |
|
|
156
|
|
-| MS-E5~E9 | 协议勾选、阻塞待审、提交确认 |
|
|
|
120
|
+- `address-edit.vue` — 收货地址;
|
|
|
121
|
+- `EntryPersonBiz` / `EntryEnterpriseBiz` / `EntryEnterpriseSubject` — 入驻经营/注册地址。
|
|
157
|
122
|
|
|
158
|
|
-**地区:** `regionCode` = 区县 `code`;`regionName` = 省/市/区 `/` 拼接(与商户 `biz_region_*` 一致);UI 暂用手填三栏,后续可接 `GET /api/region/tree` 级联。
|
|
|
123
|
+**缓存:** `loadRegionCascaderTree()` 模块内缓存,避免重复请求。
|
|
159
|
124
|
|
|
160
|
125
|
---
|
|
161
|
126
|
|
|
162
|
|
-## 7. 登录态
|
|
|
127
|
+## 6. 关键交互与规则
|
|
163
|
128
|
|
|
164
|
|
-```text
|
|
165
|
|
-我的 Tab onShow → 有 Token 则拉 profile 刷新 store
|
|
166
|
|
-子页保存资料 → userStore.fetchUserInfo()
|
|
167
|
|
-```
|
|
|
129
|
+| 规则 | 前端落实 |
|
|
|
130
|
+|------|----------|
|
|
|
131
|
+| MS-A · 级联 | 功能需求 §8.3「省/市/区级联」→ `RegionFields` + `/api/region/tree` |
|
|
|
132
|
+| MS-A1~A4 | 默认互斥、删除确认、列表用 `fullAddress` 或 `regionName`+详细 |
|
|
|
133
|
+| MS-P2 | 昵称 ≤30 字 |
|
|
|
134
|
+| MS-E6 | 待审/公示阻塞新入驻 |
|
|
168
|
135
|
|
|
169
|
136
|
---
|
|
170
|
137
|
|
|
171
|
|
-## 8. 联调检查清单
|
|
|
138
|
+## 7. 联调检查清单
|
|
172
|
139
|
|
|
173
|
|
-- [ ] 资料页 **无** 出生日期项;`PUT /profile` 仅 nickName/avatar/email/sex
|
|
174
|
|
-- [ ] 昵称空、超长 30 字前端拦截
|
|
175
|
|
-- [ ] 密码、地址 CRUD
|
|
176
|
|
-- [ ] 入驻个人/企业提交;待审阻塞
|
|
177
|
|
-- [ ] 未填昵称时入驻提交后端提示(引导完善资料)
|
|
|
140
|
+- [ ] `GET /api/region/tree` 返回三级树
|
|
|
141
|
+- [ ] 地址新增/编辑提交 `regionCode`+`regionName`,**无** province/city/district
|
|
|
142
|
+- [ ] 编辑地址能按 `regionCode` 回显级联路径
|
|
|
143
|
+- [ ] 未选至区县时前端提示「请选择完整的省市区」
|
|
|
144
|
+- [ ] 入驻经营/注册地址同样走级联
|
|
|
145
|
+- [ ] 资料、密码、入驻其它项同 v1.2 清单
|
|
178
|
146
|
|
|
179
|
147
|
---
|
|
180
|
148
|
|
|
181
|
|
-## 9. 非本期
|
|
|
149
|
+## 8. 非本期
|
|
182
|
150
|
|
|
183
|
151
|
| 项 | 说明 |
|
|
184
|
152
|
|----|------|
|
|
185
|
|
-| 个人资料出生日期 | v1.2 明确不做 |
|
|
186
|
153
|
| 我的订单、消息中心 | 另模块 |
|
|
187
|
154
|
| 手机号换绑 | — |
|
|
188
|
|
-| 省市区级联字典 | 可后续接 API |
|
|
189
|
155
|
|
|
190
|
156
|
---
|
|
191
|
157
|
|
|
192
|
|
-## 10. 修订记录
|
|
|
158
|
+## 9. 修订记录
|
|
193
|
159
|
|
|
194
|
160
|
| 版本 | 说明 |
|
|
195
|
161
|
|------|------|
|
|
196
|
162
|
| **v1.0** | 首版:我的 Tab、资料/密码/地址/入驻分包 |
|
|
197
|
|
-| **v1.1** | 对齐后端 v1.1:password 独立接口、email/sex |
|
|
198
|
|
-| **v1.2** | 对齐后端/需求 v1.2:**移除资料页出生日期**;昵称 ≤30 字;更新联调清单 |
|
|
|
163
|
+| **v1.1** | password 独立;email/sex |
|
|
|
164
|
+| **v1.2** | 资料移除 birthday;昵称 ≤30 |
|
|
|
165
|
+| **v1.3** | 地址字段改为 **regionCode/regionName**;`api/region` + `RegionFields` 级联;入驻/地址联调清单更新 |
|
|
199
|
166
|
|
|
200
|
167
|
---
|
|
201
|
168
|
|
|
202
|
|
-*文档版本:v1.2 · 关联《我的服务技术方案.md》v1.2、《我的服务功能需求.md》v1.1*
|
|
|
169
|
+*文档版本:v1.3 · 关联《我的服务功能需求.md》v1.1*
|