Procházet zdrojové kódy

会员管理代码

wwh před 2 týdny
rodič
revize
ca93f11869

+ 12 - 22
baqing-shop/src/main/java/com/ruoyi/web/modules/account/domain/BizMemberAddress.java

@@ -17,11 +17,11 @@ public class BizMemberAddress extends BaseEntity
17 17
 
18 18
     private String mobile;
19 19
 
20
-    private String province;
20
+    /** 省市区编码(区县级 code) */
21
+    private String regionCode;
21 22
 
22
-    private String city;
23
-
24
-    private String district;
23
+    /** 省市区名称(省/市/区 / 拼接) */
24
+    private String regionName;
25 25
 
26 26
     private String detailAddress;
27 27
 
@@ -69,34 +69,24 @@ public class BizMemberAddress extends BaseEntity
69 69
         this.mobile = mobile;
70 70
     }
71 71
 
72
-    public String getProvince()
73
-    {
74
-        return province;
75
-    }
76
-
77
-    public void setProvince(String province)
78
-    {
79
-        this.province = province;
80
-    }
81
-
82
-    public String getCity()
72
+    public String getRegionCode()
83 73
     {
84
-        return city;
74
+        return regionCode;
85 75
     }
86 76
 
87
-    public void setCity(String city)
77
+    public void setRegionCode(String regionCode)
88 78
     {
89
-        this.city = city;
79
+        this.regionCode = regionCode;
90 80
     }
91 81
 
92
-    public String getDistrict()
82
+    public String getRegionName()
93 83
     {
94
-        return district;
84
+        return regionName;
95 85
     }
96 86
 
97
-    public void setDistrict(String district)
87
+    public void setRegionName(String regionName)
98 88
     {
99
-        this.district = district;
89
+        this.regionName = regionName;
100 90
     }
101 91
 
102 92
     public String getDetailAddress()

+ 13 - 4
baqing-shop/src/main/java/com/ruoyi/web/modules/account/service/impl/MemberAddressServiceImpl.java

@@ -105,6 +105,10 @@ public class MemberAddressServiceImpl implements IMemberAddressService
105 105
         {
106 106
             throw new ServiceException("请输入联系电话");
107 107
         }
108
+        if (StringUtils.isEmpty(address.getRegionCode()) || StringUtils.isEmpty(address.getRegionName()))
109
+        {
110
+            throw new ServiceException("请选择所在地区");
111
+        }
108 112
         if (StringUtils.isEmpty(address.getDetailAddress()))
109 113
         {
110 114
             throw new ServiceException("请输入详细地址");
@@ -117,12 +121,17 @@ public class MemberAddressServiceImpl implements IMemberAddressService
117 121
         vo.setAddressId(addr.getAddressId());
118 122
         vo.setConsigneeName(addr.getConsigneeName());
119 123
         vo.setMobile(addr.getMobile());
120
-        vo.setProvince(addr.getProvince());
121
-        vo.setCity(addr.getCity());
122
-        vo.setDistrict(addr.getDistrict());
124
+        vo.setRegionCode(addr.getRegionCode());
125
+        vo.setRegionName(addr.getRegionName());
123 126
         vo.setDetailAddress(addr.getDetailAddress());
124 127
         vo.setIsDefault(addr.getIsDefault());
125
-        vo.setFullAddress(addr.getProvince() + addr.getCity() + addr.getDistrict() + addr.getDetailAddress());
128
+        vo.setFullAddress(buildFullAddress(addr.getRegionName(), addr.getDetailAddress()));
126 129
         return vo;
127 130
     }
131
+
132
+    private String buildFullAddress(String regionName, String detailAddress)
133
+    {
134
+        String region = StringUtils.isEmpty(regionName) ? "" : regionName.replace("/", "");
135
+        return region + (detailAddress != null ? detailAddress : "");
136
+    }
128 137
 }

+ 9 - 4
baqing-shop/src/main/java/com/ruoyi/web/modules/account/service/impl/MemberServiceImpl.java

@@ -247,12 +247,17 @@ public class MemberServiceImpl implements IMemberService
247 247
         vo.setAddressId(addr.getAddressId());
248 248
         vo.setConsigneeName(addr.getConsigneeName());
249 249
         vo.setMobile(addr.getMobile());
250
-        vo.setProvince(addr.getProvince());
251
-        vo.setCity(addr.getCity());
252
-        vo.setDistrict(addr.getDistrict());
250
+        vo.setRegionCode(addr.getRegionCode());
251
+        vo.setRegionName(addr.getRegionName());
253 252
         vo.setDetailAddress(addr.getDetailAddress());
