Commit 58d368cfdc7ce56b94be67d4cb2d88c0be11056b

Authored by YunaiV
1 parent cb1f9a58

初始化短信模板的基础后端代码

Showing 17 changed files with 717 additions and 65 deletions
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsTemplateController.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.sms;  
2 -  
3 -import io.swagger.annotations.Api;  
4 -import org.springframework.web.bind.annotation.RequestMapping;  
5 -import org.springframework.web.bind.annotation.RestController;  
6 -  
7 -@Api("认证 API")  
8 -@RestController  
9 -@RequestMapping("/sms/template")  
10 -public class SmsTemplateController {  
11 -  
12 -  
13 -  
14 -}  
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsChannelController.java
@@ -23,7 +23,7 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @@ -23,7 +23,7 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
23 @Api(tags = "短信渠道") 23 @Api(tags = "短信渠道")
24 @RestController 24 @RestController
25 @RequestMapping("system/sms-channel") 25 @RequestMapping("system/sms-channel")
26 -public class SmsChannelController { 26 +public class SysSmsChannelController {
27 27
28 @Resource 28 @Resource
29 private SysSmsChannelService smsChannelService; 29 private SysSmsChannelService smsChannelService;
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsTemplateController.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.*;
  8 +import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsTemplateConvert;
  9 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  10 +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService;
  11 +import io.swagger.annotations.Api;
  12 +import io.swagger.annotations.ApiImplicitParam;
  13 +import io.swagger.annotations.ApiOperation;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
  15 +import org.springframework.web.bind.annotation.*;
  16 +
  17 +import javax.annotation.Resource;
  18 +import javax.servlet.http.HttpServletResponse;
  19 +import javax.validation.Valid;
  20 +import java.io.IOException;
  21 +import java.util.List;
  22 +
  23 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  24 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
  25 +
  26 +@Api("短信模板")
  27 +@RestController
  28 +@RequestMapping("/system/sms-template")
  29 +public class SysSmsTemplateController {
  30 +
  31 + @Resource
  32 + private SysSmsTemplateService smsTemplateService;
  33 +
  34 + @PostMapping("/create")
  35 + @ApiOperation("创建短信模板")
  36 + @PreAuthorize("@ss.hasPermission('system:sms-template:create')")
  37 + public CommonResult<Long> createSmsTemplate(@Valid @RequestBody SysSmsTemplateCreateReqVO createReqVO) {
  38 + return success(smsTemplateService.createSmsTemplate(createReqVO));
  39 + }
  40 +
  41 + @PutMapping("/update")
  42 + @ApiOperation("更新短信模板")
  43 + @PreAuthorize("@ss.hasPermission('system:sms-template:update')")
  44 + public CommonResult<Boolean> updateSmsTemplate(@Valid @RequestBody SysSmsTemplateUpdateReqVO updateReqVO) {
  45 + smsTemplateService.updateSmsTemplate(updateReqVO);
  46 + return success(true);
  47 + }
  48 +
  49 + @DeleteMapping("/delete")
  50 + @ApiOperation("删除短信模板")
  51 + @ApiImplicitParam(name = "id", value = "编号", required = true)
  52 + @PreAuthorize("@ss.hasPermission('system:sms-template:delete')")
  53 + public CommonResult<Boolean> deleteSmsTemplate(@RequestParam("id") Long id) {
  54 + smsTemplateService.deleteSmsTemplate(id);
  55 + return success(true);
  56 + }
  57 +
  58 + @GetMapping("/get")
  59 + @ApiOperation("获得短信模板")
  60 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  61 + @PreAuthorize("@ss.hasPermission('system:sms-template:query')")
  62 + public CommonResult<SysSmsTemplateRespVO> getSmsTemplate(@RequestParam("id") Long id) {
  63 + SysSmsTemplateDO smsTemplate = smsTemplateService.getSmsTemplate(id);
  64 + return success(SysSmsTemplateConvert.INSTANCE.convert(smsTemplate));
  65 + }
  66 +
  67 + @GetMapping("/page")
  68 + @ApiOperation("获得短信模板分页")
  69 + @PreAuthorize("@ss.hasPermission('system:sms-template:query')")
  70 + public CommonResult<PageResult<SysSmsTemplateRespVO>> getSmsTemplatePage(@Valid SysSmsTemplatePageReqVO pageVO) {
  71 + PageResult<SysSmsTemplateDO> pageResult = smsTemplateService.getSmsTemplatePage(pageVO);
  72 + return success(SysSmsTemplateConvert.INSTANCE.convertPage(pageResult));
  73 + }
  74 +
  75 + @GetMapping("/export-excel")
  76 + @ApiOperation("导出短信模板 Excel")
  77 + @PreAuthorize("@ss.hasPermission('system:sms-template:export')")
  78 + @OperateLog(type = EXPORT)
  79 + public void exportSmsTemplateExcel(@Valid SysSmsTemplateExportReqVO exportReqVO,
  80 + HttpServletResponse response) throws IOException {
  81 + List<SysSmsTemplateDO> list = smsTemplateService.getSmsTemplateList(exportReqVO);
  82 + // 导出 Excel
  83 + List<SysSmsTemplateExcelVO> datas = SysSmsTemplateConvert.INSTANCE.convertList02(list);
  84 + ExcelUtils.write(response, "短信模板.xls", "数据", SysSmsTemplateExcelVO.class, datas);
  85 + }
  86 +
  87 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateBaseVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 +* 短信模板 Base VO,提供给添加、修改、详细的子 VO 使用
  10 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 +*/
  12 +@Data
  13 +public class SysSmsTemplateBaseVO {
  14 +
  15 + @ApiModelProperty(value = "短信签名", required = true, example = "1", notes = "参见 SysSmsTemplateTypeEnum 枚举类")
  16 + @NotNull(message = "短信签名不能为空")
  17 + private Integer type;
  18 +
  19 + @ApiModelProperty(value = "开启状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举类")
  20 + @NotNull(message = "开启状态不能为空")
  21 + private Integer status;
  22 +
  23 + @ApiModelProperty(value = "模板编码", required = true, example = "test_01")
  24 + @NotNull(message = "模板编码不能为空")
  25 + private String code;
  26 +
  27 + @ApiModelProperty(value = "模板名称", required = true, example = "yudao")
  28 + @NotNull(message = "模板名称不能为空")
  29 + private String name;
  30 +
  31 + @ApiModelProperty(value = "模板内容", required = true, example = "你好,{name}。你长的太{like}啦!")
  32 + @NotNull(message = "模板内容不能为空")
  33 + private String content;
  34 +
  35 + @ApiModelProperty(value = "备注", example = "哈哈哈")
  36 + private String remark;
  37 +
  38 + @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "4383920")
  39 + @NotNull(message = "短信 API 的模板编号不能为空")
  40 + private String apiTemplateId;
  41 +
  42 + @ApiModelProperty(value = "短信渠道编号", required = true, example = "10")
  43 + @NotNull(message = "短信渠道编号不能为空")
  44 + private Long channelId;
  45 +
  46 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +@ApiModel("短信模板创建 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class SysSmsTemplateCreateReqVO extends SysSmsTemplateBaseVO {
  13 +
  14 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExcelVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelProperty;
  6 +import lombok.Data;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum.*;
  11 +
  12 +/**
  13 + * 短信模板 Excel VO
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Data
  18 +public class SysSmsTemplateExcelVO {
  19 +
  20 + @ExcelProperty("编号")
  21 + private Long id;
  22 +
  23 + @ExcelProperty(value = "短信签名", converter = DictConvert.class)
  24 + @DictFormat(SYS_SMS_TEMPLATE_TYPE)
  25 + private Integer type;
  26 +
  27 + @ExcelProperty(value = "开启状态", converter = DictConvert.class)
  28 + @DictFormat(SYS_COMMON_STATUS)
  29 + private Integer status;
  30 +
  31 + @ExcelProperty("模板编码")
  32 + private String code;
  33 +
  34 + @ExcelProperty("模板名称")
  35 + private String name;
  36 +
  37 + @ExcelProperty("模板内容")
  38 + private String content;
  39 +
  40 + @ExcelProperty("备注")
  41 + private String remark;
  42 +
  43 + @ExcelProperty("短信 API 的模板编号")
  44 + private String apiTemplateId;
  45 +
  46 + @ExcelProperty("短信渠道编号")
  47 + private Long channelId;
  48 +
  49 + @ExcelProperty(value = "短信渠道编码", converter = DictConvert.class)
  50 + @DictFormat(SYS_SMS_CHANNEL_CODE)
  51 + private String channelCode;
  52 +
  53 + @ExcelProperty("创建时间")
  54 + private Date createTime;
  55 +
  56 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateExportReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import org.springframework.format.annotation.DateTimeFormat;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +@ApiModel(value = "短信模板 Excel 导出 Request VO", description = "参数和 SysSmsTemplatePageReqVO 是一致的")
  13 +@Data
  14 +public class SysSmsTemplateExportReqVO {
  15 +
  16 + @ApiModelProperty(value = "短信签名", example = "1")
  17 + private Integer type;
  18 +
  19 + @ApiModelProperty(value = "开启状态", example = "1")
  20 + private Integer status;
  21 +
  22 + @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配")
  23 + private String code;
  24 +
  25 + @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配")
  26 + private String content;
  27 +
  28 + @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配")
  29 + private String apiTemplateId;
  30 +
  31 + @ApiModelProperty(value = "短信渠道编号", example = "10")
  32 + private Long channelId;
  33 +
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + @ApiModelProperty(value = "开始创建时间")
  36 + private Date beginCreateTime;
  37 +
  38 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  39 + @ApiModelProperty(value = "结束创建时间")
  40 + private Date endCreateTime;
  41 +
  42 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplatePageReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +import org.springframework.format.annotation.DateTimeFormat;
  10 +
  11 +import java.util.Date;
  12 +
  13 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  14 +
  15 +@ApiModel("短信模板分页 Request VO")
  16 +@Data
  17 +@EqualsAndHashCode(callSuper = true)
  18 +@ToString(callSuper = true)
  19 +public class SysSmsTemplatePageReqVO extends PageParam {
  20 +
  21 + @ApiModelProperty(value = "短信签名", example = "1")
  22 + private Integer type;
  23 +
  24 + @ApiModelProperty(value = "开启状态", example = "1")
  25 + private Integer status;
  26 +
  27 + @ApiModelProperty(value = "模板编码", example = "test_01", notes = "模糊匹配")
  28 + private String code;
  29 +
  30 + @ApiModelProperty(value = "模板内容", example = "你好,{name}。你长的太{like}啦!", notes = "模糊匹配")
  31 + private String content;
  32 +
  33 + @ApiModelProperty(value = "短信 API 的模板编号", example = "4383920", notes = "模糊匹配")
  34 + private String apiTemplateId;
  35 +
  36 + @ApiModelProperty(value = "短信渠道编号", example = "10")
  37 + private Long channelId;
  38 +
  39 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  40 + @ApiModelProperty(value = "开始创建时间")
  41 + private Date beginCreateTime;
  42 +
  43 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  44 + @ApiModelProperty(value = "结束创建时间")
  45 + private Date endCreateTime;
  46 +
  47 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +@ApiModel("短信模板 Response VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class SysSmsTemplateRespVO extends SysSmsTemplateBaseVO {
  16 +
  17 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  18 + private Long id;
  19 +
  20 + @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN")
  21 + private String channelCode;
  22 +
  23 + @ApiModelProperty(value = "创建时间", required = true)
  24 + private Date createTime;
  25 +
  26 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/template/SysSmsTemplateUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.template;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@ApiModel("短信模板更新 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class SysSmsTemplateUpdateReqVO extends SysSmsTemplateBaseVO {
  16 +
  17 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  18 + @NotNull(message = "编号不能为空")
  19 + private Long id;
  20 +
  21 +}
src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsTemplateConvert.java deleted
1 -package cn.iocoder.dashboard.modules.system.convert.sms;  
2 -  
3 -import cn.iocoder.dashboard.common.pojo.PageResult;  
4 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsTemplateVO;  
5 -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;  
6 -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;  
7 -import com.baomidou.mybatisplus.core.metadata.IPage;  
8 -import org.mapstruct.Mapper;  
9 -import org.mapstruct.Mapping;  
10 -import org.mapstruct.factory.Mappers;  
11 -  
12 -import java.util.List;  
13 -  
14 -@Mapper  
15 -public interface SmsTemplateConvert {  
16 -  
17 - SmsTemplateConvert INSTANCE = Mappers.getMapper(SmsTemplateConvert.class);  
18 -  
19 - @Mapping(source = "records", target = "list")  
20 - PageResult<SysSmsChannelDO> convertPage(IPage<SysSmsChannelDO> page);  
21 -  
22 - List<SmsTemplateVO> convert(List<SysSmsTemplateDO> bean);  
23 -  
24 - SmsTemplateVO convert(SysSmsTemplateDO bean);  
25 -  
26 -}  
src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsTemplateConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.sms;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExcelVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +@Mapper
  15 +public interface SysSmsTemplateConvert {
  16 +
  17 + SysSmsTemplateConvert INSTANCE = Mappers.getMapper(SysSmsTemplateConvert.class);
  18 +
  19 + SysSmsTemplateDO convert(SysSmsTemplateCreateReqVO bean);
  20 +
  21 + SysSmsTemplateDO convert(SysSmsTemplateUpdateReqVO bean);
  22 +
  23 + SysSmsTemplateRespVO convert(SysSmsTemplateDO bean);
  24 +
  25 + List<SysSmsTemplateRespVO> convertList(List<SysSmsTemplateDO> list);
  26 +
  27 + PageResult<SysSmsTemplateRespVO> convertPage(PageResult<SysSmsTemplateDO> page);
  28 +
  29 + List<SysSmsTemplateExcelVO> convertList02(List<SysSmsTemplateDO> list);
  30 +
  31 +}
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsTemplateMapper.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms; 1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms;
2 -import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
3 import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
4 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; 8 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
5 -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;  
6 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
7 10
8 import java.util.List; 11 import java.util.List;
@@ -14,29 +17,28 @@ public interface SysSmsTemplateMapper extends BaseMapperX&lt;SysSmsTemplateDO&gt; { @@ -14,29 +17,28 @@ public interface SysSmsTemplateMapper extends BaseMapperX&lt;SysSmsTemplateDO&gt; {
14 return selectOne("code", code); 17 return selectOne("code", code);
15 } 18 }
16 19
17 - /**  
18 - * 根据短信渠道id查询短信模板集合  
19 - *  
20 - * @param channelId 渠道id  
21 - * @return 模板集合  
22 - */  
23 - default List<SysSmsTemplateDO> selectListByChannelId(Long channelId) {  
24 - return selectList(new LambdaQueryWrapper<SysSmsTemplateDO>()  
25 - .eq(SysSmsTemplateDO::getChannelId, channelId)  
26 - .eq(SysSmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus())  
27 - .orderByAsc(SysSmsTemplateDO::getId)  
28 - ); 20 + default PageResult<SysSmsTemplateDO> selectPage(SysSmsTemplatePageReqVO reqVO) {
  21 + return selectPage(reqVO, new QueryWrapperX<SysSmsTemplateDO>()
  22 + .eqIfPresent("type", reqVO.getType())
  23 + .eqIfPresent("status", reqVO.getStatus())
  24 + .likeIfPresent("code", reqVO.getCode())
  25 + .likeIfPresent("content", reqVO.getContent())
  26 + .likeIfPresent("api_template_id", reqVO.getApiTemplateId())
  27 + .eqIfPresent("channel_id", reqVO.getChannelId())
  28 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  29 + .orderByDesc("id"));
29 } 30 }
30 31
31 - /**  
32 - * 查询有效短信模板集合  
33 - *  
34 - * @return 有效短信模板集合  
35 - */  
36 - default List<SysSmsTemplateDO> selectEnabledList() {  
37 - return selectList(new LambdaQueryWrapper<SysSmsTemplateDO>()  
38 - .eq(SysSmsTemplateDO::getStatus, CommonStatusEnum.ENABLE.getStatus())  
39 - .orderByAsc(SysSmsTemplateDO::getId)  
40 - ); 32 + default List<SysSmsTemplateDO> selectList(SysSmsTemplateExportReqVO reqVO) {
  33 + return selectList(new QueryWrapperX<SysSmsTemplateDO>()
  34 + .eqIfPresent("type", reqVO.getType())
  35 + .eqIfPresent("status", reqVO.getStatus())
  36 + .likeIfPresent("code", reqVO.getCode())
  37 + .likeIfPresent("content", reqVO.getContent())
  38 + .likeIfPresent("api_template_id", reqVO.getApiTemplateId())
  39 + .eqIfPresent("channel_id", reqVO.getChannelId())
  40 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  41 + .orderByDesc("id"));
41 } 42 }
  43 +
42 } 44 }
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java
@@ -19,6 +19,7 @@ public enum SysDictTypeEnum { @@ -19,6 +19,7 @@ public enum SysDictTypeEnum {
19 SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型 19 SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型
20 SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型 20 SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型
21 SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码 21 SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码
  22 + SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型
22 23
23 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型 24 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
24 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举 25 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateService.java
1 package cn.iocoder.dashboard.modules.system.service.sms; 1 package cn.iocoder.dashboard.modules.system.service.sms;
2 2
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
3 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; 8 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
4 9
  10 +import javax.validation.Valid;
  11 +import java.util.Collection;
  12 +import java.util.List;
5 import java.util.Map; 13 import java.util.Map;
6 14
7 /** 15 /**
@@ -29,4 +37,58 @@ public interface SysSmsTemplateService { @@ -29,4 +37,58 @@ public interface SysSmsTemplateService {
29 */ 37 */
30 String formatSmsTemplateContent(String content, Map<String, Object> params); 38 String formatSmsTemplateContent(String content, Map<String, Object> params);
31 39
  40 + /**
  41 + * 创建短信模板
  42 + *
  43 + * @param createReqVO 创建信息
  44 + * @return 编号
  45 + */
  46 + Long createSmsTemplate(@Valid SysSmsTemplateCreateReqVO createReqVO);
  47 +
  48 + /**
  49 + * 更新短信模板
  50 + *
  51 + * @param updateReqVO 更新信息
  52 + */
  53 + void updateSmsTemplate(@Valid SysSmsTemplateUpdateReqVO updateReqVO);
  54 +
  55 + /**
  56 + * 删除短信模板
  57 + *
  58 + * @param id 编号
  59 + */
  60 + void deleteSmsTemplate(Long id);
  61 +
  62 + /**
  63 + * 获得短信模板
  64 + *
  65 + * @param id 编号
  66 + * @return 短信模板
  67 + */
  68 + SysSmsTemplateDO getSmsTemplate(Long id);
  69 +
  70 + /**
  71 + * 获得短信模板列表
  72 + *
  73 + * @param ids 编号
  74 + * @return 短信模板列表
  75 + */
  76 + List<SysSmsTemplateDO> getSmsTemplateList(Collection<Long> ids);
  77 +
  78 + /**
  79 + * 获得短信模板分页
  80 + *
  81 + * @param pageReqVO 分页查询
  82 + * @return 短信模板分页
  83 + */
  84 + PageResult<SysSmsTemplateDO> getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO);
  85 +
  86 + /**
  87 + * 获得短信模板列表, 用于 Excel 导出
  88 + *
  89 + * @param exportReqVO 查询条件
  90 + * @return 短信模板分页
  91 + */
  92 + List<SysSmsTemplateDO> getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO);
  93 +
32 } 94 }
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsTemplateServiceImpl.java
1 package cn.iocoder.dashboard.modules.system.service.sms.impl; 1 package cn.iocoder.dashboard.modules.system.service.sms.impl;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsTemplateConvert;
4 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
5 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; 11 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
6 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; 12 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService;
7 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
8 14
9 import javax.annotation.Resource; 15 import javax.annotation.Resource;
  16 +import java.util.Collection;
  17 +import java.util.List;
