重构短信功能
This commit is contained in:
@@ -1,6 +0,0 @@
|
||||
/**
|
||||
* msg 包,专门专门用于发送消息的功能,支撑上层的通用与核心业务。
|
||||
* 例如说:短信、邮件、app通知等等
|
||||
*
|
||||
*/
|
||||
package cn.iocoder.dashboard.modules.msg;
|
||||
@@ -1,12 +1,12 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms;
|
||||
|
||||
import cn.iocoder.dashboard.common.pojo.CommonResult;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms;
|
||||
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.common.pojo.CommonResult;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms.vo;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms.vo;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms.vo;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms.vo.req;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms.vo.req;
|
||||
|
||||
import cn.iocoder.dashboard.common.pojo.PageParam;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
@@ -7,11 +7,6 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
|
||||
|
||||
@ApiModel("消息渠道分页 Request VO")
|
||||
@Data
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms.vo.resp;
|
||||
|
||||
import io.swagger.annotations.ApiModel;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp;
|
||||
package cn.iocoder.dashboard.modules.system.controller.sms.vo.resp;
|
||||
|
||||
import cn.iocoder.dashboard.common.pojo.PageParam;
|
||||
import io.swagger.annotations.ApiModel;
|
||||
@@ -1,11 +1,11 @@
|
||||
package cn.iocoder.dashboard.modules.msg.convert.sms;
|
||||
package cn.iocoder.dashboard.modules.system.convert.sms;
|
||||
|
||||
import cn.iocoder.dashboard.common.enums.SmsChannelEnum;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.mapstruct.Mapper;
|
||||
@@ -1,9 +1,9 @@
|
||||
package cn.iocoder.dashboard.modules.msg.convert.sms;
|
||||
package cn.iocoder.dashboard.modules.system.convert.sms;
|
||||
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsTemplateVO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.mapstruct.Mapper;
|
||||
import org.mapstruct.Mapping;
|
||||
@@ -1,10 +1,10 @@
|
||||
package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms;
|
||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms;
|
||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms;
|
||||
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsLog;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsLog;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms;
|
||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms;
|
||||
|
||||
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms;
|
||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms;
|
||||
|
||||
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms;
|
||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms;
|
||||
package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms;
|
||||
|
||||
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
@@ -77,9 +77,11 @@ public interface SysErrorCodeConstants {
|
||||
|
||||
|
||||
// ========== 消息 1003001000 ==========
|
||||
ErrorCode SMS_CHANNEL_NOT_FOUND = new ErrorCode(1003001001, "没有短信渠道信息, 请初始化sms_channel表数据。");
|
||||
ErrorCode SMS_TEMPLATE_NOT_FOUND = new ErrorCode(1003001002, "没有短信模板信息, 请初始化sms_template表数据。");
|
||||
ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001003, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据");
|
||||
ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001004, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。");
|
||||
ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001,
|
||||
"短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient");
|
||||
ErrorCode SMS_CHANNEL_NOT_FOUND = new ErrorCode(1003001002, "没有短信渠道信息, 请初始化sms_channel表数据。");
|
||||
ErrorCode SMS_TEMPLATE_NOT_FOUND = new ErrorCode(1003001003, "没有短信模板信息, 请初始化sms_template表数据。");
|
||||
ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001004, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据");
|
||||
ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001005, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。");
|
||||
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package cn.iocoder.dashboard.modules.msg.service.sms;
|
||||
package cn.iocoder.dashboard.modules.system.service.sms;
|
||||
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.service.sms;
|
||||
package cn.iocoder.dashboard.modules.system.service.sms;
|
||||
|
||||
/**
|
||||
* 短信渠道Service接口
|
||||
@@ -1,4 +1,4 @@
|
||||
package cn.iocoder.dashboard.modules.msg.service.sms;
|
||||
package cn.iocoder.dashboard.modules.system.service.sms;
|
||||
|
||||
/**
|
||||
* 短信渠道Service接口
|
||||
@@ -1,21 +1,19 @@
|
||||
package cn.iocoder.dashboard.modules.msg.service.sms.impl;
|
||||
package cn.iocoder.dashboard.modules.system.service.sms.impl;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.iocoder.dashboard.common.enums.SmsChannelEnum;
|
||||
import cn.iocoder.dashboard.common.pojo.PageResult;
|
||||
import cn.iocoder.dashboard.framework.msg.sms.factory.AbstractSmsSenderFactory;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.msg.convert.sms.SmsChannelConvert;
|
||||
import cn.iocoder.dashboard.modules.msg.convert.sms.SmsTemplateConvert;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsChannelMapper;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms.SmsTemplateMapper;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO;
|
||||
import cn.iocoder.dashboard.modules.msg.service.sms.SmsChannelService;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.resp.SmsChannelEnumRespVO;
|
||||
import cn.iocoder.dashboard.modules.system.convert.sms.SmsChannelConvert;
|
||||
import cn.iocoder.dashboard.modules.system.convert.sms.SmsTemplateConvert;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsChannelMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.sms.SmsTemplateMapper;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsChannelDO;
|
||||
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.sms.SmsTemplateDO;
|
||||
import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@@ -76,12 +74,6 @@ public class SmsChannelServiceImpl implements SmsChannelService {
|
||||
|
||||
@Override
|
||||
public boolean flushChannel() {
|
||||
AbstractSmsSenderFactory smsSenderFactory = SpringUtil.getBean(AbstractSmsSenderFactory.class);
|
||||
if (smsSenderFactory == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
smsSenderFactory.flush(listChannelAllEnabledInfo());
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.dashboard.modules.msg.service.sms.impl;
|
||||
package cn.iocoder.dashboard.modules.system.service.sms.impl;
|
||||
|
||||
import cn.iocoder.dashboard.modules.msg.service.sms.SmsLogService;
|
||||
import cn.iocoder.dashboard.modules.system.service.sms.SmsLogService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
@@ -1,6 +1,6 @@
|
||||
package cn.iocoder.dashboard.modules.msg.service.sms.impl;
|
||||
package cn.iocoder.dashboard.modules.system.service.sms.impl;
|
||||
|
||||
import cn.iocoder.dashboard.modules.msg.service.sms.SmsTemplateService;
|
||||
import cn.iocoder.dashboard.modules.system.service.sms.SmsTemplateService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
@@ -0,0 +1,34 @@
|
||||
package cn.iocoder.dashboard.modules.system.sms;
|
||||
|
||||
import cn.iocoder.dashboard.framework.sms.SmsClient;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsClientAdapter;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.system.service.sms.SmsChannelService;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 短信服务配置
|
||||
*
|
||||
* @author guer
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnProperty("sms.enabled")
|
||||
public class SmsConfiguration {
|
||||
|
||||
@Resource
|
||||
private SmsChannelService channelService;
|
||||
|
||||
@Bean
|
||||
public SmsClientAdapter smsClientWrapper() {
|
||||
List<SmsChannelAllVO> smsChannelAllVOList = channelService.listChannelAllEnabledInfo();
|
||||
Map<Long, SmsClient<?>> channelId2SmsClientMap = SmsSenderUtils.init(smsChannelAllVOList);
|
||||
return new SmsClientAdapter(channelId2SmsClientMap);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
package cn.iocoder.dashboard.modules.system.sms;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.dashboard.common.enums.SmsChannelEnum;
|
||||
import cn.iocoder.dashboard.common.exception.ServiceException;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsBody;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsClient;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsClientAdapter;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsResult;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO;
|
||||
import cn.iocoder.dashboard.modules.system.sms.client.AliSmsClient;
|
||||
import cn.iocoder.dashboard.modules.system.sms.proxy.SmsClientLogProxy;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
|
||||
|
||||
/**
|
||||
* 短信发送者工厂
|
||||
*
|
||||
* @author zzf
|
||||
* @date 2021/1/25 16:18
|
||||
*/
|
||||
public class SmsSenderUtils {
|
||||
|
||||
/**
|
||||
* 短信渠道id:短信客户端map
|
||||
* key: channelId
|
||||
* val: SmsClient
|
||||
*/
|
||||
private static final Map<Long, SmsClient<?>> smsSenderMap = new ConcurrentHashMap<>(8);
|
||||
|
||||
/**
|
||||
* 短信模板code: 短信渠道id map
|
||||
* key: templateCode
|
||||
* val: channelId
|
||||
*/
|
||||
private static final Map<String, Long> templateCode2ChannelIdMap = new HashMap<>();
|
||||
|
||||
/**
|
||||
* 将短信渠道信息初始化成短信客户端
|
||||
*
|
||||
* @param smsChannelAllVOList 短信渠道信息
|
||||
* @return 短信渠道id:短信客户端map
|
||||
*/
|
||||
public synchronized static Map<Long, SmsClient<?>> init(List<SmsChannelAllVO> smsChannelAllVOList) {
|
||||
if (ObjectUtil.isEmpty(smsChannelAllVOList)) {
|
||||
throw new ServiceException(SMS_CHANNEL_NOT_FOUND);
|
||||
}
|
||||
addSender(smsChannelAllVOList);
|
||||
return smsSenderMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置短信客户端信息
|
||||
*
|
||||
* @param smsClientAdapter 短信客户端适配器
|
||||
* @param smsChannelAllVOList 短信渠道信息集合
|
||||
*/
|
||||
public synchronized static void flush(SmsClientAdapter smsClientAdapter, List<SmsChannelAllVO> smsChannelAllVOList) {
|
||||
smsSenderMap.clear();
|
||||
smsClientAdapter.flushClient(init(smsChannelAllVOList));
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送短信
|
||||
*
|
||||
* @param smsClientAdapter 短信客户端适配器
|
||||
* @param smsBody 短信内容
|
||||
* @param targetPhones 对象手机集合
|
||||
* @return 短信发送结果
|
||||
*/
|
||||
public static SmsResult<?> send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, Collection<String> targetPhones) {
|
||||
Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode());
|
||||
if (channelId == null) {
|
||||
throw new ServiceException(SMS_SENDER_NOT_FOUND);
|
||||
}
|
||||
return smsClientAdapter.send(channelId, smsBody, targetPhones);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送短信
|
||||
*
|
||||
* @param smsClientAdapter 短信客户端适配器
|
||||
* @param smsBody 短信内容
|
||||
* @param targetPhone 对象手机
|
||||
* @return 短信发送结果
|
||||
*/
|
||||
public static SmsResult<?> send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, String targetPhone) {
|
||||
Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode());
|
||||
if (channelId == null) {
|
||||
throw new ServiceException(SMS_SENDER_NOT_FOUND);
|
||||
}
|
||||
return smsClientAdapter.send(channelId, smsBody, Collections.singletonList(targetPhone));
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送短信
|
||||
*
|
||||
* @param smsClientAdapter 短信客户端适配器
|
||||
* @param smsBody 短信内容
|
||||
* @param targetPhones 对象手机数组
|
||||
* @return 短信发送结果
|
||||
*/
|
||||
public static SmsResult<?> send(SmsClientAdapter smsClientAdapter, SmsBody smsBody, String... targetPhones) {
|
||||
Long channelId = templateCode2ChannelIdMap.get(smsBody.getCode());
|
||||
if (channelId == null) {
|
||||
throw new ServiceException(SMS_SENDER_NOT_FOUND);
|
||||
}
|
||||
return smsClientAdapter.send(channelId, smsBody, Arrays.asList(targetPhones));
|
||||
}
|
||||
|
||||
|
||||
private static void addSender(List<SmsChannelAllVO> smsChannelAllVOList) {
|
||||
smsChannelAllVOList.forEach(channelAllVO -> addSender(SmsChannelEnum.getByCode(channelAllVO.getCode()), channelAllVO));
|
||||
}
|
||||
|
||||
private static void addSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) {
|
||||
if (channelEnum == null) {
|
||||
throw new ServiceException(INVALID_CHANNEL_CODE);
|
||||
}
|
||||
List<SmsTemplateVO> templateList = channelAllVO.getTemplateList();
|
||||
if (ObjectUtil.isEmpty(templateList)) {
|
||||
throw new ServiceException(SMS_TEMPLATE_NOT_FOUND);
|
||||
}
|
||||
SmsClient<?> aliSmsClient = getSender(channelEnum, channelAllVO);
|
||||
templateList.forEach(smsTemplateVO -> templateCode2ChannelIdMap.put(smsTemplateVO.getCode(), channelAllVO.getId()));
|
||||
smsSenderMap.put(channelAllVO.getId(), aliSmsClient);
|
||||
}
|
||||
|
||||
private static SmsClient<?> getSender(SmsChannelEnum channelEnum, SmsChannelAllVO channelAllVO) {
|
||||
switch (channelEnum) {
|
||||
case ALI:
|
||||
return new SmsClientLogProxy<>(new AliSmsClient(channelAllVO));
|
||||
// TODO fill more channel
|
||||
default:
|
||||
break;
|
||||
}
|
||||
throw new ServiceException(SMS_SENDER_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package cn.iocoder.dashboard.modules.system.sms.client;
|
||||
|
||||
import cn.iocoder.dashboard.framework.sms.SmsBody;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsClient;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsResult;
|
||||
import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;
|
||||
import com.aliyuncs.DefaultAcsClient;
|
||||
import com.aliyuncs.IAcsClient;
|
||||
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
|
||||
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
|
||||
import com.aliyuncs.http.MethodType;
|
||||
import com.aliyuncs.profile.DefaultProfile;
|
||||
import com.aliyuncs.profile.IClientProfile;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 阿里短信实现类
|
||||
*
|
||||
* @author zzf
|
||||
* @date 2021/1/25 14:17
|
||||
*/
|
||||
@Slf4j
|
||||
public class AliSmsClient implements SmsClient<SendSmsResponse> {
|
||||
|
||||
private static final String OK = "OK";
|
||||
|
||||
private static final String PRODUCT = "Dysmsapi";
|
||||
|
||||
private static final String DOMAIN = "dysmsapi.aliyuncs.com";
|
||||
|
||||
private static final String ENDPOINT = "cn-hangzhou";
|
||||
|
||||
private final SmsChannelAllVO channelVO;
|
||||
|
||||
private final IAcsClient acsClient;
|
||||
|
||||
/**
|
||||
* 构造阿里云短信发送处理
|
||||
*
|
||||
* @param channelVO 阿里云短信配置
|
||||
*/
|
||||
public AliSmsClient(SmsChannelAllVO channelVO) {
|
||||
|
||||
this.channelVO = channelVO;
|
||||
|
||||
String accessKeyId = channelVO.getApiKey();
|
||||
String accessKeySecret = channelVO.getApiSecret();
|
||||
|
||||
IClientProfile profile = DefaultProfile.getProfile(ENDPOINT, accessKeyId, accessKeySecret);
|
||||
DefaultProfile.addEndpoint(ENDPOINT, PRODUCT, DOMAIN);
|
||||
|
||||
acsClient = new DefaultAcsClient(profile);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public SmsResult<SendSmsResponse> send(SmsBody msgBody, Collection<String> targets) {
|
||||
SendSmsRequest request = new SendSmsRequest();
|
||||
request.setSysMethod(MethodType.POST);
|
||||
request.setPhoneNumbers(StringUtils.join(targets, ","));
|
||||
request.setSignName(channelVO.getApiSignatureId());
|
||||
request.setTemplateCode(channelVO.getTemplateByTemplateCode(msgBody.getCode()).getApiTemplateId());
|
||||
request.setTemplateParam(msgBody.getParamsStr());
|
||||
|
||||
try {
|
||||
SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
|
||||
|
||||
boolean result = OK.equals(sendSmsResponse.getCode());
|
||||
if (!result) {
|
||||
log.debug("send fail[code={}, message={}]", sendSmsResponse.getCode(), sendSmsResponse.getMessage());
|
||||
}
|
||||
SmsResult<SendSmsResponse> resultBody = new SmsResult<>();
|
||||
resultBody.setSuccess(result);
|
||||
resultBody.setResult(sendSmsResponse);
|
||||
return resultBody;
|
||||
} catch (Exception e) {
|
||||
log.debug(e.getMessage(), e);
|
||||
}
|
||||
|
||||
return failResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResult<SendSmsResponse> sendAsync(SmsBody msgBody, Collection<String> targets) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package cn.iocoder.dashboard.modules.system.sms.proxy;
|
||||
|
||||
import cn.iocoder.dashboard.framework.sms.SmsBody;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsClient;
|
||||
import cn.iocoder.dashboard.framework.sms.SmsResult;
|
||||
import cn.iocoder.dashboard.util.json.JsonUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 消息父接口
|
||||
*
|
||||
* @author zzf
|
||||
* @date 2021/1/22 15:46
|
||||
*/
|
||||
@Slf4j
|
||||
public class SmsClientLogProxy<R> implements SmsClient<R> {
|
||||
|
||||
private final SmsClient<R> smsClient;
|
||||
|
||||
@Override
|
||||
public SmsResult<R> send(SmsBody msgBody, Collection<String> targets) {
|
||||
log.debug("ready send sms, body: {}, target: {}", JsonUtils.toJsonString(msgBody), targets);
|
||||
|
||||
SmsResult<R> resultBody = smsClient.send(msgBody, targets);
|
||||
|
||||
if (resultBody.getSuccess()) {
|
||||
//
|
||||
} else {
|
||||
log.warn("send sms fail, body: {}, target: {}, resultBody: {}",
|
||||
JsonUtils.toJsonString(msgBody),
|
||||
targets,
|
||||
JsonUtils.toJsonString(resultBody)
|
||||
);
|
||||
}
|
||||
return resultBody;
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsResult<R> sendAsync(SmsBody msgBody, Collection<String> targets) {
|
||||
return send(msgBody, targets);
|
||||
}
|
||||
|
||||
public SmsClientLogProxy(SmsClient<R> smsClient) {
|
||||
this.smsClient = smsClient;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user