Commit 5d4a7ffa3be9ca4e4bfa0d03e788bd6aaabdbdf4

Authored by YunaiV
1 parent 87e5b2be

1. 会员用户的修改密码 API 的优化

Showing 11 changed files with 59 additions and 72 deletions
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java
... ... @@ -8,10 +8,10 @@ import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
8 8 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
9 9 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
10 10 import cn.iocoder.yudao.module.member.service.auth.MemberAuthService;
11   -import io.swagger.v3.oas.annotations.tags.Tag;
  11 +import io.swagger.v3.oas.annotations.Operation;
12 12 import io.swagger.v3.oas.annotations.Parameter;
13 13 import io.swagger.v3.oas.annotations.Parameters;
14   -import io.swagger.v3.oas.annotations.Operation;
  14 +import io.swagger.v3.oas.annotations.tags.Tag;
15 15 import lombok.extern.slf4j.Slf4j;
16 16 import org.springframework.validation.annotation.Validated;
17 17 import org.springframework.web.bind.annotation.*;
... ... @@ -92,14 +92,6 @@ public class AppAuthController {
92 92 return success(true);
93 93 }
94 94  
95   - @PostMapping("/update-password")
96   - @Operation(summary = "修改用户密码", description = "用户修改密码时使用")
97   - @PreAuthenticated
98   - public CommonResult<Boolean> updatePassword(@RequestBody @Valid AppAuthUpdatePasswordReqVO reqVO) {
99   - authService.updatePassword(getLoginUserId(), reqVO);
100   - return success(true);
101   - }
102   -
103 95 // ========== 社交登录相关 ==========
104 96  
105 97 @GetMapping("/social-auth-redirect")
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/AppMemberUserController.java
... ... @@ -3,8 +3,9 @@ package cn.iocoder.yudao.module.member.controller.app.user;
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
5 5 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserInfoRespVO;
  6 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO;
6 7 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO;
7   -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
  8 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
