Commit 16c2590483b07ee3c102716d285cef020da2ab1c

Authored by YunaiV
1 parent add08b1e

多模块重构 4:system 模块的调整,实现 sms API~~

Showing 14 changed files with 270 additions and 83 deletions
@@ -14,9 +14,8 @@ @@ -14,9 +14,8 @@
14 <module>yudao-user-server</module> 14 <module>yudao-user-server</module>
15 <module>yudao-core-service</module> 15 <module>yudao-core-service</module>
16 <module>yudao-module-member</module> 16 <module>yudao-module-member</module>
17 - <module>yudao-module-bpm</module> 17 +<!-- <module>yudao-module-bpm</module>-->
18 <module>yudao-module-system</module> 18 <module>yudao-module-system</module>
19 - <module>yudao-module-system-api</module>  
20 </modules> 19 </modules>
21 20
22 <name>${artifactId}</name> 21 <name>${artifactId}</name>
yudao-admin-server/pom.xml
@@ -57,14 +57,15 @@ @@ -57,14 +57,15 @@
57 </dependency> 57 </dependency>
58 58
59 <!-- 默认引入bpm-activiti. 可以替换为bpm-flowable --> 59 <!-- 默认引入bpm-activiti. 可以替换为bpm-flowable -->
60 - <dependency>  
61 - <groupId>cn.iocoder.boot</groupId>  
62 - <artifactId>yudao-module-bpm-activiti</artifactId>  
63 - </dependency>  
64 - <dependency>  
65 - <groupId>cn.iocoder.boot</groupId>  
66 - <artifactId>yudao-module-bpm-core-service-impl</artifactId>  
67 - </dependency> 60 + <!-- TODO 芋艿:临时注释,测试通过后,打开 -->
  61 +<!-- <dependency>-->
  62 +<!-- <groupId>cn.iocoder.boot</groupId>-->
  63 +<!-- <artifactId>yudao-module-bpm-activiti</artifactId>-->
  64 +<!-- </dependency>-->
  65 +<!-- <dependency>-->
  66 +<!-- <groupId>cn.iocoder.boot</groupId>-->
  67 +<!-- <artifactId>yudao-module-bpm-core-service-impl</artifactId>-->
  68 +<!-- </dependency>-->
68 <!-- Web 相关 --> 69 <!-- Web 相关 -->
69 <dependency> 70 <dependency>
70 <groupId>cn.iocoder.boot</groupId> 71 <groupId>cn.iocoder.boot</groupId>
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java
@@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.member.convert.auth; @@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.member.convert.auth;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.security.core.LoginUser; 4 import cn.iocoder.yudao.framework.security.core.LoginUser;
5 -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialBindReqVO;  
6 -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialLogin2ReqVO;  
7 -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialLoginReqVO;  
8 -import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthSocialUnbindReqVO; 5 +import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
9 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 6 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
  7 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO;
  8 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO;
10 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; 9 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
11 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; 10 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
  11 +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
12 import org.mapstruct.Mapper; 12 import org.mapstruct.Mapper;
13 import org.mapstruct.Mapping; 13 import org.mapstruct.Mapping;
14 import org.mapstruct.factory.Mappers; 14 import org.mapstruct.factory.Mappers;
@@ -31,4 +31,8 @@ public interface AuthConvert { @@ -31,4 +31,8 @@ public interface AuthConvert {
31 SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLoginReqVO reqVO); 31 SocialUserBindReqDTO convert(Long userId, Integer value, AppAuthSocialLoginReqVO reqVO);
32 SocialUserUnbindReqDTO convert(Long userId, Integer value, AppAuthSocialUnbindReqVO reqVO); 32 SocialUserUnbindReqDTO convert(Long userId, Integer value, AppAuthSocialUnbindReqVO reqVO);
33 33
  34 + SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO);
  35 + SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp);
  36 + SmsCodeUseReqDTO convert(AppAuthSmsLoginReqVO reqVO, Integer scene, String userIp);
  37 +
34 } 38 }
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
@@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.member.service.user.MemberUserService; @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.member.service.user.MemberUserService;
15 import cn.iocoder.yudao.module.system.api.auth.UserSessionApi; 15 import cn.iocoder.yudao.module.system.api.auth.UserSessionApi;
16 import cn.iocoder.yudao.module.system.api.logger.LoginLogApi; 16 import cn.iocoder.yudao.module.system.api.logger.LoginLogApi;
17 import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; 17 import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
  18 +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
