增加短信功能实现

This commit is contained in:
zefeng_java
2021-01-27 13:52:44 +08:00
parent 842496a534
commit df8bda53e8
42 changed files with 1660 additions and 72 deletions

View File

@@ -0,0 +1,54 @@
package cn.iocoder.dashboard.modules.msg.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 io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
@Api("短信 渠道/签名 API")
@RestController
@RequestMapping("/sms/channel")
public class SmsChannelController {
@Resource
private SmsChannelService service;
@ApiOperation("获取渠道/签名分页")
@GetMapping("/page")
public CommonResult<PageResult<SmsChannelDO>> getPermissionInfo(@Validated SmsChannelPageReqVO reqVO) {
return success(service.pageChannels(reqVO));
}
@ApiOperation("获取渠道枚举")
@GetMapping("/list/channel-enum")
public CommonResult<List<SmsChannelEnumRespVO>> getChannelEnums() {
return success(service.getChannelEnums());
}
@ApiOperation("添加消息渠道")
@PostMapping("/create")
public CommonResult<Long> add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) {
return success(service.createChannel(reqVO));
}
@ApiOperation("刷新消息渠道信息")
@PutMapping("/flush")
public CommonResult<Boolean> flushChannel() {
return success(service.flushChannel());
}
}

View File

@@ -0,0 +1,84 @@
package cn.iocoder.dashboard.modules.msg.controller.sms;
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
import cn.iocoder.dashboard.util.collection.SetUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
import static cn.iocoder.dashboard.framework.security.core.util.SecurityUtils.getLoginUserId;
import static cn.iocoder.dashboard.framework.security.core.util.SecurityUtils.getLoginUserRoleIds;
@Api("认证 API")
@RestController
@RequestMapping("/sms/template")
public class SmsTemplateController {
@Resource
private SysAuthService authService;
@Resource
private SysUserService userService;
@Resource
private SysRoleService roleService;
@Resource
private SysPermissionService permissionService;
@ApiOperation("使用账号密码登录")
@PostMapping("/login")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
public CommonResult<SysAuthLoginRespVO> login(@RequestBody @Valid SysAuthLoginReqVO reqVO) {
String token = authService.login(reqVO.getUsername(), reqVO.getPassword(), reqVO.getUuid(), reqVO.getCode());
// 返回结果
return success(SysAuthLoginRespVO.builder().token(token).build());
}
@ApiOperation("获取登陆用户的权限信息")
@GetMapping("/get-permission-info")
public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {
// 获得用户信息
SysUserDO user = userService.getUser(getLoginUserId());
if (user == null) {
return null;
}
// 获得角色列表
List<SysRoleDO> roleList = roleService.listRolesFromCache(getLoginUserRoleIds());
// 获得菜单列表
List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(),
SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()),
SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
// 拼接结果返回
return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList));
}
@ApiOperation("获得登陆用户的菜单列表")
@GetMapping("list-menus")
public CommonResult<List<SysAuthMenuRespVO>> listMenus() {
// 获得用户拥有的菜单列表
List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(),
SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型
SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的
// 转换成 Tree 结构返回
return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList));
}
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.dashboard.modules.msg.controller.sms.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.List;
/**
* 渠道(包含模板)信息VO类
*
* @author zzf
* @date 2021/1/25 17:01
*/
@Data
@EqualsAndHashCode
public class SmsChannelAllVO implements Serializable {
/**
* id
*/
private Long id;
/**
* 编码(来自枚举类 阿里、华为、七牛等)
*/
private String code;
/**
* 渠道账号id
*/
private String apiKey;
/**
* 渠道账号秘钥
*/
private String apiSecret;
/**
* 实际渠道签名唯一标识
*/
private String apiSignatureId;
/**
* 签名值
*/
private String signature;
/**
* 该渠道名下的短信模板集合
*/
private List<SmsTemplateVO> templateList;
public SmsTemplateVO getTemplateByTemplateCode(String tempCode) {
return templateList.stream().filter(s -> s.getCode().equals(tempCode)).findFirst().get();
}
}