254 253
         vo.setIsDefault(addr.getIsDefault());
255
-        vo.setFullAddress(addr.getProvince() + addr.getCity() + addr.getDistrict() + addr.getDetailAddress());
254
+        vo.setFullAddress(buildFullAddress(addr.getRegionName(), addr.getDetailAddress()));
256 255
         return vo;
257 256
     }
257
+
258
+    private String buildFullAddress(String regionName, String detailAddress)
259
+    {
260
+        String region = StringUtils.isEmpty(regionName) ? "" : regionName.replace("/", "");
261
+        return region + (detailAddress != null ? detailAddress : "");
262
+    }
258 263
 }

+ 12 - 22
baqing-shop/src/main/java/com/ruoyi/web/modules/account/vo/MemberAddressVO.java

@@ -11,11 +11,11 @@ public class MemberAddressVO
11 11
 
12 12
     private String mobile;
13 13
 
14
-    private String province;
14
+    /** 省市区编码(区县级 code) */
15
+    private String regionCode;
15 16
 
16
-    private String city;
17
-
18
-    private String district;
17
+    /** 省市区名称(省/市/区 / 拼接) */
18
+    private String regionName;
19 19
 
20 20
     private String detailAddress;
21 21
 
@@ -53,34 +53,24 @@ public class MemberAddressVO
53 53
         this.mobile = mobile;
54 54
     }
55 55
 
56
-    public String getProvince()
57
-    {
58
-        return province;
59
-    }
60
-
61
-    public void setProvince(String province)
62
-    {
63
-        this.province = province;
64
-    }
65
-
66
-    public String getCity()
56
+    public String getRegionCode()
67 57
     {
68
-        return city;
58
+        return regionCode;
69 59
     }
70 60
 
71
-    public void setCity(String city)
61
+    public void setRegionCode(String regionCode)
72 62
     {
73
-        this.city = city;
63
+        this.regionCode = regionCode;
74 64
     }
75 65
 
76
-    public String getDistrict()
66
+    public String getRegionName()
77 67
     {
78
-        return district;
68
+        return regionName;
79 69
     }
80 70
 
81
-    public void setDistrict(String district)
71
+    public void setRegionName(String regionName)
82 72
     {
83
-        this.district = district;
73
+        this.regionName = regionName;
84 74
     }
85 75
 
86 76
     public String getDetailAddress()

+ 8 - 10
baqing-shop/src/main/resources/mapper/account/BizMemberAddressMapper.xml

@@ -7,9 +7,8 @@
7 7
         <result property="memberId" column="member_id"/>
8 8
         <result property="consigneeName" column="consignee_name"/>
9 9
         <result property="mobile" column="mobile"/>
10
-        <result property="province" column="province"/>
11
-        <result property="city" column="city"/>
12
-        <result property="district" column="district"/>
10
+        <result property="regionCode" column="region_code"/>
11
+        <result property="regionName" column="region_name"/>
13 12
         <result property="detailAddress" column="detail_address"/>
14 13
         <result property="isDefault" column="is_default"/>
15 14
         <result property="delFlag" column="del_flag"/>
@@ -18,14 +17,14 @@
18 17
     </resultMap>
19 18
 
20 19
     <select id="selectById" resultMap="BizMemberAddressResult">
21
-        select address_id, member_id, consignee_name, mobile, province, city, district,
20
+        select address_id, member_id, consignee_name, mobile, region_code, region_name,
22 21
                detail_address, is_default, del_flag, create_time, update_time
23 22
         from biz_member_address
24 23
         where address_id = #{addressId} and member_id = #{memberId} and del_flag = '0'
25 24
     </select>
26 25
 
27 26
     <select id="selectByMemberId" resultMap="BizMemberAddressResult">
28
-        select address_id, member_id, consignee_name, mobile, province, city, district,
27
+        select address_id, member_id, consignee_name, mobile, region_code, region_name,
29 28
                detail_address, is_default, del_flag, create_time, update_time
30 29
         from biz_member_address
31 30
         where member_id = #{memberId} and del_flag = '0'
@@ -34,10 +33,10 @@
34 33
 
35 34
     <insert id="insert" useGeneratedKeys="true" keyProperty="addressId">
36 35
         insert into biz_member_address (
37
-            member_id, consignee_name, mobile, province, city, district, detail_address,
36
+            member_id, consignee_name, mobile, region_code, region_name, detail_address,
38 37
             is_default, del_flag, create_time, update_time
39 38
         ) values (
40
-            #{memberId}, #{consigneeName}, #{mobile}, #{province}, #{city}, #{district}, #{detailAddress},
39
+            #{memberId}, #{consigneeName}, #{mobile}, #{regionCode}, #{regionName}, #{detailAddress},
41 40
             #{isDefault}, '0', sysdate(), sysdate()
42 41
         )
