Commit 5d4a7ffa3be9ca4e4bfa0d03e788bd6aaabdbdf4
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 | ... | ... |