View File

@@ -0,0 +1,30 @@
package cn.iocoder.dashboard.modules.msg.controller.sms.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 渠道模板VO类
*
* @author zzf
* @date 2021/1/25 17:03
*/
@Data
@EqualsAndHashCode
public class SmsTemplateVO {
/**
* 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)
*/
private String bizCode;
/**
* 编码
*/
private String code;
/**
* 实际渠道模板唯一标识
*/
private String apiTemplateId;
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@ApiModel("消息渠道创建 Request VO")
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class SmsChannelCreateReqVO implements Serializable {
@ApiModelProperty("编码(来自枚举类 阿里、华为、七牛等)")
private String code;
@ApiModelProperty("渠道账号id")
private String apiKey;
@ApiModelProperty("渠道账号秘钥")
private String apiSecret;
@ApiModelProperty("优先级(存在多个签名时,选择值最小的,渠道不可用时,按优先级从小到大切换)")
private Integer priority;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("签名值")
private String signature;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("启用状态0正常 1停用")
private Integer status;
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.req;
import cn.iocoder.dashboard.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
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
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class SmsChannelPageReqVO extends PageParam {
@ApiModelProperty(value = "渠道名", example = "阿里", notes = "模糊匹配")
private String name;
@ApiModelProperty(value = "签名值", example = "源码", notes = "模糊匹配")
private String signature;
}

View File

@@ -0,0 +1,21 @@
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@ApiModel("用户分页 Request VO")
@Data
@NoArgsConstructor
@EqualsAndHashCode
public class SmsChannelEnumRespVO implements Serializable {
private String code;
private String name;
}

View File

@@ -0,0 +1,43 @@
package cn.iocoder.dashboard.modules.msg.controller.sms.vo.resp;
import cn.iocoder.dashboard.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
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
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class SmsChannelPageRespVO extends PageParam {
@ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配")
private String username;
@ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配")
private String mobile;
@ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
private Integer status;
@ApiModelProperty(value = "开始时间", example = "2020-10-24")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束时间", example = "2020-10-24")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
@ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门")
private Long deptId;
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.dashboard.modules.msg.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.user.vo.user.SysUserUpdateReqVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface SmsChannelConvert {
SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class);
@Mapping(source = "records", target = "list")
PageResult<SmsChannelDO> convertPage(IPage<SmsChannelDO> page);
SmsChannelDO convert(SmsChannelCreateReqVO bean);
SmsChannelDO convert(SysUserUpdateReqVO bean);
List<SmsChannelEnumRespVO> convertEnum(List<SmsChannelEnum> bean);
List<SmsChannelAllVO> convert(List<SmsChannelDO> bean);
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.dashboard.modules.msg.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 com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface SmsTemplateConvert {
SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class);
@Mapping(source = "records", target = "list")
PageResult<SmsChannelDO> convertPage(IPage<SmsChannelDO> page);
List<SmsTemplateVO> convert(List<SmsTemplateDO> bean);
SmsTemplateVO convert(SmsTemplateDO bean);
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.dashboard.modules.msg.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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SmsChannelMapper extends BaseMapper<SmsChannelDO> {
default IPage<SmsChannelDO> selectChannelPage(SmsChannelPageReqVO reqVO) {
return selectPage(MyBatisUtils.buildPage(reqVO), new LambdaQueryWrapper<SmsChannelDO>()
.like(StrUtil.isNotBlank(reqVO.getName()), SmsChannelDO::getName, reqVO.getName())
.like(StrUtil.isNotBlank(reqVO.getSignature()), SmsChannelDO::getName, reqVO.getSignature())
);
}
default List<SmsChannelDO> selectEnabledList() {
return selectList(new LambdaQueryWrapper<SmsChannelDO>()
.eq(SmsChannelDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.orderByAsc(SmsChannelDO::getId)
);
}
}

View File

@@ -0,0 +1,10 @@
package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms;
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SmsLogMapper extends BaseMapper<SmsLog> {
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.dashboard.modules.msg.dal.mysql.dao.sms;
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
import cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms.SmsTemplateDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SmsTemplateMapper extends BaseMapper<SmsTemplateDO> {
/**
* 根据短信渠道id查询短信模板集合
*
* @param channelId 渠道id
* @return 模板集合
*/
default List<SmsTemplateDO> selectListByChannelId(Long channelId) {
return selectList(new LambdaQueryWrapper<SmsTemplateDO>()
.eq(SmsTemplateDO::getChannelId, channelId)
.eq(SmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.orderByAsc(SmsTemplateDO::getId)
);
}
/**
* 查询有效短信模板集合
*
* @return 有效短信模板集合
*/
default List<SmsTemplateDO> selectEnabledList() {
return selectList(new LambdaQueryWrapper<SmsTemplateDO>()
.eq(SmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus())
.orderByAsc(SmsTemplateDO::getId)
);
}
}

View File

@@ -0,0 +1,65 @@
package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms;
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 短信渠道
*
* @author zzf
* @since 2021-01-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "sms_channel", autoResultMap = true)
public class SmsChannelDO extends BaseDO {
/**
* 自增编号
*/
private Long id;
/**
* 编码(来自枚举类 阿里、华为、七牛等)
*/
private String code;
/**
* 渠道账号id
*/
private String apiKey;
/**
* 渠道账号秘钥
*/
private String apiSecret;
/**
* 实际渠道签名唯一标识
*/
private String apiSignatureId;
/**
* 名称
*/
private String name;
/**
* 签名值
*/
private String signature;
/**
* 备注
*/
private String remark;
/**
* 启用状态0正常 1停用
*/
private Integer status;
}

View File

@@ -0,0 +1,71 @@
package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 短信日志
*
* @author zzf
* @since 2021-01-25
*/
@Data
@EqualsAndHashCode
@TableName(value = "sms_log", autoResultMap = true)
public class SmsLog implements Serializable {
/**
* 自增编号
*/
private Long id;
/**
* 短信渠道编码(来自枚举类)
*/
private String channelCode;
/**
* 实际渠道短信唯一标识
*/
private String apiSmsId;
/**
* 模板id
*/
private Long templateId;
/**
* 手机号
*/
private String phone;
/**
* 内容
*/
private String content;
/**
* 备注
*/
private String remark;
/**
* 发送状态0发送中 1成功 2失败
*/
private Integer sendStatus;
/**
* 创建者
*/
private String createBy;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,81 @@
package cn.iocoder.dashboard.modules.msg.dal.mysql.daoobject.sms;
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 短信模板
*
* @author zzf
* @since 2021-01-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "sms_template", autoResultMap = true)
public class SmsTemplateDO extends BaseDO {
/**
* 自增编号
*/
private Long id;
/**
* 短信渠道编码(来自枚举类)
*/
private String channelCode;
/**
* 短信渠道id (对于前端来说就是绑定一个签名)
*/
private Long channelId;
/**
* 消息类型 [0验证码 1短信通知 2推广短信 3国际/港澳台消息]
*/
private Integer type;
/**
* 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板)
*/
private String bizCode;
/**
* 编码
*/
private String code;
/**
* 名称
*/
private String name;
/**
* 实际渠道模板唯一标识
*/
private String apiTemplateId;
/**
* 内容
*/
private String content;
/**
* 参数数组(自动根据内容生成)
*/
private String params;
/**
* 备注
*/
private String remark;
/**
* 启用状态0正常 1停用
*/
private Integer status;
}

View File

@@ -0,0 +1,6 @@
/**
* msg 包,专门专门用于发送消息的功能,支撑上层的通用与核心业务。
* 例如说短信、邮件、app通知等等
*
*/
package cn.iocoder.dashboard.modules.msg;

View File

@@ -0,0 +1,34 @@
package cn.iocoder.dashboard.modules.msg.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 java.util.List;
/**
* 短信渠道Service接口
*
* @author zzf
* @date 2021/1/25 9:24
*/
public interface SmsChannelService {
PageResult<SmsChannelDO> pageChannels(SmsChannelPageReqVO reqVO);
Long createChannel(SmsChannelCreateReqVO reqVO);
List<SmsChannelEnumRespVO> getChannelEnums();
/**
* 查询渠道(包含名下模块)信息集合
*
* @return 渠道(包含名下模块)信息集合
*/
List<SmsChannelAllVO> listChannelAllEnabledInfo();
boolean flushChannel();
}

View File

@@ -0,0 +1,10 @@
package cn.iocoder.dashboard.modules.msg.service.sms;
/**
* 短信渠道Service接口
*
* @author zzf
* @date 2021/1/25 9:24
*/
public interface SmsLogService {
}

View File

@@ -0,0 +1,10 @@
package cn.iocoder.dashboard.modules.msg.service.sms;
/**
* 短信渠道Service接口
*
* @author zzf
* @date 2021/1/25 9:24
*/
public interface SmsTemplateService {
}

View File

@@ -0,0 +1,88 @@
package cn.iocoder.dashboard.modules.msg.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 org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 短信渠道Service实现类
*
* @author zzf
* @date 2021/1/25 9:25
*/
@Service
public class SmsChannelServiceImpl implements SmsChannelService {
@Resource
private SmsChannelMapper mapper;
@Resource
private SmsTemplateMapper templateMapper;
@Override
public PageResult<SmsChannelDO> pageChannels(SmsChannelPageReqVO reqVO) {
return SmsChannelConvert.INSTANCE.convertPage(mapper.selectChannelPage(reqVO));
}
@Override
public Long createChannel(SmsChannelCreateReqVO reqVO) {
SmsChannelDO channelDO = SmsChannelConvert.INSTANCE.convert(reqVO);
mapper.insert(channelDO);
return channelDO.getId();
}
@Override
public List<SmsChannelEnumRespVO> getChannelEnums() {
return SmsChannelConvert.INSTANCE.convertEnum(Arrays.asList(SmsChannelEnum.values()));
}
@Override
public List<SmsChannelAllVO> listChannelAllEnabledInfo() {
List<SmsChannelDO> channelDOList = mapper.selectEnabledList();
if (ObjectUtil.isNull(channelDOList)) {
return null;
}
List<SmsChannelAllVO> channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList);
channelAllVOList.forEach(smsChannelDO -> {
List<SmsTemplateDO> templateDOList = templateMapper.selectListByChannelId(smsChannelDO.getId());
if (ObjectUtil.isNull(templateDOList)) {
templateDOList = new ArrayList<>();
}
smsChannelDO.setTemplateList(SmsTemplateConvert.INSTANCE.convert(templateDOList));
});
return channelAllVOList;
}
@Override
public boolean flushChannel() {
AbstractSmsSenderFactory smsSenderFactory = SpringUtil.getBean(AbstractSmsSenderFactory.class);
if (smsSenderFactory == null) {
return false;
}
smsSenderFactory.flush(listChannelAllEnabledInfo());
return true;
}
}

View File

@@ -0,0 +1,15 @@
package cn.iocoder.dashboard.modules.msg.service.sms.impl;
import cn.iocoder.dashboard.modules.msg.service.sms.SmsLogService;
import org.springframework.stereotype.Service;
/**
* 短信日志Service实现类
*
* @author zzf
* @date 2021/1/25 9:25
*/
@Service
public class SmsLogServiceImpl implements SmsLogService {
}

View File

@@ -0,0 +1,14 @@
package cn.iocoder.dashboard.modules.msg.service.sms.impl;
import cn.iocoder.dashboard.modules.msg.service.sms.SmsTemplateService;
import org.springframework.stereotype.Service;
/**
* 短信模板Service实现类
*
* @author zzf
* @date 2021/1/25 9:25
*/
@Service
public class SmsTemplateServiceImpl implements SmsTemplateService {
}

View File

@@ -75,4 +75,11 @@ public interface SysErrorCodeConstants {
// ========== 文件 1002009000 ==========
ErrorCode FILE_PATH_EXISTS = new ErrorCode(1002009001, "文件路径已经存在");
// ========== 消息 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值一致。");
}