18 import cn.iocoder.yudao.module.system.api.social.SocialUserApi; 19 import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
19 import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum; 20 import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
20 import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum; 21 import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
@@ -56,7 +57,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -56,7 +57,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
56 @Resource 57 @Resource
57 private MemberUserService userService; 58 private MemberUserService userService;
58 @Resource 59 @Resource
59 - private SysSmsCodeService smsCodeService; 60 + private SmsCodeApi smsCodeApi;
60 @Resource 61 @Resource
61 private LoginLogApi loginLogApi; 62 private LoginLogApi loginLogApi;
62 @Resource 63 @Resource
@@ -93,8 +94,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -93,8 +94,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
93 @Transactional 94 @Transactional
94 public String smsLogin(AppAuthSmsLoginReqVO reqVO, String userIp, String userAgent) { 95 public String smsLogin(AppAuthSmsLoginReqVO reqVO, String userIp, String userAgent) {
95 // 校验验证码 96 // 校验验证码
96 - smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_LOGIN.getScene(),  
97 - reqVO.getCode(), userIp); 97 + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_LOGIN.getScene(), userIp));
98 98
99 // 获得获得注册用户 99 // 获得获得注册用户
100 MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp); 100 MemberUserDO user = userService.createUserIfAbsent(reqVO.getMobile(), userIp);
@@ -292,8 +292,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -292,8 +292,8 @@ public class MemberAuthServiceImpl implements MemberAuthService {
292 MemberUserDO userDO = checkUserIfExists(reqVO.getMobile()); 292 MemberUserDO userDO = checkUserIfExists(reqVO.getMobile());
293 293
294 // 使用验证码 294 // 使用验证码
295 - smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_FORGET_PASSWORD.getScene(), reqVO.getCode(),  
296 - getClientIP()); 295 + smsCodeApi.useSmsCode(AuthConvert.INSTANCE.convert(reqVO, SmsSceneEnum.MEMBER_FORGET_PASSWORD,
  296 + getClientIP()));