8 9 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
9 10 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10 11 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
... ... @@ -49,10 +50,18 @@ public class AppMemberUserController {
49 50 @PutMapping("/update-mobile")
50 51 @Operation(summary = "修改用户手机")
51 52 @PreAuthenticated
52   - public CommonResult<Boolean> updateUserMobile(@RequestBody @Valid AppUserUpdateMobileReqVO reqVO) {
  53 + public CommonResult<Boolean> updateUserMobile(@RequestBody @Valid AppMemberUserUpdateMobileReqVO reqVO) {
53 54 userService.updateUserMobile(getLoginUserId(), reqVO);
54 55 return success(true);
55 56 }
56 57  
  58 + @PutMapping("/update-password")
  59 + @Operation(summary = "修改用户密码", description = "用户修改密码时使用")
  60 + @PreAuthenticated
  61 + public CommonResult<Boolean> updatePassword(@RequestBody @Valid AppMemberUserUpdatePasswordReqVO reqVO) {
  62 + userService.updateUserPassword(getLoginUserId(), reqVO);
  63 + return success(true);
  64 + }
  65 +
57 66 }
58 67  
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppUserUpdateMobileReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserUpdateMobileReqVO.java
... ... @@ -17,7 +17,7 @@ import javax.validation.constraints.Pattern;
17 17 @NoArgsConstructor
18 18 @AllArgsConstructor
19 19 @Builder
20   -public class AppUserUpdateMobileReqVO {
  20 +public class AppMemberUserUpdateMobileReqVO {
21 21  
22 22 @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
23 23 @NotEmpty(message = "手机验证码不能为空")
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthUpdatePasswordReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/user/vo/AppMemberUserUpdatePasswordReqVO.java
1   -package cn.iocoder.yudao.module.member.controller.app.auth.vo;
  1 +package cn.iocoder.yudao.module.member.controller.app.user.vo;
2 2  
3 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import lombok.AllArgsConstructor;
... ... @@ -7,24 +7,25 @@ import lombok.Data;
7 7 import lombok.NoArgsConstructor;
8 8 import org.hibernate.validator.constraints.Length;
9 9  
10   -import javax.validation.constraints.NotBlank;
11 10 import javax.validation.constraints.NotEmpty;
  11 +import javax.validation.constraints.Pattern;
12 12  
13   -// TODO 芋艿:code review 相关逻辑
14 13 @Schema(description = "用户 APP - 修改密码 Request VO")
15 14 @Data
16 15 @NoArgsConstructor
17 16 @AllArgsConstructor
18 17 @Builder
19   -public class AppAuthUpdatePasswordReqVO {
20   -
21   - @Schema(description = "用户旧密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456")
22   - @NotBlank(message = "旧密码不能为空")
23   - @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
24   - private String oldPassword;
  18 +public class AppMemberUserUpdatePasswordReqVO {
25 19  
26 20 @Schema(description = "新密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "buzhidao")
27 21 @NotEmpty(message = "新密码不能为空")
28 22 @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
29 23 private String password;
  24 +
  25 + @Schema(description = "手机验证码", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  26 + @NotEmpty(message = "手机验证码不能为空")
  27 + @Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位")
  28 + @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字")
  29 + private String code;
  30 +
30 31 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java
... ... @@ -62,13 +62,6 @@ public interface MemberAuthService {
62 62 String getSocialAuthorizeUrl(Integer type, String redirectUri);
63 63  
64 64 /**
65   - * 修改用户密码
66   - * @param userId 用户id
67   - * @param userReqVO 用户请求实体类
68   - */
69   - void updatePassword(Long userId, AppAuthUpdatePasswordReqVO userReqVO);
70   -
71   - /**
72 65 * 忘记密码
73 66 * @param userReqVO 用户请求实体类
74 67 */
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
... ... @@ -26,7 +26,6 @@ import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
26 26 import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
27 27 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
28 28 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
29   -import com.google.common.annotations.VisibleForTesting;
30 29 import lombok.extern.slf4j.Slf4j;
31 30 import org.springframework.security.crypto.password.PasswordEncoder;
32 31 import org.springframework.stereotype.Service;
... ... @@ -210,17 +209,6 @@ public class MemberAuthServiceImpl implements MemberAuthService {
210 209 }
211 210  
212 211 @Override
213   - public void updatePassword(Long userId, AppAuthUpdatePasswordReqVO reqVO) {
214   - // 检验旧密码
215   - MemberUserDO userDO = checkOldPassword(userId, reqVO.getOldPassword());
216   -
217   - // 更新用户密码
218   - // TODO 芋艿:需要重构到用户模块
219   - userMapper.updateById(MemberUserDO.builder().id(userDO.getId())
220   - .password(passwordEncoder.encode(reqVO.getPassword())).build());
221   - }
222   -
223   - @Override
224 212 public void resetPassword(AppAuthResetPasswordReqVO reqVO) {
225 213 // 检验用户是否存在
226 214 MemberUserDO userDO = checkUserIfExists(reqVO.getMobile());
... ... @@ -260,26 +248,6 @@ public class MemberAuthServiceImpl implements MemberAuthService {
260 248 return AuthConvert.INSTANCE.convert(accessTokenDO);
261 249 }
262 250  
263   - /**
264   - * 校验旧密码
265   - *
266   - * @param id 用户 id
267   - * @param oldPassword 旧密码
268   - * @return MemberUserDO 用户实体
269   - */
270   - @VisibleForTesting
271   - public MemberUserDO checkOldPassword(Long id, String oldPassword) {
272   - MemberUserDO user = userMapper.selectById(id);
273   - if (user == null) {
274   - throw exception(USER_NOT_EXISTS);
275   - }
276   - // 参数:未加密密码,编码后的密码
277   - if (!passwordEncoder.matches(oldPassword,user.getPassword())) {
278   - throw exception(USER_PASSWORD_FAILED);
279   - }
280   - return user;
281   - }
282   -
283 251 public MemberUserDO checkUserIfExists(String mobile) {
284 252 MemberUserDO user = userMapper.selectByMobile(mobile);
285 253 if (user == null) {
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java
... ... @@ -4,8 +4,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.common.validation.Mobile;
5 5 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
6 6 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
  7 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO;
7 8 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO;
8   -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
  9 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
9 10 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
10 11  
11 12 import javax.validation.Valid;
... ... @@ -81,9 +82,17 @@ public interface MemberUserService {
81 82 * 【会员】修改手机
82 83 *
83 84 * @param userId 用户编号
84   - * @param reqVO 请求实体
  85 + * @param reqVO 请求信息
85 86 */
86   - void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO);
  87 + void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO);
  88 +
  89 + /**
  90 + * 【会员】修改密码
  91 + *
  92 + * @param userId 用户编号
  93 + * @param reqVO 请求信息
  94 + */
  95 + void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO);
87 96  
88 97 /**
89 98 * 判断密码是否匹配
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
... ... @@ -7,8 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 7 import cn.iocoder.yudao.module.infra.api.file.FileApi;
8 8 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
9 9 import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
  10 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO;
10 11 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateReqVO;
11   -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
  12 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
12 13 import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
13 14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
14 15 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
... ... @@ -110,7 +111,7 @@ public class MemberUserServiceImpl implements MemberUserService {
110 111  
111 112 @Override
112 113 @Transactional(rollbackFor = Exception.class)
113   - public void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO) {
  114 + public void updateUserMobile(Long userId, AppMemberUserUpdateMobileReqVO reqVO) {
114 115 // 检测用户是否存在
115 116 MemberUserDO user = validateUserExists(userId);
116 117 // 校验新手机是否已经被绑定
... ... @@ -128,6 +129,19 @@ public class MemberUserServiceImpl implements MemberUserService {
128 129 }
129 130  
130 131 @Override
  132 + public void updateUserPassword(Long userId, AppMemberUserUpdatePasswordReqVO reqVO) {
  133 + // 检测用户是否存在
  134 + MemberUserDO user = validateUserExists(userId);
  135 + // 校验验证码
  136 + smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(user.getMobile()).setCode(reqVO.getCode())
  137 + .setScene(SmsSceneEnum.MEMBER_UPDATE_PASSWORD.getScene()).setUsedIp(getClientIP()));
  138 +
  139 + // 更新用户密码
  140 + memberUserMapper.updateById(MemberUserDO.builder().id(userId)
  141 + .password(passwordEncoder.encode(reqVO.getPassword())).build());
  142 + }
  143 +
  144 + @Override
131 145 public boolean isPasswordMatch(String rawPassword, String encodedPassword) {
132 146 return passwordEncoder.matches(rawPassword, encodedPassword);
133 147 }
... ...
yudao-module-member/yudao-module-member-biz/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java
... ... @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
6 6 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
7 7 import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest;
8 8 import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO;
9   -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO;
  9 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdatePasswordReqVO;
10 10 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
11 11 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
12 12 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
... ... @@ -71,7 +71,7 @@ public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest {
71 71 String newPassword = randomString();
72 72  
73 73 // 请求实体
74   - AppAuthUpdatePasswordReqVO reqVO = AppAuthUpdatePasswordReqVO.builder()
  74 + AppMemberUserUpdatePasswordReqVO reqVO = AppMemberUserUpdatePasswordReqVO.builder()
75 75 .oldPassword(userDO.getPassword())
76 76 .password(newPassword)
77 77 .build();
... ...
yudao-module-member/yudao-module-member-biz/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java
... ... @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
6 6 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
7 7 import cn.iocoder.yudao.framework.test.core.ut.BaseDbAndRedisUnitTest;
8 8 import cn.iocoder.yudao.module.infra.api.file.FileApi;
9   -import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
  9 +import cn.iocoder.yudao.module.member.controller.app.user.vo.AppMemberUserUpdateMobileReqVO;
10 10 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
11 11 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
12 12 import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl;
... ... @@ -114,7 +114,7 @@ public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest {
114 114 // 更新手机号
115 115 String newMobile = randomNumbers(11);
116 116 String newCode = randomNumbers(4);
117   - AppUserUpdateMobileReqVO reqVO = new AppUserUpdateMobileReqVO();
  117 + AppMemberUserUpdateMobileReqVO reqVO = new AppMemberUserUpdateMobileReqVO();
118 118 reqVO.setMobile(newMobile);
119 119 reqVO.setCode(newCode);
120 120 reqVO.setOldMobile(oldMobile);
... ...
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/sms/SmsSceneEnum.java
... ... @@ -17,8 +17,9 @@ import java.util.Arrays;
17 17 public enum SmsSceneEnum implements IntArrayValuable {
18 18  
19 19 MEMBER_LOGIN(1, "user-sms-login", "会员用户 - 手机号登陆"),
20   - MEMBER_UPDATE_MOBILE(2, "user-sms-update-mobile", "会员用户 - 修改手机"),
21   - MEMBER_FORGET_PASSWORD(3, "user-sms-forget-password", "会员用户 - 忘记密码"),
  20 + MEMBER_UPDATE_MOBILE(2, "user-update-mobile", "会员用户 - 修改手机"),
  21 + MEMBER_UPDATE_PASSWORD(3, "user-update-mobile", "会员用户 - 修改密码"),
  22 + MEMBER_FORGET_PASSWORD(4, "user-forget-password", "会员用户 - 忘记密码"),
22 23  
23 24 ADMIN_MEMBER_LOGIN(21, "admin-sms-login", "后台用户 - 手机号登录");
24 25  
... ...