From a585537c91c01457973e6579811ce8b550f35a84 Mon Sep 17 00:00:00 2001 From: dute7liang <383200134@qq.com> Date: Sun, 21 Jan 2024 22:05:02 +0800 Subject: [PATCH] init --- ruoyi-cai/pom.xml | 5 + .../com/ruoyi/cai/auth/CaiLoginManager.java | 9 +- .../ruoyi/cai/config/AliSmsProperties.java | 14 ++ .../cai/controller/app/AuthAppController.java | 4 - .../java/com/ruoyi/cai/enums/CodeEnum.java | 9 +- .../java/com/ruoyi/cai/kit/AliSmsKit.java | 144 ++++++++++++++++++ .../com/ruoyi/cai/manager/CodeManager.java | 5 + .../ruoyi/cai/service/SmsVerifyService.java | 2 + .../service/impl/SmsVerifyServiceImpl.java | 85 ++++++++++- 9 files changed, 263 insertions(+), 14 deletions(-) create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/config/AliSmsProperties.java create mode 100644 ruoyi-cai/src/main/java/com/ruoyi/cai/kit/AliSmsKit.java diff --git a/ruoyi-cai/pom.xml b/ruoyi-cai/pom.xml index faf8d767..9dc6da46 100644 --- a/ruoyi-cai/pom.xml +++ b/ruoyi-cai/pom.xml @@ -45,6 +45,11 @@ IJPay-AliPay ${ijapy.version} + + com.aliyun + aliyun-java-sdk-core + 4.5.0 + diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java index b41db3d4..4aa3a180 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/auth/CaiLoginManager.java @@ -77,6 +77,8 @@ public class CaiLoginManager { private UserForbidManager userForbidManager; @Autowired private AwardManager awardManager; + @Autowired + private SmsVerifyService smsVerifyService; public String login(String username,String password){ User user = userService.getByUsername(username); @@ -108,7 +110,7 @@ public class CaiLoginManager { if(!caiUser.getPassword().equals(caiUser.getPasswordCheck())){ throw new ServiceException("两次输入密码不一致,请检查"); } - boolean check = codeManager.check(CodeEnum.REGISTER, caiUser.getUsername(), caiUser.getCode()); + boolean check = smsVerifyService.check(CodeEnum.REGISTER, caiUser.getUsername(), caiUser.getCode()); if(!check){ throw new ServiceException("验证码错误"); } @@ -299,12 +301,15 @@ public class CaiLoginManager { return add; } - public void resetPassword(ResetPasswordReq code) { User user = userService.getByUsername(code.getMobile()); if(user == null){ throw new ServiceException("账户不存在"); } + boolean check = smsVerifyService.check(CodeEnum.RESET_PASSWORD, code.getMobile(), code.getCode()); + if(!check){ + throw new ServiceException("验证码错误"); + } userService.resetPassword(user.getId(),code.getPassword()); } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/config/AliSmsProperties.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/config/AliSmsProperties.java new file mode 100644 index 00000000..ed14c5c5 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/config/AliSmsProperties.java @@ -0,0 +1,14 @@ +package com.ruoyi.cai.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "ali.sms") +public class AliSmsProperties { + private String accessKeyId = "LTAI5tRf2jUyoYmAC9kw4AMF"; + private String accessKeySecret = "frvNLpySKxC38eihnWKi3NMFZSume3"; + private String signName = "武汉康慧创欣科技"; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/AuthAppController.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/AuthAppController.java index dc838ea8..1071f758 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/AuthAppController.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/controller/app/AuthAppController.java @@ -76,10 +76,6 @@ public class AuthAppController { if(!mobile){ return R.fail(600,"请输入正确的手机格式"); } - User user = userService.getByUsername(code.getMobile()); - if(user == null){ - throw new ServiceException("用户不存在"); - } smsVerifyService.put(CodeEnum.RESET_PASSWORD,code.getMobile()); return R.ok("发送成功"); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/CodeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/CodeEnum.java index 7f4df920..4f99f3a9 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/CodeEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/enums/CodeEnum.java @@ -4,13 +4,14 @@ import lombok.Getter; @Getter public enum CodeEnum { - REGISTER("注册短信"), - RESET_PASSWORD("重置密码") + REGISTER("注册短信","SMS_294195165"), + RESET_PASSWORD("重置密码","SMS_294195165") ; - private final String name; + private final String aliTemplate; - CodeEnum(String name) { + CodeEnum(String name, String aliTemplate) { this.name = name; + this.aliTemplate = aliTemplate; } } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/AliSmsKit.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/AliSmsKit.java new file mode 100644 index 00000000..e6b72403 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/AliSmsKit.java @@ -0,0 +1,144 @@ +package com.ruoyi.cai.kit; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.CommonRequest; +import com.aliyuncs.CommonResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.http.MethodType; +import com.aliyuncs.profile.DefaultProfile; +import com.aliyuncs.profile.IClientProfile; +import com.google.common.collect.Lists; +import com.ruoyi.cai.config.AliSmsProperties; +import com.ruoyi.cai.enums.CodeEnum; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.util.Asserts; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import javax.annotation.PostConstruct; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Component +@Slf4j +public class AliSmsKit { + @Autowired + @Setter + private AliSmsProperties config; + private IClientProfile profile; + + @PostConstruct + public void init() { + System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); + System.setProperty("sun.net.client.defaultReadTimeout", "10000"); + profile = DefaultProfile.getProfile("cn-hangzhou", config.getAccessKeyId(), config.getAccessKeySecret()); + } + + private boolean batchSendMessage(List phone,String messageTemplate){ + Asserts.notBlank(messageTemplate, "短信模板不能为空"); + IAcsClient client = new DefaultAcsClient(profile); + CommonRequest request = new CommonRequest(); + request.setSysMethod(MethodType.POST); + request.setSysDomain("dysmsapi.aliyuncs.com"); + request.setSysVersion("2017-05-25"); + request.setSysAction("SendBatchSms"); + List signName = phone.stream().map(i -> config.getSignName()).collect(Collectors.toList()); + request.putQueryParameter("TemplateCode", messageTemplate); + request.putQueryParameter("SignNameJson", JSON.toJSONString(signName)); + request.putQueryParameter("PhoneNumberJson", JSON.toJSONString(phone)); + try { + CommonResponse response = client.getCommonResponse(request); + String data = response.getData(); + JSONObject jsonObject = JSONObject.parseObject(data); + if(jsonObject.get("Code") == null || !"OK".equals(jsonObject.get("Code"))){ + log.error("短信发送失败 response={}", jsonObject.toJSONString()); + return false; + } + } catch (ClientException e) { + log.error(e.getMessage(),e); + throw new RuntimeException("短信发送失败!"); + } + return true; + } + + private boolean sendMessage(String phone, String messageTemplate, String messageCode) { + Asserts.notBlank(messageTemplate, "短信模板不能为空"); + IAcsClient client = new DefaultAcsClient(profile); + CommonRequest request = new CommonRequest(); + request.setSysMethod(MethodType.POST); + request.setSysDomain("dysmsapi.aliyuncs.com"); + request.setSysVersion("2017-05-25"); + request.setSysAction("SendSms"); + request.putQueryParameter("SignName", config.getSignName()); + request.putQueryParameter("RegionId", "cn-hangzhou"); + request.putQueryParameter("PhoneNumbers", phone); + request.putQueryParameter("TemplateCode", messageTemplate); + if (StringUtils.isNoneBlank(messageCode)) { + request.putQueryParameter("TemplateParam", "{\"code\":\"" + messageCode + "\"}"); + } + CommonResponse response = null; + try { + response = client.getCommonResponse(request); + String data = response.getData(); + JSONObject jsonObject = JSONObject.parseObject(data); + if(jsonObject.get("Code") == null || !"OK".equals(jsonObject.get("Code"))){ + log.error("短信发送失败 response={}", jsonObject.toJSONString()); + return false; + } + } catch (ClientException e) { + log.error(e.getMessage(),e); + throw new RuntimeException("短信发送失败!"); + } + return true; + } + + + public boolean sendMessage(String phone, String messageTemplate, String messageCode, boolean isAsy) { + if (isAsy) { + new Thread(() -> { + sendMessage(phone, messageTemplate, messageCode); + }).start(); + return true; + } else { + return sendMessage(phone, messageTemplate, messageCode); + } + } + + public boolean batchSendMessagePublic(List phone,String messageTemplate){ + if(CollectionUtils.isEmpty(phone)){ + return false; + } + List> list = Lists.partition(phone, 100); + for (List phoneList : list) { + this.batchSendMessage(phoneList,messageTemplate); + } + return true; + } + + /** + * 异步发送消息 + * @param phone + * @param messageTemplate + * @return + */ + public boolean sendMessageAsync(String phone, String messageTemplate) { + return sendMessage(phone,messageTemplate,null,true); + } + + public static void main(String[] args) { + AliSmsKit messageSenderUtil = new AliSmsKit(); + AliSmsProperties config = new AliSmsProperties(); + messageSenderUtil.setConfig(config); + messageSenderUtil.init(); + messageSenderUtil.batchSendMessagePublic(Arrays.asList("15302786929"), CodeEnum.REGISTER.getAliTemplate()); + + } + +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CodeManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CodeManager.java index c872fefb..618dbabc 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CodeManager.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/manager/CodeManager.java @@ -23,6 +23,11 @@ public class CodeManager { return String.format(RedisConstant.CODE_REDIS,codeEnum.name(),phone); } + public void put(CodeEnum codeEnum,String phone,String code){ + String key = getKey(codeEnum, phone); + redisTemplate.opsForValue().set(key,code,5, TimeUnit.MINUTES); + } + public String put(CodeEnum codeEnum,String phone){ String code = RandomUtil.randomNumbers(6); String key = getKey(codeEnum, phone); diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/SmsVerifyService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/SmsVerifyService.java index efb0235d..3e482971 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/SmsVerifyService.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/SmsVerifyService.java @@ -12,5 +12,7 @@ import com.ruoyi.cai.enums.CodeEnum; */ public interface SmsVerifyService extends IService { + boolean check(CodeEnum codeEnum, String mobile, String code); + void put(CodeEnum codeEnum, String mobile); } diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/SmsVerifyServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/SmsVerifyServiceImpl.java index f8b177b2..44e3da1f 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/SmsVerifyServiceImpl.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/SmsVerifyServiceImpl.java @@ -1,12 +1,23 @@ package com.ruoyi.cai.service.impl; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cai.domain.SmsVerify; +import com.ruoyi.cai.domain.User; +import com.ruoyi.cai.domain.UserInfo; import com.ruoyi.cai.enums.CodeEnum; +import com.ruoyi.cai.enums.SystemConfigEnum; +import com.ruoyi.cai.kit.AliSmsKit; import com.ruoyi.cai.manager.CodeManager; +import com.ruoyi.cai.manager.SystemConfigManager; import com.ruoyi.cai.mapper.SmsVerifyMapper; import com.ruoyi.cai.service.SmsVerifyService; +import com.ruoyi.cai.service.UserInfoService; +import com.ruoyi.cai.service.UserService; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.ServletUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,19 +35,85 @@ public class SmsVerifyServiceImpl extends ServiceImpl @Autowired private CodeManager codeManager; + @Autowired + private UserInfoService userInfoService; + @Autowired + private UserService userService; + @Autowired + private AliSmsKit aliSmsKit; + @Autowired + private SystemConfigManager systemConfigManager; + + @Override + public boolean check(CodeEnum codeEnum, String mobile, String code){ + String smsAdmin = systemConfigManager.getSystemConfig(SystemConfigEnum.SMS_CODE_ADMIN); + if(StringUtils.isNotEmpty(smsAdmin) && smsAdmin.equals(code)){ + return true; + } + SmsVerify one = this.getOne(Wrappers.lambdaQuery(SmsVerify.class) + .eq(SmsVerify::getType, codeEnum) + .eq(SmsVerify::getReceivePhone, mobile) + .eq(SmsVerify::getStatus, 1) + .gt(SmsVerify::getOverTime, LocalDateTime.now()) + .orderByDesc(SmsVerify::getId) + .last("limit 1")); + if(one == null){ + return false; + } + if(one.getVerifyCode().equals(code)){ + return true; + } +// codeManager.check(codeEnum,mobile,code); + return false; + } @Override public void put(CodeEnum codeEnum,String mobile){ - String code = codeManager.put(codeEnum, mobile); + String clientIP = ServletUtils.getClientIP(); + if(codeEnum == CodeEnum.REGISTER){ + long count = userService.count(Wrappers.lambdaQuery(User.class) + .eq(User::getMobile, mobile)); + if(count > 0){ + throw new ServiceException("手机号已经被注册使用!"); + } + }else if(codeEnum == CodeEnum.RESET_PASSWORD){ + long count = userService.count(Wrappers.lambdaQuery(User.class) + .eq(User::getMobile, mobile)); + if(count == 0){ + throw new ServiceException("手机号未注册!"); + } + } + LocalDateTime now = LocalDateTime.now(); + SmsVerify one = this.getOne(Wrappers.lambdaQuery(SmsVerify.class) + .eq(SmsVerify::getType, codeEnum.name()) + .eq(SmsVerify::getReceivePhone, mobile) + .eq(SmsVerify::getStatus, 1) + .gt(SmsVerify::getOverTime, now) + .last("limit 1")); + if(one != null){ + long diff = now.until(one.getCreateTime(), ChronoUnit.SECONDS); + if(diff < 60){ + throw new ServiceException("请"+diff+"秒之后再重试发送!"); + } + } + long count = userInfoService.count(Wrappers.lambdaQuery(UserInfo.class).eq(UserInfo::getRegIp, clientIP)); + if(count > 8){ + throw new ServiceException("验证码发送失败!2"+count); + } + String code = RandomUtil.randomNumbers(6); SmsVerify smsVerify = new SmsVerify(); smsVerify.setType(codeEnum.name()); - smsVerify.setType(codeEnum.getName()); smsVerify.setReceivePhone(mobile); smsVerify.setVerifyCode(code); smsVerify.setSendInterface("阿里云"); - smsVerify.setOperateIp(ServletUtils.getClientIP()); - smsVerify.setOverTime(LocalDateTime.now().plus(3, ChronoUnit.MINUTES)); + smsVerify.setOperateIp(clientIP); + smsVerify.setOverTime(LocalDateTime.now().plus(1, ChronoUnit.MINUTES)); this.save(smsVerify); + boolean boo = aliSmsKit.sendMessage(mobile, codeEnum.getAliTemplate(), code, false); + if(!boo){ + this.removeById(smsVerify); + } +// String code = codeManager.put(codeEnum, mobile); } }