Procházet zdrojové kódy

商品管理后端代码

wwh před 3 týdny
rodič
revize
dc10852b1b

+ 2 - 2
baqing-shop/src/main/java/com/ruoyi/web/modules/account/constant/MemberConstants.java

@@ -26,10 +26,10 @@ public final class MemberConstants
26 26
     /** 订单已完成(O11 统计口径) */
27 27
     public static final String ORDER_STATUS_COMPLETED = "3";
28 28
 
29
-    public static final String DEFAULT_MEMBER_LEVEL = "普通";
30
-
31 29
     public static final String DICT_MEMBER_STATUS = "biz_member_status";
32 30
 
31
+    public static final String DICT_MEMBER_LEVEL = "biz_member_level";
32
+
33 33
     public static final String REDIS_SMS_PREFIX = "member:sms:";
34 34
 
35 35
     public static final String REDIS_TOKEN_PREFIX = "member:token:";

+ 18 - 4
baqing-shop/src/main/java/com/ruoyi/web/modules/account/domain/BizMember.java

@@ -16,11 +16,15 @@ public class BizMember extends BaseEntity
16 16
 
17 17
     private String mobile;
18 18
 
19
+    /** 会员名称 */
20
+    private String memberCode;
21
+
19 22
     private String nickName;
20 23
 
21 24
     private String password;
22 25
 
23
-    private String memberLevel;
26
+    /** 会员等级(字典 biz_member_level,选填) */
27
+    private Integer memberLevel;
24 28
 
25 29
     private String status;
26 30
 
@@ -35,7 +39,7 @@ public class BizMember extends BaseEntity
35 39
 
36 40
     private String delFlag;
37 41
 
38
-    /** 列表检索:昵称或手机号模糊 */
42
+    /** 列表检索:会员名称、昵称或手机号模糊 */
39 43
     private String keyword;
40 44
 
41 45
     public Long getMemberId()
@@ -58,6 +62,16 @@ public class BizMember extends BaseEntity
58 62
         this.mobile = mobile;
59 63
     }
60 64
 
65
+    public String getMemberCode()
66
+    {
67
+        return memberCode;
68
+    }
69
+
70
+    public void setMemberCode(String memberCode)
71
+    {
72
+        this.memberCode = memberCode;
73
+    }
74
+
61 75
     public String getNickName()
62 76
     {
63 77
         return nickName;
@@ -78,12 +92,12 @@ public class BizMember extends BaseEntity
78 92
         this.password = password;
79 93
     }
80 94
 
81
-    public String getMemberLevel()
95
+    public Integer getMemberLevel()
82 96
     {
83 97
         return memberLevel;
84 98
     }
85 99
 
86
-    public void setMemberLevel(String memberLevel)
100
+    public void setMemberLevel(Integer memberLevel)
87 101
     {
88 102
         this.memberLevel = memberLevel;
89 103
     }

+ 13 - 0
baqing-shop/src/main/java/com/ruoyi/web/modules/account/dto/MemberRegisterDTO.java

@@ -13,6 +13,9 @@ public class MemberRegisterDTO
13 13
 
14 14
     private String nickName;
15 15
 
16
+    /** 会员名称(可选,未填则与昵称或默认规则一致) */
17
+    private String memberCode;
18
+
16 19
     public String getMobile()
17 20
     {
18 21
         return mobile;
@@ -52,4 +55,14 @@ public class MemberRegisterDTO
52 55
     {
53 56
         this.nickName = nickName;
54 57
     }
58
+
59
+    public String getMemberCode()
60
+    {
61
+        return memberCode;
62
+    }
63
+
64
+    public void setMemberCode(String memberCode)
65
+    {
66
+        this.memberCode = memberCode;
67
+    }
55 68
 }

+ 30 - 2
baqing-shop/src/main/java/com/ruoyi/web/modules/account/service/impl/MemberAppServiceImpl.java

@@ -53,11 +53,13 @@ public class MemberAppServiceImpl implements IMemberAppService
53 53
         {
54 54
             throw new ServiceException("验证码错误或已过期");
55 55
         }
56
+        String defaultName = "用户" + dto.getMobile().substring(7);
57
+        String memberName = resolveMemberName(dto.getMemberCode(), dto.getNickName(), defaultName);
56 58
         BizMember member = new BizMember();
57 59
         member.setMobile(dto.getMobile());