297 297
298 // 更新密码 298 // 更新密码
299 MemberUserDO mbrUserDO = MemberUserDO.builder().build(); 299 MemberUserDO mbrUserDO = MemberUserDO.builder().build();
@@ -304,7 +304,8 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -304,7 +304,8 @@ public class MemberAuthServiceImpl implements MemberAuthService {
304 304
305 @Override 305 @Override
306 public void sendSmsCode(Long userId, AppAuthSendSmsReqVO reqVO) { 306 public void sendSmsCode(Long userId, AppAuthSendSmsReqVO reqVO) {
307 - // TODO 芋艿:修改 307 + // TODO 要根据不同的场景,校验是否有用户
  308 + smsCodeApi.sendSmsCode(AuthConvert.INSTANCE.convert(reqVO));
308 } 309 }
309 310
310 /** 311 /**
yudao-module-member/yudao-module-member-impl/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java
@@ -4,14 +4,12 @@ import cn.hutool.core.io.IoUtil; @@ -4,14 +4,12 @@ import cn.hutool.core.io.IoUtil;
4 import cn.hutool.core.util.IdUtil; 4 import cn.hutool.core.util.IdUtil;
5 import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService; 5 import cn.iocoder.yudao.coreservice.modules.infra.service.file.InfFileCoreService;
6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 6 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
7 -import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;  
8 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; 7 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
9 -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SmsCodeDO;  
10 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 8 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
11 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 9 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
12 -import cn.iocoder.yudao.module.member.enums.SysErrorCodeConstants; 10 +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
  11 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO;
13 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; 12 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
14 -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService;  
15 import com.google.common.annotations.VisibleForTesting; 13 import com.google.common.annotations.VisibleForTesting;
16 import lombok.extern.slf4j.Slf4j; 14 import lombok.extern.slf4j.Slf4j;
17 import org.springframework.security.crypto.password.PasswordEncoder; 15 import org.springframework.security.crypto.password.PasswordEncoder;
@@ -43,7 +41,7 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -43,7 +41,7 @@ public class MemberUserServiceImpl implements MemberUserService {
43 @Resource 41 @Resource
44 private InfFileCoreService fileCoreService; 42 private InfFileCoreService fileCoreService;
45 @Resource 43 @Resource
46 - private SysSmsCodeService smsCodeService; 44 + private SmsCodeApi smsCodeApi;
47 45
48 @Resource 46 @Resource
49 private PasswordEncoder passwordEncoder; 47 private PasswordEncoder passwordEncoder;
@@ -111,22 +109,19 @@ public class MemberUserServiceImpl implements MemberUserService { @@ -111,22 +109,19 @@ public class MemberUserServiceImpl implements MemberUserService {
111 return avatar; 109 return avatar;
112 } 110 }
113 111
  112 + @Override
114 @Transactional(rollbackFor = Exception.class) 113 @Transactional(rollbackFor = Exception.class)
115 public void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO) { 114 public void updateUserMobile(Long userId, AppUserUpdateMobileReqVO reqVO) {
116 // 检测用户是否存在 115 // 检测用户是否存在
117 checkUserExists(userId); 116 checkUserExists(userId);
  117 + // TODO 芋艿:oldMobile 应该不用传递
118 118
119 // 校验旧手机和旧验证码 119 // 校验旧手机和旧验证码
120 - SmsCodeDO sysSmsCodeDO = smsCodeService.checkCodeIsExpired(reqVO.getOldMobile(), reqVO.getOldCode(),  
121 - SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene());  
122 - // 判断旧 code 是否未被使用,如果是,抛出异常  
123 - if (Boolean.FALSE.equals(sysSmsCodeDO.getUsed())){  
124 - throw ServiceExceptionUtil.exception(SysErrorCodeConstants.USER_SMS_CODE_IS_UNUSED);  
125 - }  
126 - 120 + smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getOldMobile()).setCode(reqVO.getOldCode())
  121 + .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
127 // 使用新验证码 122 // 使用新验证码
128 - smsCodeService.useSmsCode(reqVO.getMobile(), SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene(),  
129 - reqVO.getCode(),getClientIP()); 123 + smsCodeApi.useSmsCode(new SmsCodeUseReqDTO().setMobile(reqVO.getMobile()).setCode(reqVO.getCode())
  124 + .setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene()).setUsedIp(getClientIP()));
130 125
131 // 更新用户手机 126 // 更新用户手机
132 memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build()); 127 memberUserMapper.updateById(MemberUserDO.builder().id(userId).mobile(reqVO.getMobile()).build());
yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/SysAuthServiceTest.java renamed to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceTest.java
1 package cn.iocoder.yudao.module.member.service.auth; 1 package cn.iocoder.yudao.module.member.service.auth;
2 2
3 -import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;  
4 -import cn.iocoder.yudao.module.system.service.auth.SysUserSessionCoreService;  
5 -import cn.iocoder.yudao.module.system.service.logger.SysLoginLogCoreService;  
6 -import cn.iocoder.yudao.module.system.service.social.SysSocialCoreService;  
7 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; 3 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
8 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; 4 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
9 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; 5 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
10 import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO; 6 import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthResetPasswordReqVO;
11 import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO; 7 import cn.iocoder.yudao.module.member.controller.app.auth.vo.AppAuthUpdatePasswordReqVO;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
12 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 9 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
13 -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService;  
14 import cn.iocoder.yudao.module.member.service.user.MemberUserService; 10 import cn.iocoder.yudao.module.member.service.user.MemberUserService;
15 import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; 11 import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest;
  12 +import cn.iocoder.yudao.module.system.api.auth.UserSessionApi;
  13 +import cn.iocoder.yudao.module.system.api.logger.LoginLogApi;
  14 +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
  15 +import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
16 import org.junit.jupiter.api.Test; 16 import org.junit.jupiter.api.Test;
17 import org.springframework.boot.test.mock.mockito.MockBean; 17 import org.springframework.boot.test.mock.mockito.MockBean;
18 import org.springframework.context.annotation.Import; 18 import org.springframework.context.annotation.Import;
19 -import org.springframework.data.redis.core.StringRedisTemplate;  
20 import org.springframework.security.authentication.AuthenticationManager; 19 import org.springframework.security.authentication.AuthenticationManager;
21 import org.springframework.security.crypto.password.PasswordEncoder; 20 import org.springframework.security.crypto.password.PasswordEncoder;
22 21
@@ -37,22 +36,20 @@ import static org.mockito.Mockito.when; @@ -37,22 +36,20 @@ import static org.mockito.Mockito.when;
37 * @author 宋天 36 * @author 宋天
38 */ 37 */
39 @Import({MemberAuthServiceImpl.class, YudaoRedisAutoConfiguration.class}) 38 @Import({MemberAuthServiceImpl.class, YudaoRedisAutoConfiguration.class})
40 -public class SysAuthServiceTest extends BaseDbAndRedisUnitTest { 39 +public class MemberAuthServiceTest extends BaseDbAndRedisUnitTest {
41 40
42 @MockBean 41 @MockBean
43 private AuthenticationManager authenticationManager; 42 private AuthenticationManager authenticationManager;
44 @MockBean 43 @MockBean
45 private MemberUserService userService; 44 private MemberUserService userService;
46 @MockBean 45 @MockBean
47 - private SysSmsCodeService smsCodeService; 46 + private SmsCodeApi smsCodeApi;
48 @MockBean 47 @MockBean
49 - private SysLoginLogCoreService loginLogCoreService; 48 + private LoginLogApi loginLogApi;
50 @MockBean 49 @MockBean
51 - private SysUserSessionCoreService userSessionCoreService; 50 + private UserSessionApi userSessionApi;
52 @MockBean 51 @MockBean
53 - private SysSocialCoreService socialService;  
54 - @Resource  
55 - private StringRedisTemplate stringRedisTemplate; 52 + private SocialUserApi socialUserApi;
56 @MockBean 53 @MockBean
57 private PasswordEncoder passwordEncoder; 54 private PasswordEncoder passwordEncoder;
58 @Resource 55 @Resource
yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/UserServiceImplTest.java renamed to yudao-module-member/yudao-module-member-impl/src/test/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImplTest.java
@@ -6,13 +6,11 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; @@ -6,13 +6,11 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
6 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils; 6 import cn.iocoder.yudao.framework.common.util.collection.ArrayUtils;
7 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration; 7 import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
8 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO; 8 import cn.iocoder.yudao.module.member.controller.app.user.vo.AppUserUpdateMobileReqVO;
9 -import cn.iocoder.yudao.module.member.dal.dataobject.sms.SmsCodeDO;  
10 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 9 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
11 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 10 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
12 -import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;  
13 import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl; 11 import cn.iocoder.yudao.module.member.service.auth.MemberAuthServiceImpl;
14 -import cn.iocoder.yudao.module.member.service.sms.SysSmsCodeService;  
15 import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest; 12 import cn.iocoder.yudao.module.member.test.BaseDbAndRedisUnitTest;
  13 +import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
16 import org.junit.jupiter.api.Test; 14 import org.junit.jupiter.api.Test;
17 import org.springframework.boot.test.mock.mockito.MockBean; 15 import org.springframework.boot.test.mock.mockito.MockBean;
18 import org.springframework.context.annotation.Import; 16 import org.springframework.context.annotation.Import;
@@ -36,7 +34,7 @@ import static org.mockito.Mockito.*; @@ -36,7 +34,7 @@ import static org.mockito.Mockito.*;
36 * @author 宋天 34 * @author 宋天
37 */ 35 */
38 @Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class}) 36 @Import({MemberUserServiceImpl.class, YudaoRedisAutoConfiguration.class})
39 -public class UserServiceImplTest extends BaseDbAndRedisUnitTest { 37 +public class MemberUserServiceImplTest extends BaseDbAndRedisUnitTest {
40 38
41 @Resource 39 @Resource
42 private MemberUserServiceImpl mbrUserService; 40 private MemberUserServiceImpl mbrUserService;
@@ -57,7 +55,7 @@ public class UserServiceImplTest extends BaseDbAndRedisUnitTest { @@ -57,7 +55,7 @@ public class UserServiceImplTest extends BaseDbAndRedisUnitTest {
57 private PasswordEncoder passwordEncoder; 55 private PasswordEncoder passwordEncoder;
58 56
59 @MockBean 57 @MockBean
60 - private SmsCodeService smsCodeService; 58 + private SmsCodeApi smsCodeApi;
61 59
62 @Test 60 @Test
63 public void testUpdateNickName_success(){ 61 public void testUpdateNickName_success(){
@@ -103,14 +101,15 @@ public class UserServiceImplTest extends BaseDbAndRedisUnitTest { @@ -103,14 +101,15 @@ public class UserServiceImplTest extends BaseDbAndRedisUnitTest {
103 userDO.setMobile(oldMobile); 101 userDO.setMobile(oldMobile);
104 userMapper.insert(userDO); 102 userMapper.insert(userDO);
105 103
  104 + // TODO 芋艿:需要修复该单元测试,重构多模块带来的
106 // 旧手机和旧验证码 105 // 旧手机和旧验证码
107 - SmsCodeDO codeDO = new SmsCodeDO(); 106 +// SmsCodeDO codeDO = new SmsCodeDO();
108 String oldCode = RandomUtil.randomString(4); 107 String oldCode = RandomUtil.randomString(4);
109 - codeDO.setMobile(userDO.getMobile());  
110 - codeDO.setCode(oldCode);  
111 - codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene());  
112 - codeDO.setUsed(Boolean.FALSE);  
113 - when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO); 108 +// codeDO.setMobile(userDO.getMobile());
  109 +// codeDO.setCode(oldCode);
  110 +// codeDO.setScene(SmsSceneEnum.MEMBER_UPDATE_MOBILE.getScene());
  111 +// codeDO.setUsed(Boolean.FALSE);
  112 +// when(smsCodeService.checkCodeIsExpired(codeDO.getMobile(),codeDO.getCode(),codeDO.getScene())).thenReturn(codeDO);
114 113
115 // 更新手机号 114 // 更新手机号
116 String newMobile = randomNumbers(11); 115 String newMobile = randomNumbers(11);
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApi.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.sms;
  2 +
  3 +import cn.iocoder.yudao.framework.common.exception.ServiceException;
  4 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO;
  5 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO;
  7 +
  8 +import javax.validation.Valid;
  9 +
  10 +/**
  11 + * 短信验证码 API 接口
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +public interface SmsCodeApi {
  16 +
  17 + /**
  18 + * 创建短信验证码,并进行发送
  19 + *
  20 + * @param reqDTO 发送请求
  21 + */
  22 + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO);
  23 +
  24 + /**
  25 + * 验证短信验证码,并进行使用
  26 + * 如果正确,则将验证码标记成已使用
  27 + * 如果错误,则抛出 {@link ServiceException} 异常
  28 + *
  29 + * @param reqDTO 使用请求
  30 + */
  31 + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO);
  32 +
  33 + /**
  34 + * 检查验证码是否有效
  35 + *
  36 + * @param reqDTO 校验请求
  37 + */
  38 + void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
  39 +
  40 +}
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeCheckReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.sms.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  5 +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +
  10 +/**
  11 + * 短信验证码的校验 Request DTO
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Data
  16 +public class SmsCodeCheckReqDTO {
  17 +
  18 + /**
  19 + * 手机号
  20 + */
  21 + @Mobile
  22 + @NotEmpty(message = "手机号不能为空")
  23 + private String mobile;
  24 + /**
  25 + * 发送场景
  26 + */
  27 + @NotEmpty(message = "发送场景不能为空")
  28 + @InEnum(SmsSceneEnum.class)
  29 + private Integer scene;
  30 + /**
  31 + * 验证码
  32 + */
  33 + @NotEmpty(message = "验证码")
  34 + private String code;
  35 +
  36 +}
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeSendReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.sms.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  5 +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +
  10 +/**
  11 + * 短信验证码的发送 Request DTO
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Data
  16 +public class SmsCodeSendReqDTO {
  17 +
  18 + /**
  19 + * 手机号
  20 + */
  21 + @Mobile
  22 + @NotEmpty(message = "手机号不能为空")
  23 + private String mobile;
  24 + /**
  25 + * 发送场景
  26 + */
  27 + @NotEmpty(message = "发送场景不能为空")
  28 + @InEnum(SmsSceneEnum.class)
  29 + private Integer scene;
  30 + /**
  31 + * 发送 IP
  32 + */
  33 + @NotEmpty(message = "发送 IP 不能为空")
  34 + private String createIp;
  35 +
  36 +}
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/sms/dto/SmsCodeUseReqDTO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.sms.dto;
  2 +
  3 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.Mobile;
  5 +import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
  6 +import lombok.Data;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +
  10 +/**
  11 + * 短信验证码的使用 Request DTO
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +@Data
  16 +public class SmsCodeUseReqDTO {
  17 +
  18 + /**
  19 + * 手机号
  20 + */
  21 + @Mobile
  22 + @NotEmpty(message = "手机号不能为空")
  23 + private String mobile;
  24 + /**
  25 + * 发送场景
  26 + */
  27 + @NotEmpty(message = "发送场景不能为空")
  28 + @InEnum(SmsSceneEnum.class)
  29 + private Integer scene;
  30 + /**
  31 + * 验证码
  32 + */
  33 + @NotEmpty(message = "验证码")
  34 + private String code;
  35 + /**
  36 + * 使用 IP
  37 + */
  38 + @NotEmpty(message = "使用 IP 不能为空")
  39 + private String usedIp;
  40 +
  41 +}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/api/sms/SmsCodeApiImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.api.sms;
  2 +
  3 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO;
  4 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO;
  5 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO;
  6 +import cn.iocoder.yudao.module.system.service.sms.SmsCodeService;
  7 +import org.springframework.stereotype.Service;
  8 +import org.springframework.validation.annotation.Validated;
  9 +
  10 +import javax.annotation.Resource;
  11 +
  12 +/**
  13 + * 短信验证码 API 实现类
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Service
  18 +@Validated
  19 +public class SmsCodeApiImpl implements SmsCodeApi {
  20 +
  21 + @Resource
  22 + private SmsCodeService smsCodeService;
  23 +
  24 + @Override
  25 + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) {
  26 + smsCodeService.sendSmsCode(reqDTO);
  27 + }
  28 +
  29 + @Override
  30 + public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
  31 + smsCodeService.useSmsCode(reqDTO);
  32 + }
  33 +
  34 + @Override
  35 + public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
  36 + smsCodeService.checkSmsCode(reqDTO);
  37 + }
  38 +
  39 +}
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeService.java
1 package cn.iocoder.yudao.module.system.service.sms; 1 package cn.iocoder.yudao.module.system.service.sms;
2 2
3 import cn.iocoder.yudao.framework.common.exception.ServiceException; 3 import cn.iocoder.yudao.framework.common.exception.ServiceException;
4 -import cn.iocoder.yudao.framework.common.validation.Mobile;  
5 -import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; 4 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO;
  5 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO;
  7 +
  8 +import javax.validation.Valid;
6 9
7 /** 10 /**
8 * 短信验证码 Service 接口 11 * 短信验证码 Service 接口
@@ -14,31 +17,24 @@ public interface SmsCodeService { @@ -14,31 +17,24 @@ public interface SmsCodeService {
14 /** 17 /**
15 * 创建短信验证码,并进行发送 18 * 创建短信验证码,并进行发送
16 * 19 *
17 - * @param mobile 手机号  
18 - * @param scene 发送场景 {@link SmsSceneEnum}  
19 - * @param createIp 发送 IP 20 + * @param reqDTO 发送请求
20 */ 21 */
21 - void sendSmsCode(@Mobile String mobile, Integer scene, String createIp); 22 + void sendSmsCode(@Valid SmsCodeSendReqDTO reqDTO);
22 23
23 /** 24 /**
24 * 验证短信验证码,并进行使用 25 * 验证短信验证码,并进行使用
25 * 如果正确,则将验证码标记成已使用 26 * 如果正确,则将验证码标记成已使用
26 * 如果错误,则抛出 {@link ServiceException} 异常 27 * 如果错误,则抛出 {@link ServiceException} 异常
27 * 28 *
28 - * @param mobile 手机号  
29 - * @param scene 发送场景 {@link SmsSceneEnum}  
30 - * @param code 验证码  
31 - * @param usedIp 使用 IP 29 + * @param reqDTO 使用请求
32 */ 30 */
33 - void useSmsCode(@Mobile String mobile, Integer scene, String code, String usedIp); 31 + void useSmsCode(@Valid SmsCodeUseReqDTO reqDTO);
34 32
35 /** 33 /**
36 * 检查验证码是否有效 34 * 检查验证码是否有效
37 * 35 *
38 - * @param mobile 手机  
39 - * @param code 验证码  
40 - * @param scene 使用场景 36 + * @param reqDTO 校验请求
41 */ 37 */
42 - void checkSmsCode(String mobile, String code, Integer scene); 38 + void checkSmsCode(@Valid SmsCodeCheckReqDTO reqDTO);
43 39
44 } 40 }
yudao-module-system/yudao-module-system-impl/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsCodeServiceImpl.java
@@ -4,6 +4,9 @@ import cn.hutool.core.lang.Assert; @@ -4,6 +4,9 @@ import cn.hutool.core.lang.Assert;
4 import cn.hutool.core.map.MapUtil; 4 import cn.hutool.core.map.MapUtil;
5 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; 5 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
6 import cn.iocoder.yudao.module.member.api.user.MemberUserApi; 6 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
  7 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeCheckReqDTO;
  8 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeSendReqDTO;
  9 +import cn.iocoder.yudao.module.system.api.sms.dto.SmsCodeUseReqDTO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO; 10 import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsCodeDO;
