feat: SMS 结合工厂+策略模式

This commit is contained in:
landaiqing
2024-05-11 20:44:12 +08:00
parent 7b2a795a13
commit fce3423ad7
15 changed files with 247 additions and 92 deletions

View File

@@ -66,11 +66,5 @@
<artifactId>schisandra-cloud-storage-auth-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xkcoding</groupId>
<artifactId>justauth-spring-boot-starter</artifactId>
<version>1.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@@ -1,31 +1,17 @@
package com.schisandra.auth.application.config;
import com.schisandra.auth.application.convert.SchisandraSmsConfigDTOConvert;
import com.schisandra.auth.application.dto.SchisandraSmsConfigDTO;
import com.schisandra.auth.domain.bo.SchisandraSmsConfigBO;
import com.schisandra.auth.domain.service.SchisandraSmsConfigDomainService;
import com.schisandra.auth.infra.basic.entity.SchisandraSmsConfig;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import javax.annotation.Resource;
import java.util.List;
@Configuration
public class SmsInitConfig {
@Resource
SmsReadConfig smsReadConfig;
@Resource
SchisandraSmsConfigDomainService schisandraSmsConfigDomainService;
@EventListener
public void init(ContextRefreshedEvent event){
List<SchisandraSmsConfigBO> SchisandraSmsConfigBOs= schisandraSmsConfigDomainService.queryAll();
List<SchisandraSmsConfigDTO> schisandraSmsConfigDTOS = SchisandraSmsConfigDTOConvert.INSTANCE.convertBOToDTOList(SchisandraSmsConfigBOs);
for (SchisandraSmsConfigDTO schisandraSmsConfig : schisandraSmsConfigDTOS){
if (schisandraSmsConfig!=null){
// 创建SmsBlend 短信实例
SmsFactory.createSmsBlend(smsReadConfig);
};
}}
public void init(ContextRefreshedEvent event) {
SmsFactory.createSmsBlend(smsReadConfig, "alibaba");
}
}

View File