58
-        member.setNickName(StringUtils.isEmpty(dto.getNickName()) ? "用户" + dto.getMobile().substring(7) : dto.getNickName());
60
+        member.setMemberCode(memberName);
61
+        member.setNickName(StringUtils.isEmpty(dto.getNickName()) ? memberName : dto.getNickName());
59 62
         member.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
60
-        member.setMemberLevel(MemberConstants.DEFAULT_MEMBER_LEVEL);
61 63
         member.setStatus(MemberConstants.STATUS_ENABLED);
62 64
         member.setOrderCount(0);
63 65
         member.setTotalAmount(BigDecimal.ZERO);
@@ -115,6 +117,14 @@ public class MemberAppServiceImpl implements IMemberAppService
115 117
         }
116 118
         BizMember update = new BizMember();
117 119
         update.setMemberId(memberId);
120
+        if (StringUtils.isNotEmpty(profile.getMemberCode()))
121
+        {
122
+            if (profile.getMemberCode().length() > 64)
123
+            {
124
+                throw new ServiceException("会员名称过长");
125
+            }
126
+            update.setMemberCode(profile.getMemberCode());
127
+        }
118 128
         update.setNickName(profile.getNickName());
119 129
         update.setAvatar(profile.getAvatar());
120 130
         if (StringUtils.isNotEmpty(profile.getPassword()))
@@ -142,5 +152,23 @@ public class MemberAppServiceImpl implements IMemberAppService
142 152
         {
143 153
             throw new ServiceException("手机号格式不正确");
144 154
         }
155
+        String name = StringUtils.isNotEmpty(dto.getMemberCode()) ? dto.getMemberCode() : dto.getNickName();
156
+        if (StringUtils.isNotEmpty(name) && name.length() > 64)
157
+        {
158
+            throw new ServiceException("会员名称过长");
159
+        }
160
+    }
161
+
162
+    private String resolveMemberName(String memberCode, String nickName, String defaultName)
163
+    {
164
+        if (StringUtils.isNotEmpty(memberCode))
165
+        {
166
+            return memberCode;
167
+        }
168
+        if (StringUtils.isNotEmpty(nickName))
169
+        {
170
+            return nickName;
171
+        }
172
+        return defaultName;
145 173
     }
146 174
 }

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

@@ -59,9 +59,10 @@ public class MemberServiceImpl implements IMemberService
59 59
         }
60 60
         MemberDetailVO vo = new MemberDetailVO();
61 61
         vo.setMemberId(member.getMemberId());
62
+        vo.setMemberCode(member.getMemberCode());
62 63
         vo.setNickName(member.getNickName());
63 64
         vo.setMobile(member.getMobile());
64
-        vo.setMemberLevel(member.getMemberLevel());
65
+        fillMemberLevel(vo, member);
65 66
         vo.setStatus(member.getStatus());
66 67
         vo.setOrderCount(member.getOrderCount());
67 68
         vo.setTotalAmount(member.getTotalAmount());
@@ -134,9 +135,10 @@ public class MemberServiceImpl implements IMemberService
134 135
     {
135 136
         MemberListVO vo = new MemberListVO();
136 137
         vo.setMemberId(m.getMemberId());
138
+        vo.setMemberCode(m.getMemberCode());
137 139
         vo.setNickName(m.getNickName());
138 140
         vo.setMobile(maskMobile ? MemberMobileUtils.mask(m.getMobile()) : m.getMobile());
139
-        vo.setMemberLevel(m.getMemberLevel());
141
+        fillMemberLevel(vo, m);
140 142
         vo.setStatus(m.getStatus());
141 143
         String label = DictUtils.getDictLabel(MemberConstants.DICT_MEMBER_STATUS, m.getStatus());
142 144
         if (StringUtils.isEmpty(label))
@@ -150,6 +152,28 @@ public class MemberServiceImpl implements IMemberService
150 152
         return vo;
151 153
     }
152 154
 