43 42
     </insert>
@@ -47,9 +46,8 @@
47 46
         <set>
48 47
             <if test="consigneeName != null">consignee_name = #{consigneeName},</if>
49 48
             <if test="mobile != null">mobile = #{mobile},</if>
50
-            <if test="province != null">province = #{province},</if>
51
-            <if test="city != null">city = #{city},</if>
52
-            <if test="district != null">district = #{district},</if>
49
+            <if test="regionCode != null">region_code = #{regionCode},</if>
50
+            <if test="regionName != null">region_name = #{regionName},</if>
53 51
             <if test="detailAddress != null">detail_address = #{detailAddress},</if>
54 52
             <if test="isDefault != null">is_default = #{isDefault},</if>
55 53
             update_time = sysdate()

+ 2 - 0
baqing-shop/src/test/java/com/ruoyi/web/modules/account/service/MemberAddressServiceImplTest.java

@@ -40,6 +40,8 @@ class MemberAddressServiceImplTest
40 40
         BizMemberAddress addr = new BizMemberAddress();
41 41
         addr.setConsigneeName("张三");
42 42
         addr.setMobile("17700001111");
43
+        addr.setRegionCode("110101");
44
+        addr.setRegionName("北京市/市辖区/东城区");
43 45
         addr.setDetailAddress("详细地址");
44 46
         addr.setIsDefault(MemberConstants.DEFAULT_YES);
45 47
 

+ 5 - 7
doc/平台后台/会员管理/会员管理技术方案.md

@@ -142,9 +142,8 @@ sys_user(账号:user_name/phonenumber/nick_name/password/avatar/status)
142 142
 | member_id | bigint | FK |
143 143
 | consignee_name | varchar(64) | 收货人 |
144 144
 | mobile | varchar(20) | 联系电话 |
145
-| province | varchar(32) | 省 |
146
-| city | varchar(32) | 市 |
147
-| district | varchar(32) | 区 |
145
+| region_code | varchar(64) | 省市区编码(区县级 code) |
146
+| region_name | varchar(128) | 省市区名称(省/市/区 / 拼接) |
148 147
 | detail_address | varchar(256) | 详细地址 |
149 148
 | is_default | char(1) | 0 否 1 是;每会员至多一条默认 |
150 149
 | del_flag | char(1) | 0 存在 2 删除 |