8 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper; 11 import cn.iocoder.yudao.module.system.dal.mysql.sms.SmsCodeMapper;
9 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum; 12 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
@@ -42,13 +45,13 @@ public class SmsCodeServiceImpl implements SmsCodeService { @@ -42,13 +45,13 @@ public class SmsCodeServiceImpl implements SmsCodeService {
42 private SmsSendService smsSendService; 45 private SmsSendService smsSendService;
43 46
44 @Override 47 @Override
45 - public void sendSmsCode(String mobile, Integer scene, String createIp) {  
46 - SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(scene);  
47 - Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", scene); 48 + public void sendSmsCode(SmsCodeSendReqDTO reqDTO) {
  49 + SmsSceneEnum sceneEnum = SmsSceneEnum.getCodeByScene(reqDTO.getScene());
  50 + Assert.notNull(sceneEnum, "验证码场景({}) 查找不到配置", reqDTO.getScene());
48 // 创建验证码 51 // 创建验证码
49 - String code = createSmsCode(mobile, scene, createIp); 52 + String code = createSmsCode(reqDTO.getMobile(), reqDTO.getScene(), reqDTO.getCreateIp());
50 // 发送验证码 53 // 发送验证码
51 - smsSendService.sendSingleSms(mobile, null, null, 54 + smsSendService.sendSingleSms(reqDTO.getMobile(), null, null,
52 sceneEnum.getTemplateCode(), MapUtil.of("code", code)); 55 sceneEnum.getTemplateCode(), MapUtil.of("code", code));
53 } 56 }
54 57
@@ -77,17 +80,17 @@ public class SmsCodeServiceImpl implements SmsCodeService { @@ -77,17 +80,17 @@ public class SmsCodeServiceImpl implements SmsCodeService {
77 } 80 }
78 81
79 @Override 82 @Override
80 - public void useSmsCode(String mobile, Integer scene, String code, String usedIp) { 83 + public void useSmsCode(SmsCodeUseReqDTO reqDTO) {
81 // 检测验证码是否有效 84 // 检测验证码是否有效
82 - SmsCodeDO lastSmsCode = this.checkSmsCode0(mobile, code, scene); 85 + SmsCodeDO lastSmsCode = this.checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
83 // 使用验证码 86 // 使用验证码
84 smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId()) 87 smsCodeMapper.updateById(SmsCodeDO.builder().id(lastSmsCode.getId())
85 - .used(true).usedTime(new Date()).usedIp(usedIp).build()); 88 + .used(true).usedTime(new Date()).usedIp(reqDTO.getUsedIp()).build());
86 } 89 }
87 90
88 @Override 91 @Override
89 - public void checkSmsCode(String mobile, String code, Integer scene) {  
90 - checkSmsCode0(mobile, code, scene); 92 + public void checkSmsCode(SmsCodeCheckReqDTO reqDTO) {
  93 + checkSmsCode0(reqDTO.getMobile(), reqDTO.getCode(), reqDTO.getScene());
91 } 94 }
92 95
93 public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) { 96 public SmsCodeDO checkSmsCode0(String mobile, String code, Integer scene) {