155
+    private void fillMemberLevel(MemberListVO vo, BizMember m)
156
+    {
157
+        vo.setMemberLevel(m.getMemberLevel());
158
+        if (m.getMemberLevel() != null)
159
+        {
160
+            String label = DictUtils.getDictLabel(MemberConstants.DICT_MEMBER_LEVEL,
161
+                    String.valueOf(m.getMemberLevel()));
162
+            vo.setMemberLevelLabel(StringUtils.isNotEmpty(label) ? label : String.valueOf(m.getMemberLevel()));
163
+        }
164
+    }
165
+
166
+    private void fillMemberLevel(MemberDetailVO vo, BizMember m)
167
+    {
168
+        vo.setMemberLevel(m.getMemberLevel());
169
+        if (m.getMemberLevel() != null)
170
+        {
171
+            String label = DictUtils.getDictLabel(MemberConstants.DICT_MEMBER_LEVEL,
172
+                    String.valueOf(m.getMemberLevel()));
173
+            vo.setMemberLevelLabel(StringUtils.isNotEmpty(label) ? label : String.valueOf(m.getMemberLevel()));
174
+        }
175
+    }
176
+
153 177
     private MemberAddressVO toAddressVo(BizMemberAddress addr)
154 178
     {
155 179
         MemberAddressVO vo = new MemberAddressVO();

+ 27 - 3
baqing-shop/src/main/java/com/ruoyi/web/modules/account/vo/MemberDetailVO.java

@@ -13,11 +13,15 @@ public class MemberDetailVO
13 13
 {
14 14
     private Long memberId;
15 15
 
16
+    private String memberCode;
17
+
16 18
     private String nickName;
17 19
 
18 20
     private String mobile;
19 21
 
20
-    private String memberLevel;
22
+    private Integer memberLevel;
23
+
24
+    private String memberLevelLabel;
21 25
 
22 26
     private String status;
23 27
 
@@ -42,6 +46,16 @@ public class MemberDetailVO
42 46
         this.memberId = memberId;
43 47
     }
44 48
 
49
+    public String getMemberCode()
50
+    {
51
+        return memberCode;
52
+    }
53
+
54
+    public void setMemberCode(String memberCode)
55
+    {
56
+        this.memberCode = memberCode;
57
+    }
58
+
45 59
     public String getNickName()
46 60
     {
47 61
         return nickName;
@@ -62,16 +76,26 @@ public class MemberDetailVO
62 76
         this.mobile = mobile;
63 77
     }
64 78
 
65
-    public String getMemberLevel()
79
+    public Integer getMemberLevel()
66 80
     {
67 81
         return memberLevel;
68 82
     }
69 83
 
70
-    public void setMemberLevel(String memberLevel)
84
+    public void setMemberLevel(Integer memberLevel)
71 85
     {
72 86
         this.memberLevel = memberLevel;
73 87
     }
74 88
 
89
+    public String getMemberLevelLabel()
90
+    {
91
+        return memberLevelLabel;
92
+    }
93
+
94
+    public void setMemberLevelLabel(String memberLevelLabel)
95
+    {
96
+        this.memberLevelLabel = memberLevelLabel;
97
+    }
98
+
75 99
     public String getStatus()
76 100
     {
77 101
         return status;

+ 27 - 3
baqing-shop/src/main/java/com/ruoyi/web/modules/account/vo/MemberListVO.java

@@ -11,11 +11,15 @@ public class MemberListVO
11 11
 {
12 12
     private Long memberId;
13 13
 
14
+    private String memberCode;
15
+
14 16
     private String nickName;
15 17
 
16 18
     private String mobile;
17 19
 
18
-    private String memberLevel;
20
+    private Integer memberLevel;
21
+
22
+    private String memberLevelLabel;
19 23
 
20 24
     private String status;
21 25
 
@@ -38,6 +42,16 @@ public class MemberListVO
38 42
         this.memberId = memberId;
39 43
     }
40 44
 
45
+    public String getMemberCode()
46
+    {
47
+        return memberCode;
48
+    }
49
+
50
+    public void setMemberCode(String memberCode)
51
+    {
52
+        this.memberCode = memberCode;
53
+    }
54
+
41 55
     public String getNickName()
42 56
     {
43 57
         return nickName;
@@ -58,16 +72,26 @@ public class MemberListVO
58 72
         this.mobile = mobile;
59 73
     }
60 74
 
61
-    public String getMemberLevel()
75
+    public Integer getMemberLevel()
62 76
     {
63 77
         return memberLevel;
64 78
     }
65 79
 
66
-    public void setMemberLevel(String memberLevel)
80
+    public void setMemberLevel(Integer memberLevel)
67 81
     {
68 82
         this.memberLevel = memberLevel;
69 83
     }
70 84
 
85
+    public String getMemberLevelLabel()
86
+    {
87
+        return memberLevelLabel;
88
+    }
89
+
90
+    public void setMemberLevelLabel(String memberLevelLabel)
91
+    {
92
+        this.memberLevelLabel = memberLevelLabel;
93
+    }
94
+
71 95
     public String getStatus()
72 96
     {
73 97
         return status;

+ 12 - 4
baqing-shop/src/main/resources/mapper/account/BizMemberMapper.xml

@@ -5,6 +5,7 @@
5 5
     <resultMap id="BizMemberResult" type="com.ruoyi.web.modules.account.domain.BizMember">
6 6
         <id property="memberId" column="member_id"/>
7 7
         <result property="mobile" column="mobile"/>
8
+        <result property="memberCode" column="member_code"/>
8 9
         <result property="nickName" column="nick_name"/>
9 10
         <result property="password" column="password"/>
10 11
         <result property="memberLevel" column="member_level"/>
@@ -22,7 +23,7 @@
22 23
     </resultMap>
23 24
 
24 25
     <sql id="selectVo">
25
-        select member_id, mobile, nick_name, password, member_level, status, order_count, total_amount,
26
+        select member_id, mobile, member_code, nick_name, password, member_level, status, order_count, total_amount,
26 27
                register_time, avatar, del_flag, create_by, create_time, update_by, update_time, remark
27 28
         from biz_member
28 29
     </sql>
@@ -44,7 +45,9 @@
44 45
             and status = #{status}
45 46
         </if>
46 47
         <if test="keyword != null and keyword != ''">
47
-            and (nick_name like concat('%', #{keyword}, '%') or mobile like concat('%', #{keyword}, '%'))
48
+            and (member_code like concat('%', #{keyword}, '%')
49
+                or nick_name like concat('%', #{keyword}, '%')
50
+                or mobile like concat('%', #{keyword}, '%'))
48 51
         </if>
49 52
         order by register_time desc
50 53
     </select>
@@ -65,10 +68,14 @@
65 68
 
66 69
     <insert id="insert" useGeneratedKeys="true" keyProperty="memberId">
67 70
         insert into biz_member (
68
-            mobile, nick_name, password, member_level, status, order_count, total_amount,
71
+            mobile, member_code, nick_name, password,
72
+            <if test="memberLevel != null">member_level,</if>
73
+            status, order_count, total_amount,
69 74
             register_time, avatar, del_flag, create_by, create_time
70 75
         ) values (
71
-            #{mobile}, #{nickName}, #{password}, #{memberLevel}, #{status}, #{orderCount}, #{totalAmount},
76
+            #{mobile}, #{memberCode}, #{nickName}, #{password},
77
+            <if test="memberLevel != null">#{memberLevel},</if>
78
+            #{status}, #{orderCount}, #{totalAmount},
72 79
             #{registerTime}, #{avatar}, '0', #{createBy}, sysdate()
73 80
         )
74 81
     </insert>
@@ -76,6 +83,7 @@
76 83
     <update id="update">
77 84
         update biz_member
78 85
         <set>
86
+            <if test="memberCode != null">member_code = #{memberCode},</if>
79 87
             <if test="nickName != null">nick_name = #{nickName},</if>
80 88
             <if test="password != null and password != ''">password = #{password},</if>
81 89
             <if test="avatar != null">avatar = #{avatar},</if>

+ 9 - 7
doc/农资商城web/会员管理/会员管理功能需求.md

@@ -63,9 +63,10 @@ C 端用户(手机号注册会员)
63 63
 | 概念 | 说明 |
64 64
 |------|------|
65 65
 | **会员(买家)** | 在 C 端 **手机号注册** 的个人用户,用于浏览、下单 |
66
-| 会员名称 | C 端展示用名称,一般为 **昵称**;列表可与手机号组合展示 |
66
+| 会员名称 | 存于 **`member_code`**;C 端展示用名称;列表可与手机号组合展示 |
67
+| 昵称 | 存于 **`nick_name`**;可与会员名称相同;C 端资料可选修改 |
67 68
 | 手机号 | 注册与登录账号;**全平台唯一**(未注销/未删除会员) |
68
-| 会员等级 | 会员分层标识(如普通/VIP);**展示与筛选**;等级规则、升级条件若未单独成稿,首期 **只读展示** 或运营后台配置后展示 |
69
+| 会员等级 | **选填**;存库为 `tinyint`,对接字典 `biz_member_level`(如 0=普通);无等级时为 NULL |
69 70
 | 是否启用 | 平台是否允许该会员 **登录 C 端 / 下单**;**否** 时禁用 |
70 71
 | 累计消费次数 | 统计口径:**已完成**(或产品定义的「有效消费」)订单笔数,**由订单模块汇总** |
71 72
 | 累计消费金额 | 上述订单 **实付金额** 合计 |
@@ -104,8 +105,8 @@ C 端用户(手机号注册会员)
104 105
 
105 106
 | 字段 | 说明 |
106 107
 |------|------|
107
-| 会员名称 | 昵称等;可与手机号脱敏组合展示(如原型「昵称 + 177****9136」) |
108
-| 会员等级 | 文本或标签 |
108
+| 会员名称 | `member_code`;可与手机号脱敏组合展示(如「用户A + 177****9136」) |
109
+| 会员等级 | 字典值(tinyint)+ 展示文案;**无等级时为空** |
109 110
 | 是否启用 | 开关或「是/否」 |
110 111
 | 累计消费次数 | 非负整数 |
111 112
 | 累计消费金额 | 金额,2 位小数 |
@@ -141,8 +142,9 @@ C 端用户(手机号注册会员)
141 142
 
142 143
 | 字段 | 说明 |
143 144
 |------|------|
144
-| 会员名称 | 昵称 |
145
-| 会员等级 | 当前等级 |
145
+| 会员名称 | `member_code` |
146
+| 昵称 | `nick_name`(若有) |
147
+| 会员等级 | 当前等级(选填,无则展示空) |
146 148
 | 手机号 | 完整或脱敏(平台端通常可查看完整,须权限控制) |
147 149
 | 是否启用 | 当前状态 |
148 150
 | 累计消费次数 / 金额 | 与列表一致,只读 |
@@ -346,4 +348,4 @@ C 端:禁止下单(含购物车、立即购买)
346 348
 
347 349
 ---
348 350
 
349
-*文档版本:v1.0(定稿)· 关联《会员管理技术方案.md》v1.0、《会员管理测试用例.md》v1.0、《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0、《订单管理测试用例.md》v1.0、《关联需求分析.md》v1.2 · 草稿《会员管理功能需求-草稿.md》保持不变。*
351
+*文档版本:v1.0.1(定稿)· v1.0.1:会员名称落库字段 `member_code`(`nick_name` 仍为昵称)· 关联《会员管理技术方案.md》v1.0.1、《会员管理测试用例.md》v1.0、《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0、《订单管理测试用例.md》v1.0、《关联需求分析.md》v1.2 · 草稿《会员管理功能需求-草稿.md》保持不变。*

+ 14 - 11
doc/农资商城web/会员管理/会员管理技术方案.md

@@ -97,9 +97,10 @@ biz_member(本模块)
97 97
 |------|------|------|
98 98
 | member_id | bigint PK | |
99 99
 | mobile | varchar(20) | 注册手机号;**`del_flag=0` 唯一** |
100
-| nick_name | varchar(64) | 昵称/会员名称 |
100
+| member_code | varchar(64) | **会员名称**(C 端展示、列表检索) |
101
+| nick_name | varchar(64) | 昵称(可与会员名称相同;C 端资料可选) |
101 102
 | password | varchar(100) | BCrypt;平台 **不可改**(C 端自助) |
102
-| member_level | varchar(32) | 展示用;默认 `普通`(M13 非本期配置则写死或字典只读) |
103
+| member_level | tinyint | **选填**;字典 `biz_member_level` 字典值(如 0=普通);NULL 表示未设置 |
103 104
 | status | char(1) | **0 启用 1 禁用**(M4) |
104 105
 | order_count | int | 已完成订单笔数;默认 0 |
105 106
 | total_amount | decimal(12,2) | 已完成实付合计;默认 0.00 |
@@ -141,9 +142,10 @@ biz_member(本模块)
141 142
 CREATE TABLE `biz_member` (
142 143
   `member_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '会员ID',
143 144
   `mobile` varchar(20) NOT NULL COMMENT '手机号',
145
+  `member_code` varchar(64) NOT NULL DEFAULT '' COMMENT '会员名称',
144 146
   `nick_name` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称',
145 147
   `password` varchar(100) NOT NULL COMMENT '密码BCrypt',
146
-  `member_level` varchar(32) NOT NULL DEFAULT '普通' COMMENT '会员等级展示',
148
+  `member_level` tinyint(4) DEFAULT NULL COMMENT '会员等级(字典 biz_member_level,选填)',
147 149
   `status` char(1) NOT NULL DEFAULT '0' COMMENT '0启用1禁用',
148 150
   `order_count` int(11) NOT NULL DEFAULT '0' COMMENT '已完成订单笔数',
149 151
   `total_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '已完成实付合计',
@@ -185,7 +187,7 @@ CREATE TABLE `biz_member_address` (
185 187
 | dict_type | 用途 |
186 188
 |-----------|------|
187 189
 | biz_member_status | `status`:0 启用 / 1 禁用 |
188
-| biz_member_level | `member_level`(首期可仅配置「普通」) |
190
+| biz_member_level | `member_level`(tinyint;如 0=普通;选填) |
189 191
 
190 192
 ---
191 193
 
@@ -211,7 +213,7 @@ CREATE TABLE `biz_member_address` (
211 213
 | Query | 说明 |
212 214
 |-------|------|
213 215
 | pageNum, pageSize | 分页 |
214
-| keyword | 可选;**昵称或手机号** 模糊(M11) |
216
+| keyword | 可选;**会员名称、昵称或手机号** 模糊(M11) |
215 217
 | status | 可选;0/1 |
216 218
 
217 219
 **过滤:** `del_flag='0'`。  
@@ -221,9 +223,9 @@ CREATE TABLE `biz_member_address` (
221 223
 
222 224
 | 字段 | 说明 |
223 225
 |------|------|
224
-| memberId, nickName | |
226
+| memberId, memberCode, nickName | memberCode 为会员名称 |
225 227
 | mobile | 脱敏 |
226
-| memberLevel | |
228
+| memberLevel, memberLevelLabel | memberLevel 为 tinyint 字典值,可空;label 为展示文案 |
227 229
 | status, statusLabel | 字典 |
228 230
 | orderCount, totalAmount | 来自冗余字段(与 O11 一致) |
229 231
 | registerTime | |
@@ -233,9 +235,10 @@ CREATE TABLE `biz_member_address` (
233 235
 ```json
234 236
 {
235 237
   "memberId": 1,
238
+  "memberCode": "用户A",
236 239
   "nickName": "用户A",
237 240
   "mobile": "17712349136",
238
-  "memberLevel": "普通",
241
+  "memberLevel": null,
239 242
   "status": "0",
240 243
   "orderCount": 3,
241 244
   "totalAmount": 1280.50,
@@ -316,7 +319,7 @@ CREATE TABLE `biz_member_address` (
316 319
 | POST | `/api/member/register` | 手机号+验证码+密码 → 写 `biz_member` |
317 320
 | POST | `/api/member/login` | 手机号+密码;校验 `status=0` |
318 321
 | GET | `/api/member/profile` | 当前会员资料 |
319
-| PUT | `/api/member/profile` | 改昵称、头像等 |
322
+| PUT | `/api/member/profile` | 改会员名称(memberCode)、昵称、头像等 |
320 323
 | GET | `/api/member/address/list` | 地址列表 |
321 324
 | POST/PUT/DELETE | `/api/member/address` | 地址 CRUD;设默认 |
322 325
 
@@ -398,10 +401,10 @@ WHERE member_id = #{memberId} AND order_status = '已完成' AND del_flag = '0'
398 401
 | M6 订单不写 | 无发货类接口 |
399 402
 | M7 与经营账号隔离 | 分表、无 FK |
400 403
 | M9 订单仅当前会员 | `member_id` 强制过滤 |
401
-| M11 检索 | `keyword` |
404
+| M11 检索 | `keyword` 匹配 `member_code` / `nick_name` / `mobile` |
402 405
 | M12 订单检索 | §3.5 Query |
403 406
 | M14 地址只读(平台) | 详情 `addressList`;C 端 §4 维护 |
404 407
 
405 408
 ---
406 409
 
407
-*文档版本:v1.0 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · 关联《会员管理功能需求.md》v1.0、《会员管理测试用例.md》v1.0、《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0、《关联需求分析.md》v1.2*
410
+*文档版本:v1.0.1 · MySQL 5.7.39 · RuoYi v3.9.2-springboot2 · v1.0.1:`biz_member.member_code`(会员名称)· 关联《会员管理功能需求.md》v1.0.1、《会员管理测试用例.md》v1.0、《订单管理功能需求.md》v1.0.1、《订单管理技术方案.md》v1.0、《关联需求分析.md》v1.2*

+ 17 - 7
doc/农资商城web/会员管理/会员管理测试用例.md

@@ -80,16 +80,26 @@
80 80
 | **测试步骤** | `updateStatus(1)` 禁用 |
81 81
 | **预期结果** | 订单 status 仍为 1;**不** 调 OrderFacade.close |
82 82
 
83
-### MEM-UT-007 列表 keyword 匹配
83
+### MEM-UT-007 列表 keyword 匹配会员名
84 84
 
85 85
 | 要素 | 内容 |
86 86
 |------|------|
87 87
 | **测试项** | listMembers |
88 88
 | **测试目的** | 验证 M11 |
89
-| **前置条件** | nick_name 含「张三」 |
89
+| **前置条件** | member_code 含「张三」 |
90 90
 | **测试步骤** | keyword=张三 |
91 91
 | **预期结果** | 命中 |
92 92
 
93
+### MEM-UT-007a 列表 keyword 匹配昵称
94
+
95
+| 要素 | 内容 |
96
+|------|------|
97
+| **测试项** | listMembers |
98
+| **测试目的** | 验证 M11 |
99
+| **前置条件** | nick_name 含「李四」且 member_code 不含 |
100
+| **测试步骤** | keyword=李四 |
101
+| **预期结果** | 命中 |
102
+
93 103
 ### MEM-UT-008 列表 keyword 匹配手机号
94 104
 
95 105
 | 要素 | 内容 |
@@ -171,8 +181,8 @@
171 181
 | **测试项** | GET /list |
172 182
 | **测试目的** | 验证 M11 |
173 183
 | **前置条件** | — |
174
-| **测试步骤** | keyword=测试昵称 |
175
-| **预期结果** | 命中 |
184
+| **测试步骤** | keyword=测试会员名 |
185
+| **预期结果** | 按 member_code / nick_name 命中 |
176 186
 
177 187
 ### MEM-API-004 status 筛选禁用会员
178 188
 
@@ -192,7 +202,7 @@
192 202
 | **测试目的** | 验证 §5 |
193 203
 | **前置条件** | 有地址 |
194 204
 | **测试步骤** | GET 详情 |
195
-| **预期结果** | nickName、mobile 完整号、addressList、isDefault 标记 |
205
+| **预期结果** | memberCode、nickName、mobile 完整号、addressList、isDefault 标记 |
196 206
 
197 207
 ### MEM-API-006 会员不存在
198 208
 
@@ -299,7 +309,7 @@
299 309
 | **测试目的** | C 端 |
300 310
 | **前置条件** | 新手机号;验证码正确 |
301 311
 | **测试步骤** | register |
302
-| **预期结果** | biz_member 新增;register_time 有值 |
312
+| **预期结果** | biz_member 新增;`member_code` 有值;register_time 有值 |
303 313
 
304 314
 ### MEM-API-017 C 端登录启用会员
305 315
 
@@ -351,7 +361,7 @@
351 361
 |------|------|
352 362
 | **测试工具** | Playwright |
353 363
 | **测试步骤** | 进入会员管理列表 |
354
-| **预期结果** | 列含昵称、等级、启用、消费次数/金额、注册日期、操作 |
364
+| **预期结果** | 列含会员名称(memberCode)、等级、启用、消费次数/金额、注册日期、操作 |
355 365
 
356 366
 ### MEM-UI-002 列表禁用二次确认
357 367
 

+ 2 - 1
sql/biz_member.sql

@@ -2,9 +2,10 @@
2 2
 CREATE TABLE IF NOT EXISTS `biz_member` (
3 3
   `member_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '会员ID',
4 4
   `mobile` varchar(20) NOT NULL COMMENT '手机号',
5
+  `member_code` varchar(64) NOT NULL DEFAULT '' COMMENT '会员名称',
5 6
   `nick_name` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称',
6 7
   `password` varchar(100) NOT NULL COMMENT '密码BCrypt',
7
-  `member_level` varchar(32) NOT NULL DEFAULT '普通' COMMENT '会员等级展示',
8
+  `member_level` tinyint(4) DEFAULT NULL COMMENT '会员等级(字典 biz_member_level,选填)',
8 9
   `status` char(1) NOT NULL DEFAULT '0' COMMENT '0启用1禁用',
9 10
   `order_count` int(11) NOT NULL DEFAULT '0' COMMENT '已完成订单笔数',
10 11
   `total_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '已完成实付合计',