10 import java.util.Map; 18 import java.util.Map;
11 19
  20 +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
  21 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_TEMPLATE_NOT_EXISTS;
  22 +
12 /** 23 /**
13 * 短信模板Service实现类 24 * 短信模板Service实现类
14 * 25 *
@@ -31,4 +42,56 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { @@ -31,4 +42,56 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService {
31 return StrUtil.format(content, params); 42 return StrUtil.format(content, params);
32 } 43 }
33 44
  45 + @Override
  46 + public Long createSmsTemplate(SysSmsTemplateCreateReqVO createReqVO) {
  47 + // 插入
  48 + SysSmsTemplateDO smsTemplate = SysSmsTemplateConvert.INSTANCE.convert(createReqVO);
  49 + smsTemplateMapper.insert(smsTemplate);
  50 + // 返回
  51 + return smsTemplate.getId();
  52 + }
  53 +
  54 + @Override
  55 + public void updateSmsTemplate(SysSmsTemplateUpdateReqVO updateReqVO) {
  56 + // 校验存在
  57 + this.validateSmsTemplateExists(updateReqVO.getId());
  58 + // 更新
  59 + SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO);
  60 + smsTemplateMapper.updateById(updateObj);
  61 + }
  62 +
  63 + @Override
  64 + public void deleteSmsTemplate(Long id) {
  65 + // 校验存在
  66 + this.validateSmsTemplateExists(id);
  67 + // 更新
  68 + smsTemplateMapper.deleteById(id);
  69 + }
  70 +
  71 + private void validateSmsTemplateExists(Long id) {
  72 + if (smsTemplateMapper.selectById(id) == null) {
  73 + throw exception(SMS_TEMPLATE_NOT_EXISTS);
  74 + }
  75 + }
  76 +
  77 + @Override
  78 + public SysSmsTemplateDO getSmsTemplate(Long id) {
  79 + return smsTemplateMapper.selectById(id);
  80 + }
  81 +
  82 + @Override
  83 + public List<SysSmsTemplateDO> getSmsTemplateList(Collection<Long> ids) {
  84 + return smsTemplateMapper.selectBatchIds(ids);
  85 + }
  86 +
  87 + @Override
  88 + public PageResult<SysSmsTemplateDO> getSmsTemplatePage(SysSmsTemplatePageReqVO pageReqVO) {
  89 + return smsTemplateMapper.selectPage(pageReqVO);
  90 + }
  91 +
  92 + @Override
  93 + public List<SysSmsTemplateDO> getSmsTemplateList(SysSmsTemplateExportReqVO exportReqVO) {
  94 + return smsTemplateMapper.selectList(exportReqVO);
  95 + }
  96 +
34 } 97 }
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.sms;
  2 +
  3 +import cn.iocoder.dashboard.BaseDbUnitTest;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO;
  10 +import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper;
  11 +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsTemplateServiceImpl;
  12 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  13 +import org.junit.jupiter.api.Test;
  14 +import org.springframework.context.annotation.Import;
  15 +
  16 +import javax.annotation.Resource;
  17 +import java.util.List;
  18 +
  19 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_TEMPLATE_NOT_EXISTS;
  20 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  21 +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
  22 +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
  23 +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
  24 +import static org.junit.jupiter.api.Assertions.*;
  25 +
  26 +/**
  27 +* {@link SysSmsTemplateServiceImpl} 的单元测试类
  28 +*
  29 +* @author 芋道源码
  30 +*/
  31 +@Import(SysSmsTemplateServiceImpl.class)
  32 +public class SysSmsTemplateServiceTest extends BaseDbUnitTest {
  33 +
  34 + @Resource
  35 + private SysSmsTemplateServiceImpl smsTemplateService;
  36 +
  37 + @Resource
  38 + private SysSmsTemplateMapper smsTemplateMapper;
  39 +
  40 + @Test
  41 + public void testCreateSmsTemplate_success() {
  42 + // 准备参数
  43 + SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class);
  44 +
  45 + // 调用
  46 + Long smsTemplateId = smsTemplateService.createSmsTemplate(reqVO);
  47 + // 断言
  48 + assertNotNull(smsTemplateId);
  49 + // 校验记录的属性是否正确
  50 + SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(smsTemplateId);
  51 + assertPojoEquals(reqVO, smsTemplate);
  52 + }
  53 +
  54 + @Test
  55 + public void testUpdateSmsTemplate_success() {
  56 + // mock 数据
  57 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class);
  58 + smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据
  59 + // 准备参数
  60 + SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class, o -> {
  61 + o.setId(dbSmsTemplate.getId()); // 设置更新的 ID
  62 + });
  63 +
  64 + // 调用
  65 + smsTemplateService.updateSmsTemplate(reqVO);
  66 + // 校验是否更新正确
  67 + SysSmsTemplateDO smsTemplate = smsTemplateMapper.selectById(reqVO.getId()); // 获取最新的
  68 + assertPojoEquals(reqVO, smsTemplate);
  69 + }
  70 +
  71 + @Test
  72 + public void testUpdateSmsTemplate_notExists() {
  73 + // 准备参数
  74 + SysSmsTemplateUpdateReqVO reqVO = randomPojo(SysSmsTemplateUpdateReqVO.class);
  75 +
  76 + // 调用, 并断言异常
  77 + assertServiceException(() -> smsTemplateService.updateSmsTemplate(reqVO), SMS_TEMPLATE_NOT_EXISTS);
  78 + }
  79 +
  80 + @Test
  81 + public void testDeleteSmsTemplate_success() {
  82 + // mock 数据
  83 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class);
  84 + smsTemplateMapper.insert(dbSmsTemplate);// @Sql: 先插入出一条存在的数据
  85 + // 准备参数
  86 + Long id = dbSmsTemplate.getId();
  87 +
  88 + // 调用
  89 + smsTemplateService.deleteSmsTemplate(id);
  90 + // 校验数据不存在了
  91 + assertNull(smsTemplateMapper.selectById(id));
  92 + }
  93 +
  94 + @Test
  95 + public void testDeleteSmsTemplate_notExists() {
  96 + // 准备参数
  97 + Long id = randomLongId();
  98 +
  99 + // 调用, 并断言异常
  100 + assertServiceException(() -> smsTemplateService.deleteSmsTemplate(id), SMS_TEMPLATE_NOT_EXISTS);
  101 + }
  102 +
  103 + @Test // TODO 请修改 null 为需要的值
  104 + public void testGetSmsTemplatePage() {
  105 + // mock 数据
  106 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到
  107 + o.setType(null);
  108 + o.setStatus(null);
  109 + o.setCode(null);
  110 + o.setContent(null);
  111 + o.setApiTemplateId(null);
  112 + o.setChannelId(null);
  113 + o.setCreateTime(null);
  114 + });
  115 + smsTemplateMapper.insert(dbSmsTemplate);
  116 + // 测试 type 不匹配
  117 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(null)));
  118 + // 测试 status 不匹配
  119 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(null)));
  120 + // 测试 code 不匹配
  121 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode(null)));
  122 + // 测试 content 不匹配
  123 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent(null)));
  124 + // 测试 apiTemplateId 不匹配
  125 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId(null)));
  126 + // 测试 channelId 不匹配
  127 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(null)));
  128 + // 测试 createTime 不匹配
  129 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(null)));
  130 + // 准备参数
  131 + SysSmsTemplatePageReqVO reqVO = new SysSmsTemplatePageReqVO();
  132 + reqVO.setType(null);
  133 + reqVO.setStatus(null);
  134 + reqVO.setCode(null);
  135 + reqVO.setContent(null);
  136 + reqVO.setApiTemplateId(null);
  137 + reqVO.setChannelId(null);
  138 + reqVO.setBeginCreateTime(null);
  139 + reqVO.setEndCreateTime(null);
  140 +
  141 + // 调用
  142 + PageResult<SysSmsTemplateDO> pageResult = smsTemplateService.getSmsTemplatePage(reqVO);
  143 + // 断言
  144 + assertEquals(1, pageResult.getTotal());
  145 + assertEquals(1, pageResult.getList().size());
  146 + assertPojoEquals(dbSmsTemplate, pageResult.getList().get(0));
  147 + }
  148 +
  149 + @Test // TODO 请修改 null 为需要的值
  150 + public void testGetSmsTemplateList() {
  151 + // mock 数据
  152 + SysSmsTemplateDO dbSmsTemplate = randomPojo(SysSmsTemplateDO.class, o -> { // 等会查询到
  153 + o.setType(null);
  154 + o.setStatus(null);
  155 + o.setCode(null);
  156 + o.setContent(null);
  157 + o.setApiTemplateId(null);
  158 + o.setChannelId(null);
  159 + o.setCreateTime(null);
  160 + });
  161 + smsTemplateMapper.insert(dbSmsTemplate);
  162 + // 测试 type 不匹配
  163 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setType(null)));
  164 + // 测试 status 不匹配
  165 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setStatus(null)));
  166 + // 测试 code 不匹配
  167 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCode(null)));
  168 + // 测试 content 不匹配
  169 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setContent(null)));
  170 + // 测试 apiTemplateId 不匹配
  171 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setApiTemplateId(null)));
  172 + // 测试 channelId 不匹配
  173 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setChannelId(null)));
  174 + // 测试 createTime 不匹配
  175 + smsTemplateMapper.insert(ObjectUtils.clone(dbSmsTemplate, o -> o.setCreateTime(null)));
  176 + // 准备参数
  177 + SysSmsTemplateExportReqVO reqVO = new SysSmsTemplateExportReqVO();
  178 + reqVO.setType(null);
  179 + reqVO.setStatus(null);
  180 + reqVO.setCode(null);
  181 + reqVO.setContent(null);
  182 + reqVO.setApiTemplateId(null);
  183 + reqVO.setChannelId(null);
  184 + reqVO.setBeginCreateTime(null);
  185 + reqVO.setEndCreateTime(null);
  186 +
  187 + // 调用
  188 + List<SysSmsTemplateDO> list = smsTemplateService.getSmsTemplateList(reqVO);
  189 + // 断言
  190 + assertEquals(1, list.size());
  191 + assertPojoEquals(dbSmsTemplate, list.get(0));
  192 + }
  193 +
  194 +}