@@ -1,19 +1,11 @@
package com.schisandra.auth.application.config;
import com.schisandra.auth.application.convert.SchisandraSmsConfigDTOConvert;
import com.schisandra.auth.application.dto.SchisandraSmsConfigDTO;
import com.schisandra.auth.domain.bo.SchisandraSmsConfigBO;
import com.schisandra.auth.domain.service.SchisandraSmsConfigDomainService;
import com.schisandra.auth.infra.basic.dao.SchisandraSmsConfigDao;
import com.schisandra.auth.infra.basic.entity.SchisandraSmsConfig;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.huawei.config.HuaweiConfig;
import com.schisandra.auth.application.factory.SmsTypeHandlerFactory;
import com.schisandra.auth.application.handler.SchisandraSmsTypeHandler;
import org.dromara.sms4j.provider.config.BaseConfig;
import org.dromara.sms4j.tencent.config.TencentConfig;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
@@ -27,62 +19,21 @@ import java.util.List;
*/
@Component
public class SmsReadConfig implements org.dromara.sms4j.core.datainterface.SmsReadConfig {
@Resource
SchisandraSmsConfigDomainService schisandraSmsConfigDomainService;
private SmsTypeHandlerFactory smsTypeHandlerFactory;
@Override
public BaseConfig getSupplierConfig(String configId) {
return null;
SchisandraSmsTypeHandler handler = smsTypeHandlerFactory.getHandler(configId);
return handler.addConfig(configId);
}
@Override
public List<BaseConfig> getSupplierConfigList() {
List<BaseConfig> configs = new ArrayList<>();
List<SchisandraSmsConfigBO> SchisandraSmsConfigBOs= schisandraSmsConfigDomainService.queryAll();
List<SchisandraSmsConfigDTO> schisandraSmsConfigDTOS = SchisandraSmsConfigDTOConvert.INSTANCE.convertBOToDTOList(SchisandraSmsConfigBOs);
for (SchisandraSmsConfigDTO schisandraSmsConfig : schisandraSmsConfigDTOS){
if ("alibaba".equals(schisandraSmsConfig.getConfigId())) {
AlibabaConfig alibabaConfig = new AlibabaConfig();
alibabaConfig.setConfigId(schisandraSmsConfig.getConfigId());
alibabaConfig.setRequestUrl(schisandraSmsConfig.getRequestUrl());
alibabaConfig.setAccessKeyId(schisandraSmsConfig.getAccessKeyId());
alibabaConfig.setAccessKeySecret(schisandraSmsConfig.getAccessKeySecret());
alibabaConfig.setSignature(schisandraSmsConfig.getSignature());
alibabaConfig.setTemplateId(schisandraSmsConfig.getTemplateId());
alibabaConfig.setTemplateName(schisandraSmsConfig.getTemplateName());
alibabaConfig.setSdkAppId(schisandraSmsConfig.getSdkAppId());
configs.add(alibabaConfig);
}
if ("tencent".equals(schisandraSmsConfig.getConfigId())) {
TencentConfig tencentConfig=new TencentConfig();
tencentConfig.setConfigId(schisandraSmsConfig.getConfigId());
tencentConfig.setAccessKeyId(schisandraSmsConfig.getAccessKeyId());
tencentConfig.setAccessKeySecret(schisandraSmsConfig.getAccessKeySecret());
tencentConfig.setSdkAppId(schisandraSmsConfig.getSdkAppId());
tencentConfig.setService(schisandraSmsConfig.getSdkAppId());
tencentConfig.setRequestUrl(schisandraSmsConfig.getRequestUrl());
tencentConfig.setTerritory(schisandraSmsConfig.getRegion());
tencentConfig.setAction(schisandraSmsConfig.getAction());
tencentConfig.setSignature(schisandraSmsConfig.getSignature());
tencentConfig.setTemplateId(schisandraSmsConfig.getTemplateId());
tencentConfig.setVersion(schisandraSmsConfig.getVersion());
tencentConfig.setConnTimeout(schisandraSmsConfig.getConnTimeout());
tencentConfig.setSdkAppId(schisandraSmsConfig.getSdkAppId());
configs.add(tencentConfig);
}
if ("huawei".equals(schisandraSmsConfig.getConfigId())) {
HuaweiConfig huaweiConfig = new HuaweiConfig();
huaweiConfig.setConfigId(schisandraSmsConfig.getConfigId());
huaweiConfig.setSdkAppId(schisandraSmsConfig.getSdkAppId());
huaweiConfig.setAccessKeySecret(schisandraSmsConfig.getAccessKeySecret());
huaweiConfig.setAccessKeyId(schisandraSmsConfig.getAccessKeyId());
huaweiConfig.setUrl(schisandraSmsConfig.getUrl());
huaweiConfig.setSignature(schisandraSmsConfig.getSignature());
huaweiConfig.setTemplateId(schisandraSmsConfig.getTemplateId());
configs.add(huaweiConfig);
}}
return configs;
return null;
}

View File

@@ -1,10 +1,14 @@
package com.schisandra.auth.application.controller;
import com.schisandra.auth.application.config.SmsReadConfig;
import com.schisandra.auth.application.factory.SmsTypeHandlerFactory;
import com.schisandra.auth.application.handler.SchisandraSmsTypeHandler;
import com.schisandra.auth.common.entity.Result;
import com.schisandra.auth.common.redis.RedisUtil;
import com.schisandra.auth.common.utils.SmsCodeUtils;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.springframework.web.bind.annotation.GetMapping;
@@ -21,6 +25,8 @@ import static java.util.concurrent.TimeUnit.SECONDS;
public class SchisandraSmsController {
@Resource
private RedisUtil redisUtil;
@Resource
private SmsReadConfig smsReadConfig;
private final String authPhonePrefix="auth.phone";
/**
@@ -35,7 +41,7 @@ public class SchisandraSmsController {
String prefix = redisUtil.buildKey(authPhonePrefix, phone);
String code = SmsCodeUtils.generateValidateCode(4).toString();
if (!redisUtil.exist(prefix)){
SmsResponse smsResponse=SmsFactory.getBySupplier("alibaba").sendMessage(phone,code);
SmsResponse smsResponse=SmsFactory.getSmsBlend("alibaba").sendMessage(phone,code);
if (smsResponse.isSuccess()){
redisUtil.setNx(prefix, code, 60L,SECONDS);
return Result.ok();

View File

@@ -0,0 +1,40 @@
package com.schisandra.auth.application.factory;
import com.schisandra.auth.application.handler.SchisandraSmsTypeHandler;
import com.schisandra.auth.common.enums.SmsSupplierType;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Classname SmsTypeHandlerFactory
* @BelongsProject: schisandra-cloud-storage
* @BelongsPackage: com.schisandra.auth.application.factory
* @Author: landaiqing
* @CreateTime: 2024-05-11 18:36
* @Description: TODO
* @Version: 1.0
*/
@Component
public class SmsTypeHandlerFactory implements InitializingBean {
@Resource
private List<SchisandraSmsTypeHandler> smsTypeHandlerList;
private HashMap<SmsSupplierType,SchisandraSmsTypeHandler> handlerMap =new HashMap<>();
public SchisandraSmsTypeHandler getHandler(String configId){
SmsSupplierType smsSupplierType = SmsSupplierType.getByKey(configId);
return handlerMap.get(smsSupplierType);
}
@Override
public void afterPropertiesSet() throws Exception {
for(SchisandraSmsTypeHandler smsTypeHandler : smsTypeHandlerList){
handlerMap.put(smsTypeHandler.getHandlerType(),smsTypeHandler);
}
}
}

View File

@@ -0,0 +1,51 @@
package com.schisandra.auth.application.handler;
import com.schisandra.auth.application.convert.SchisandraSmsConfigDTOConvert;
import com.schisandra.auth.application.dto.SchisandraSmsConfigDTO;
import com.schisandra.auth.common.enums.SmsSupplierType;
import com.schisandra.auth.domain.bo.SchisandraSmsConfigBO;
import com.schisandra.auth.domain.service.SchisandraSmsConfigDomainService;
import org.apache.commons.lang3.ObjectUtils;
import org.dromara.sms4j.aliyun.config.AlibabaConfig;
import org.dromara.sms4j.provider.config.BaseConfig;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @Classname AlibabaSmsHandler
* @BelongsProject: schisandra-cloud-storage
* @BelongsPackage: com.schisandra.auth.application.handler
* @Author: landaiqing
* @CreateTime: 2024-05-11 18:20
* @Description: TODO
* @Version: 1.0
*/
@Component
public class AlibabaSmsHandler implements SchisandraSmsTypeHandler{
@Resource
SchisandraSmsConfigDomainService schisandraSmsConfigDomainService;
@Override
public SmsSupplierType getHandlerType() {
return SmsSupplierType.ALIBABA;
}
@Override
public BaseConfig addConfig(String configId) {
SchisandraSmsConfigBO schisandraSmsConfigBO = schisandraSmsConfigDomainService.queryByConfigId(configId);
SchisandraSmsConfigDTO schisandraSmsConfigDTO = SchisandraSmsConfigDTOConvert.INSTANCE.convertBOToDTO(schisandraSmsConfigBO);
if (ObjectUtils.isEmpty(schisandraSmsConfigDTO)){
return null;
}
AlibabaConfig alibabaConfig=new AlibabaConfig();
alibabaConfig.setConfigId(schisandraSmsConfigDTO.getConfigId());
alibabaConfig.setRequestUrl(schisandraSmsConfigDTO.getRequestUrl());
alibabaConfig.setAccessKeyId(schisandraSmsConfigDTO.getAccessKeyId());
alibabaConfig.setAccessKeySecret(schisandraSmsConfigDTO.getAccessKeySecret());
alibabaConfig.setSignature(schisandraSmsConfigDTO.getSignature());
alibabaConfig.setTemplateId(schisandraSmsConfigDTO.getTemplateId());
alibabaConfig.setTemplateName(schisandraSmsConfigDTO.getTemplateName());
alibabaConfig.setSdkAppId(schisandraSmsConfigDTO.getSdkAppId());
return alibabaConfig;
}
}

View File

@@ -0,0 +1,21 @@
package com.schisandra.auth.application.handler;
import com.schisandra.auth.common.enums.SmsSupplierType;
import org.dromara.sms4j.provider.config.BaseConfig;
import org.springframework.stereotype.Component;
/**
* @Classname SchisandraSmsTypeHandler
* @BelongsProject: schisandra-cloud-storage
* @BelongsPackage: com.schisandra.auth.application.handler
* @Author: landaiqing
* @CreateTime: 2024-05-11 18:04
* @Description: TODO
* @Version: 1.0
*/
@Component
public interface SchisandraSmsTypeHandler {
SmsSupplierType getHandlerType();
BaseConfig addConfig(String configId);
}

View File

@@ -110,14 +110,6 @@
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.8</version>
</dependency>
<dependency>
<groupId>org.apache.directory.studio</groupId>
<artifactId>org.apache.commons.codec</artifactId>
@@ -125,9 +117,16 @@
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-extra</artifactId>
<version>5.8.27</version>
<groupId>com.xkcoding</groupId>
<artifactId>justauth-spring-boot-starter</artifactId>
<version>1.1.0</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>hutool-http</artifactId>
<groupId>cn.hutool</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

View File

@@ -0,0 +1,82 @@
package com.schisandra.auth.common.enums;
import lombok.Getter;
@Getter
public enum SmsSupplierType {
/**
* 阿里云
*/
ALIBABA("alibaba"),
/**
* 华为云
*/
HUAWEI("huawei"),
/**
* 云片
*/
YUNPIAN("yunpian"),
/**
* 腾讯云
*/
TENCENT("tenxun"),
/**
* 合一短信
*/
UNI_SMS("uni"),
/**
* 京东云
*/
JD_CLOUD("jd"),
/**
* 容联云
*/
CLOOPEN("cloopen"),
/**
* 亿美软通
*/
EMAY("emay"),
/**
* 天翼云
*/
CTYUN("ctyun"),
/**
* 网易云
*/
WANGYIYUN("wangyiyun"),
/**
* 七牛云
*/
QINIU("qiniu"),
/**
* 助通
*/
ZHUTONG("zhutong"),
/**
* 联麓
*/
LIANLU("lianlu"),
/**
* 鼎众
*/
DINGZHONG("dingzhong"),
;
public String key;
SmsSupplierType(String key) {
this.key = key;
}
public static SmsSupplierType getByKey(String key) {
for (SmsSupplierType resultKeyEnum : SmsSupplierType.values()) {
if (resultKeyEnum.key.equals(key)) {
return resultKeyEnum;
}
}
return null;
}
}

View File

@@ -18,5 +18,7 @@ public interface SchisandraSmsConfigDomainService {
List<SchisandraSmsConfigBO> queryAll();
SchisandraSmsConfigBO queryByConfigId(String configId);
}

View File

@@ -23,4 +23,12 @@ public class SchisandraSmsConfigDomainServiceImpl implements SchisandraSmsConfig
}
@Override
public SchisandraSmsConfigBO queryByConfigId(String configId) {
SchisandraSmsConfig schisandraSmsConfig= schisandraSmsConfigService.queryByConfigId(configId);
SchisandraSmsConfigBO schisandraSmsConfigBO = SchisandraSmsConfigBOConvert.INSTANCE.convertEntityToBO(schisandraSmsConfig);
return schisandraSmsConfigBO;
}
}

View File

@@ -81,5 +81,7 @@ public interface SchisandraSmsConfigDao {
int deleteById(Integer id);
List<SchisandraSmsConfig> queryAll();
SchisandraSmsConfig queryByConfigId(String configId);
}

View File

@@ -56,4 +56,6 @@ public interface SchisandraSmsConfigService {
boolean deleteById(Integer id);
List<SchisandraSmsConfig> queryAll();
SchisandraSmsConfig queryByConfigId(String configId);
}

View File

@@ -85,4 +85,9 @@ public class SchisandraSmsConfigServiceImpl implements SchisandraSmsConfigServic
public List<SchisandraSmsConfig> queryAll() {
return schisandraSmsConfigDao.queryAll();
}
@Override
public SchisandraSmsConfig queryByConfigId(String configId) {
return schisandraSmsConfigDao.queryByConfigId(configId);
}
}

View File

@@ -335,6 +335,12 @@
from schisandra_sms_config
where is_deleted = 0
</select>
<select id="queryByConfigId" resultMap="SchisandraSmsConfigMap">
select *
from schisandra_sms_config
where config_id = #{configId}
and is_deleted = 0
</select>
<!--新增所有列-->
<insert id="insert" keyProperty="id" useGeneratedKeys="true">