@@ -270,9 +269,8 @@ CREATE TABLE `biz_member` (
270 269
       "addressId": 10,
271 270
       "consigneeName": "张三",
272 271
       "mobile": "17712349136",
273
-      "province": "西藏自治区",
274
-      "city": "那曲市",
275
-      "district": "比如县",
272
+      "regionCode": "540622",
273
+      "regionName": "西藏自治区/那曲市/比如县",
276 274
       "detailAddress": "某某路1号",
277 275
       "isDefault": "1",
278 276
       "fullAddress": "西藏自治区那曲市比如县某某路1号"
@@ -451,4 +449,4 @@ WHERE member_id = #{memberId} AND order_status = '3' AND del_flag = '0'
451 449
 
452 450
 ---
453 451
 
454
-*文档版本:v1.3 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · C 端注册/登录见《消费者APP/会员注册登录/会员注册登录技术方案.md》v1.2 · 关联《会员管理功能需求.md》v1.1、《会员管理测试用例.md》v1.1*
452
+*文档版本:v1.4 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · 地址表 `region_code`/`region_name` · C 端注册/登录见《消费者APP/会员注册登录/会员注册登录技术方案.md》v1.2 · 关联《会员管理功能需求.md》v1.1、《会员管理测试用例.md》v1.1*

+ 2 - 2
doc/消费者APP/我的服务/我的服务前端技术方案.md

@@ -99,7 +99,7 @@
99 99
 
100 100
 **密码 Body:** `oldPassword`、`newPassword`、`confirmPassword`。
101 101
 
102
-**地址 Body:** `consigneeName`、`mobile`、`province`、`city`、`district`、`detailAddress`、`isDefault`(`0`/`1`)。
102
+**地址 Body:** `consigneeName`、`mobile`、`regionCode`、`regionName`、`detailAddress`、`isDefault`(`0`/`1`)。
103 103
 
104 104
 ### 4.2 入驻 `/api/merchant/entry`
105 105
 
@@ -155,7 +155,7 @@
155 155
 | MS-A1~A4 | 地址默认互斥、删除确认 |
156 156
 | MS-E5~E9 | 协议勾选、阻塞待审、提交确认 |
157 157
 
158
-**地区:** 手填省/市/区生成 `bizRegionCode` / `bizRegionName`;后续可接级联字典
158
+**地区:** `regionCode` = 区县 `code`;`regionName` = 省/市/区 `/` 拼接(与商户 `biz_region_*` 一致);UI 暂用手填三栏,后续可接 `GET /api/region/tree` 级联
159 159
 
160 160
 ---
161 161
 

+ 7 - 5
doc/消费者APP/我的服务/我的服务技术方案.md

@@ -123,7 +123,8 @@ Header:`Authorization: Bearer {token}`(与平台 `TokenService` 一致)。
123 123
 | member_id | bigint | FK → `biz_member.member_id` |
124 124
 | consignee_name | varchar(64) | 收货人 |
125 125
 | mobile | varchar(20) | 联系电话 |
126
-| province / city / district | varchar(32) | 省市区 |
126
+| region_code | varchar(64) | 省市区编码(区县级 code) |
127
+| region_name | varchar(128) | 省市区名称(省/市/区 / 拼接) |
127 128
 | detail_address | varchar(256) | 详细地址 |
128 129
 | is_default | char(1) | **0** 否 **1** 是;同会员 **至多一条** 为 1 |
129 130
 | del_flag | char(1) | **0** 存在 **2** 逻辑删除 |
@@ -259,9 +260,9 @@ sys_user ──1:1── biz_member ──1:N── biz_member_address
259 260
 |------|------|
260 261
 | addressId | |
261 262
 | consigneeName、mobile | |
262
-| province、city、district、detailAddress | |
263
+| regionCode、regionName、detailAddress | |
263 264
 | isDefault | 0/1 |
264
-| fullAddress | 省+市+区+详细(拼接) |
265
+| fullAddress | regionName(去 `/`)+ 详细地址 |
265 266
 
266 267
 #### `POST /api/member/address` / `PUT /api/member/address`
267 268
 
@@ -269,7 +270,7 @@ sys_user ──1:1── biz_member ──1:N── biz_member_address
269 270
 |-----------|:----:|
270 271
 | addressId | PUT 必填 |
271 272
 | consigneeName、mobile | 是 |
272
-| province、city、district | 是 |
273
+| regionCode、regionName | 是;须 **成对** 非空 |
273 274
 | detailAddress | 是 |
274 275
 | isDefault | 否;为 1 时 **同事务** `clearDefault` |
275 276
 
@@ -465,10 +466,11 @@ submitApply(memberId, dto)
465 466
 
466 467
 | 版本 | 说明 |
467 468
 |------|------|
469
+| **v1.3** | `biz_member_address`:`province/city/district` → **`region_code`/`region_name`** |
468 470
 | **v1.2** | 移除 **birthday**(个人资料不含出生日期) |
469 471
 | **v1.1** | email/sex 存 **sys_user**;`PUT /password`;`MemberProfileAppVO` |
470 472
 | **v1.0** | 首版 |
471 473
 
472 474
 ---
473 475
 
474
-*文档版本:v1.2 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · 关联《我的服务功能需求.md》v1.1*
476
+*文档版本:v1.3 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · 关联《我的服务功能需求.md》v1.1*

+ 2 - 3
sql/biz_member.sql

@@ -25,9 +25,8 @@ CREATE TABLE IF NOT EXISTS `biz_member_address` (
25 25
   `member_id` bigint(20) NOT NULL COMMENT '会员ID(biz_member.member_id = sys_user.user_id)',
26 26
   `consignee_name` varchar(64) NOT NULL COMMENT '收货人姓名',
27 27
   `mobile` varchar(20) NOT NULL COMMENT '收货联系电话',
28
-  `province` varchar(32) NOT NULL DEFAULT '' COMMENT '省',
29
-  `city` varchar(32) NOT NULL DEFAULT '' COMMENT '市',
30
-  `district` varchar(32) NOT NULL DEFAULT '' COMMENT '区/县',
28
+  `region_code` varchar(64) NOT NULL DEFAULT '' COMMENT '省市区编码(区县级 code)',
29
+  `region_name` varchar(128) NOT NULL DEFAULT '' COMMENT '省市区名称(省/市/区 / 拼接)',
31 30
   `detail_address` varchar(256) NOT NULL COMMENT '详细地址',
32 31
   `is_default` char(1) NOT NULL DEFAULT '0' COMMENT '是否默认地址:0否 1是',
33 32
   `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '删除标志:0存在 2逻辑删除',