Commit d8d458a0249f2138be8c5eb13e8086202399a7be

Authored by YunaiV
1 parent 86cbf21d

短信渠道的 CRUD 后端代码的完成

Showing 22 changed files with 520 additions and 270 deletions
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsCallbackController.java
1 package cn.iocoder.dashboard.modules.system.controller.sms; 1 package cn.iocoder.dashboard.modules.system.controller.sms;
2 2
3 import cn.hutool.core.util.URLUtil; 3 import cn.hutool.core.util.URLUtil;
  4 +import cn.hutool.extra.servlet.ServletUtil;
  5 +import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; 6 import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
5 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum; 7 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
6 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService; 8 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService;
@@ -13,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestParam; @@ -13,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestParam;
13 import org.springframework.web.bind.annotation.RestController; 15 import org.springframework.web.bind.annotation.RestController;
14 16
15 import javax.annotation.Resource; 17 import javax.annotation.Resource;
  18 +import javax.servlet.http.HttpServletRequest;
  19 +
  20 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
16 21
17 @Api(tags = "短信回调") 22 @Api(tags = "短信回调")
18 @RestController 23 @RestController
@@ -32,4 +37,13 @@ public class SmsCallbackController { @@ -32,4 +37,13 @@ public class SmsCallbackController {
32 return "SUCCESS"; // 约定返回 SUCCESS 为成功 37 return "SUCCESS"; // 约定返回 SUCCESS 为成功
33 } 38 }
34 39
  40 + @PostMapping("/sms/aliyun")
  41 + @ApiOperation(value = "阿里云短信的回调", notes = "参见 https://help.aliyun.com/document_detail/120998.html 文档")
  42 + @OperateLog(enable = false)
  43 + public CommonResult<Boolean> receiveAliyunSmsStatus(HttpServletRequest request) throws Throwable {
  44 + String text = ServletUtil.getBody(request);
  45 + smsService.receiveSmsStatus(SmsChannelEnum.ALIYUN.getCode(), text);
  46 + return success(true);
  47 + }
  48 +
35 } 49 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SmsChannelController.java
@@ -2,37 +2,71 @@ package cn.iocoder.dashboard.modules.system.controller.sms; @@ -2,37 +2,71 @@ package cn.iocoder.dashboard.modules.system.controller.sms;
2 2
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;  
6 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; 5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsChannelConvert;
7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; 11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
9 import io.swagger.annotations.Api; 12 import io.swagger.annotations.Api;
  13 +import io.swagger.annotations.ApiImplicitParam;
10 import io.swagger.annotations.ApiOperation; 14 import io.swagger.annotations.ApiOperation;
11 -import org.springframework.validation.annotation.Validated; 15 +import org.springframework.security.access.prepost.PreAuthorize;
12 import org.springframework.web.bind.annotation.*; 16 import org.springframework.web.bind.annotation.*;
13 17
14 import javax.annotation.Resource; 18 import javax.annotation.Resource;
  19 +import javax.validation.Valid;
15 20
16 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
17 22
18 -@Api("短信 渠道/签名 API") 23 +@Api(tags = "短信渠道")
19 @RestController 24 @RestController
20 @RequestMapping("/sms/channel") 25 @RequestMapping("/sms/channel")
21 public class SmsChannelController { 26 public class SmsChannelController {
22 27
23 @Resource 28 @Resource
24 - private SysSmsChannelService service; 29 + private SysSmsChannelService smsChannelService;
25 30
26 - @ApiOperation("获取渠道/签名分页")  
27 - @GetMapping("/page")  
28 - public CommonResult<PageResult<SysSmsChannelDO>> getPermissionInfo(@Validated SmsChannelPageReqVO reqVO) {  
29 - return success(service.pageSmsChannels(reqVO)); 31 + @PostMapping("/create")
  32 + @ApiOperation("创建短信渠道")
  33 + @PreAuthorize("@ss.hasPermission('system:sms-channel:create')")
  34 + public CommonResult<Long> createSmsChannel(@Valid @RequestBody SysSmsChannelCreateReqVO createReqVO) {
  35 + return success(smsChannelService.createSmsChannel(createReqVO));
30 } 36 }
31 37
32 - @ApiOperation("添加消息渠道")  
33 - @PostMapping("/create")  
34 - public CommonResult<Long> add(@Validated @RequestBody SmsChannelCreateReqVO reqVO) {  
35 - return success(service.createSmsChannel(reqVO)); 38 + @PutMapping("/update")
  39 + @ApiOperation("更新短信渠道")
  40 + @PreAuthorize("@ss.hasPermission('system:sms-channel:update')")
  41 + public CommonResult<Boolean> updateSmsChannel(@Valid @RequestBody SysSmsChannelUpdateReqVO updateReqVO) {
  42 + smsChannelService.updateSmsChannel(updateReqVO);
  43 + return success(true);
  44 + }
  45 +
  46 + @DeleteMapping("/delete")
  47 + @ApiOperation("删除短信渠道")
  48 + @ApiImplicitParam(name = "id", value = "编号", required = true)
  49 + @PreAuthorize("@ss.hasPermission('system:sms-channel:delete')")
  50 + public CommonResult<Boolean> deleteSmsChannel(@RequestParam("id") Long id) {
  51 + smsChannelService.deleteSmsChannel(id);
  52 + return success(true);
  53 + }
  54 +
  55 + @GetMapping("/get")
  56 + @ApiOperation("获得短信渠道")
  57 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  58 + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')")
  59 + public CommonResult<SysSmsChannelRespVO> getSmsChannel(@RequestParam("id") Long id) {
  60 + SysSmsChannelDO smsChannel = smsChannelService.getSmsChannel(id);
  61 + return success(SysSmsChannelConvert.INSTANCE.convert(smsChannel));
  62 + }
  63 +
  64 + @GetMapping("/page")
  65 + @ApiOperation("获得短信渠道分页")
  66 + @PreAuthorize("@ss.hasPermission('system:sms-channel:query')")
  67 + public CommonResult<PageResult<SysSmsChannelRespVO>> getSmsChannelPage(@Valid SysSmsChannelPageReqVO pageVO) {
  68 + PageResult<SysSmsChannelDO> pageResult = smsChannelService.getSmsChannelPage(pageVO);
  69 + return success(SysSmsChannelConvert.INSTANCE.convertPage(pageResult));
36 } 70 }
37 71
38 } 72 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsChannelAllVO.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.sms.vo;  
2 -  
3 -import lombok.Data;  
4 -import lombok.EqualsAndHashCode;  
5 -  
6 -import java.io.Serializable;  
7 -import java.util.List;  
8 -  
9 -/**  
10 - * 渠道(包含模板)信息VO类  
11 - *  
12 - * @author zzf  
13 - * @date 2021/1/25 17:01  
14 - */  
15 -@Data  
16 -@EqualsAndHashCode  
17 -public class SmsChannelAllVO implements Serializable {  
18 -  
19 - /**  
20 - * id  
21 - */  
22 - private Long id;  
23 -  
24 - /**  
25 - * 编码(来自枚举类 阿里、华为、七牛等)  
26 - */  
27 - private String code;  
28 -  
29 - /**  
30 - * 渠道账号id  
31 - */  
32 - private String apiKey;  
33 -  
34 - /**  
35 - * 渠道账号秘钥  
36 - */  
37 - private String apiSecret;  
38 -  
39 - /**  
40 - * 实际渠道签名唯一标识  
41 - */  
42 - private String apiSignatureId;  
43 -  
44 - /**  
45 - * 签名值  
46 - */  
47 - private String signature;  
48 -  
49 - /**  
50 - * 该渠道名下的短信模板集合  
51 - */  
52 - private List<SmsTemplateVO> templateList;  
53 -  
54 - public SmsTemplateVO getTemplateByTemplateCode(String tempCode) {  
55 - return templateList.stream().filter(s -> s.getCode().equals(tempCode)).findFirst().get();  
56 - }  
57 -  
58 -}  
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelBaseVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel;
  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 SysSmsChannelBaseVO {
  14 +
  15 + @ApiModelProperty(value = "短信签名", required = true, example = "芋道源码")
  16 + @NotNull(message = "短信签名不能为空")
  17 + private String signature;
  18 +
  19 + @ApiModelProperty(value = "任务状态", required = true, example = "1")
  20 + @NotNull(message = "任务状态不能为空")
  21 + private Integer status;
  22 +
  23 + @ApiModelProperty(value = "备注", example = "好吃!")
  24 + private String remark;
  25 +
  26 + @ApiModelProperty(value = "短信 API 的账号", required = true, example = "yudao")
  27 + @NotNull(message = "短信 API 的账号不能为空")
  28 + private String apiKey;
  29 +
  30 + @ApiModelProperty(value = "短信 API 的秘钥", example = "yuanma")
  31 + private String apiSecret;
  32 +
  33 + @ApiModelProperty(value = "短信发送回调 URL", example = "http://www.iocoder.cn")
  34 + private String callbackUrl;
  35 +
  36 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel;
  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 SysSmsChannelCreateReqVO extends SysSmsChannelBaseVO {
  16 +
  17 + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类")
  18 + @NotNull(message = "渠道编码不能为空")
  19 + private String code;
  20 +
  21 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelPageReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel;
  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 SysSmsChannelPageReqVO extends PageParam {
  20 +
  21 + @ApiModelProperty(value = "任务状态", example = "1")
  22 + private Integer status;
  23 +
  24 + @ApiModelProperty(value = "短信签名", example = "芋道源码", notes = "模糊匹配")
  25 + private String signature;
  26 +
  27 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  28 + @ApiModelProperty(value = "开始创建时间")
  29 + private Date beginCreateTime;
  30 +
  31 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  32 + @ApiModelProperty(value = "结束创建时间")
  33 + private Date endCreateTime;
  34 +
  35 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel;
  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 SysSmsChannelRespVO extends SysSmsChannelBaseVO {
  16 +
  17 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  18 + private Long id;
  19 +
  20 + @ApiModelProperty(value = "渠道编码", required = true, example = "YUN_PIAN", notes = "参见 SmsChannelEnum 枚举类")
  21 + private String code;
  22 +
  23 + @ApiModelProperty(value = "创建时间", required = true)
  24 + private Date createTime;
  25 +
  26 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/channel/SysSmsChannelUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.sms.vo.channel;
  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 SysSmsChannelUpdateReqVO extends SysSmsChannelBaseVO {
  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/controller/sms/vo/req/SmsChannelCreateReqVO.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.sms.vo.req;  
2 -  
3 -import io.swagger.annotations.ApiModel;  
4 -import io.swagger.annotations.ApiModelProperty;  
5 -import lombok.AllArgsConstructor;  
6 -import lombok.Data;  
7 -import lombok.EqualsAndHashCode;  
8 -import lombok.NoArgsConstructor;  
9 -  
10 -import java.io.Serializable;  
11 -  
12 -  
13 -@ApiModel("消息渠道创建 Request VO")  
14 -@Data  
15 -@NoArgsConstructor  
16 -@AllArgsConstructor  
17 -@EqualsAndHashCode  
18 -public class SmsChannelCreateReqVO implements Serializable {  
19 -  
20 - @ApiModelProperty("编码(来自枚举类 阿里、华为、七牛等)")  
21 - private String code;  
22 -  
23 - @ApiModelProperty("渠道账号id")  
24 - private String apiKey;  
25 -  
26 - @ApiModelProperty("渠道账号秘钥")  
27 - private String apiSecret;  
28 -  
29 - @ApiModelProperty("优先级(存在多个签名时,选择值最小的,渠道不可用时,按优先级从小到大切换)")  
30 - private Integer priority;  
31 -  
32 - @ApiModelProperty("名称")  
33 - private String name;  
34 -  
35 - @ApiModelProperty("签名值")  
36 - private String signature;  
37 -  
38 - @ApiModelProperty("备注")  
39 - private String remark;  
40 -  
41 - @ApiModelProperty("启用状态(0正常 1停用)")  
42 - private Integer status;  
43 -  
44 -}  
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/req/SmsChannelPageReqVO.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.sms.vo.req;  
2 -  
3 -import cn.iocoder.dashboard.common.pojo.PageParam;  
4 -import io.swagger.annotations.ApiModel;  
5 -import io.swagger.annotations.ApiModelProperty;  
6 -import lombok.AllArgsConstructor;  
7 -import lombok.Data;  
8 -import lombok.EqualsAndHashCode;  
9 -import lombok.NoArgsConstructor;  
10 -  
11 -@ApiModel("消息渠道分页 Request VO")  
12 -@Data  
13 -@NoArgsConstructor  
14 -@AllArgsConstructor  
15 -@EqualsAndHashCode(callSuper = true)  
16 -public class SmsChannelPageReqVO extends PageParam {  
17 -  
18 - @ApiModelProperty(value = "签名值", example = "源码", notes = "模糊匹配")  
19 - private String signature;  
20 -  
21 -}  
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/resp/SmsChannelPageRespVO.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.sms.vo.resp;  
2 -  
3 -import cn.iocoder.dashboard.common.pojo.PageParam;  
4 -import io.swagger.annotations.ApiModel;  
5 -import io.swagger.annotations.ApiModelProperty;  
6 -import lombok.AllArgsConstructor;  
7 -import lombok.Data;  
8 -import lombok.EqualsAndHashCode;  
9 -import lombok.NoArgsConstructor;  
10 -import org.springframework.format.annotation.DateTimeFormat;  
11 -  
12 -import java.util.Date;  
13 -  
14 -import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;  
15 -  
16 -@ApiModel("用户分页 Request VO")  
17 -@Data  
18 -@NoArgsConstructor  
19 -@AllArgsConstructor  
20 -@EqualsAndHashCode(callSuper = true)  
21 -public class SmsChannelPageRespVO extends PageParam {  
22 -  
23 - @ApiModelProperty(value = "用户账号", example = "yudao", notes = "模糊匹配")  
24 - private String username;  
25 -  
26 - @ApiModelProperty(value = "手机号码", example = "yudao", notes = "模糊匹配")  
27 - private String mobile;  
28 -  
29 - @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类")  
30 - private Integer status;  
31 -  
32 - @ApiModelProperty(value = "开始时间", example = "2020-10-24")  
33 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
34 - private Date beginTime;  
35 -  
36 - @ApiModelProperty(value = "结束时间", example = "2020-10-24")  
37 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)  
38 - private Date endTime;  
39 -  
40 - @ApiModelProperty(value = "部门编号", example = "1024", notes = "同时筛选子部门")  
41 - private Long deptId;  
42 -  
43 -}  
src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SmsChannelConvert.java deleted
1 -package cn.iocoder.dashboard.modules.system.convert.sms;  
2 -  
3 -import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;  
4 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.SmsChannelAllVO;  
5 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;  
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;  
7 -import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;  
8 -import org.mapstruct.Mapper;  
9 -import org.mapstruct.factory.Mappers;  
10 -  
11 -import java.util.List;  
12 -  
13 -@Mapper  
14 -public interface SmsChannelConvert {  
15 -  
16 - SmsChannelConvert INSTANCE = Mappers.getMapper(SmsChannelConvert.class);  
17 -  
18 - SysSmsChannelDO convert(SmsChannelCreateReqVO bean);  
19 -  
20 - SysSmsChannelDO convert(SysUserUpdateReqVO bean);  
21 -  
22 - List<SmsChannelAllVO> convert(List<SysSmsChannelDO> bean);  
23 -  
24 - List<SmsChannelProperties> convertProperty(List<SmsChannelAllVO> list);  
25 -  
26 - List<SmsChannelProperties> convertList(List<SysSmsChannelDO> list);  
27 -  
28 -}  
src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsChannelConvert.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.framework.sms.core.property.SmsChannelProperties;
  5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 短信渠道 Convert
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +@Mapper
  20 +public interface SysSmsChannelConvert {
  21 +
  22 + SysSmsChannelConvert INSTANCE = Mappers.getMapper(SysSmsChannelConvert.class);
  23 +
  24 + SysSmsChannelDO convert(SysSmsChannelCreateReqVO bean);
  25 +
  26 + SysSmsChannelDO convert(SysSmsChannelUpdateReqVO bean);
  27 +
  28 + SysSmsChannelRespVO convert(SysSmsChannelDO bean);
  29 +
  30 + List<SysSmsChannelRespVO> convertList(List<SysSmsChannelDO> list);
  31 +
  32 + PageResult<SysSmsChannelRespVO> convertPage(PageResult<SysSmsChannelDO> page);
  33 +
  34 + List<SmsChannelProperties> convertList02(List<SysSmsChannelDO> list);
  35 +
  36 +}
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsChannelMapper.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms; 1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms;
2 2
3 -import cn.hutool.core.util.StrUtil;  
4 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
6 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; 5 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
9 import org.apache.ibatis.annotations.Mapper; 9 import org.apache.ibatis.annotations.Mapper;
@@ -13,14 +13,16 @@ import java.util.List; @@ -13,14 +13,16 @@ import java.util.List;
13 @Mapper 13 @Mapper
14 public interface SysSmsChannelMapper extends BaseMapperX<SysSmsChannelDO> { 14 public interface SysSmsChannelMapper extends BaseMapperX<SysSmsChannelDO> {
15 15
16 - default PageResult<SysSmsChannelDO> selectChannelPage(SmsChannelPageReqVO reqVO) {  
17 - return selectPage(reqVO, new LambdaQueryWrapper<SysSmsChannelDO>()  
18 - .like(StrUtil.isNotBlank(reqVO.getSignature()), SysSmsChannelDO::getSignature, reqVO.getSignature())); 16 + default PageResult<SysSmsChannelDO> selectPage(SysSmsChannelPageReqVO reqVO) {
  17 + return selectPage(reqVO, new QueryWrapperX<SysSmsChannelDO>()
  18 + .likeIfPresent("signature", reqVO.getSignature())
  19 + .eqIfPresent("status", reqVO.getStatus())
  20 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  21 + .orderByDesc("id"));
19 } 22 }
20 23
21 default List<SysSmsChannelDO> selectListByStatus(Integer status) { 24 default List<SysSmsChannelDO> selectListByStatus(Integer status) {
22 - return selectList(new LambdaQueryWrapper<SysSmsChannelDO>()  
23 - .eq(SysSmsChannelDO::getStatus, status) 25 + return selectList(new LambdaQueryWrapper<SysSmsChannelDO>().eq(SysSmsChannelDO::getStatus, status)
24 .orderByAsc(SysSmsChannelDO::getId)); 26 .orderByAsc(SysSmsChannelDO::getId));
25 } 27 }
26 28
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
@@ -78,19 +78,15 @@ public interface SysErrorCodeConstants { @@ -78,19 +78,15 @@ public interface SysErrorCodeConstants {
78 ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败"); 78 ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败");
79 ErrorCode FILE_IS_EMPTY= new ErrorCode(1002009003, "文件为空"); 79 ErrorCode FILE_IS_EMPTY= new ErrorCode(1002009003, "文件为空");
80 80
  81 + // ========== 短信渠道 1002011000 ==========
  82 + ErrorCode SMS_CHANNEL_NOT_EXISTS = new ErrorCode(1002011000, "短信渠道不存在");
81 83
82 - // ========== 短信模板 1002010000 ==========  
83 - ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002010000, "短信模板不存在"); 84 + // ========== 短信模板 1002011000 ==========
  85 + ErrorCode SMS_TEMPLATE_NOT_EXISTS = new ErrorCode(1002011000, "短信模板不存在");
84 86
85 - // ========== 短信发送 1002011000 ==========  
86 - ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002011000, "手机号不存在");  
87 - ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002011001, "模板参数({})缺失"); 87 + // ========== 短信发送 1002012000 ==========
  88 + ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在");
  89 + ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失");
88 90
89 - ErrorCode SMS_CHANNEL_NOT_INIT = new ErrorCode(1003001001,  
90 - "短信渠道没有初始化, 请调用SmsClientWrapper#initSmsClient()或SmsClientWrapper#addSmsClient");  
91 - ErrorCode SMS_CHANNEL_NOT_FOUND = new ErrorCode(1003001002, "没有短信渠道信息, 请初始化sms_channel表数据。");  
92 - ErrorCode SMS_SENDER_NOT_FOUND = new ErrorCode(1003001004, "没有找到对应的短信发送对象,请检查sms_channel表和sms_template表数据");  
93 - ErrorCode INVALID_CHANNEL_CODE = new ErrorCode(1003001005, "非法的短信渠道code,请检查sms_channel表的code值是否与SmsChannelEnum中的code值一致。");  
94 - ErrorCode PARAM_VALUE_IS_NULL = new ErrorCode(1003001006, "参数【{}】不能为空");  
95 91
96 } 92 }
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java
@@ -18,6 +18,7 @@ public enum SysDictTypeEnum { @@ -18,6 +18,7 @@ public enum SysDictTypeEnum {
18 SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果 18 SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果
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 22
22 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型 23 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
23 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举 24 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.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; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;  
5 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO; 4 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
6 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
7 8
  9 +import javax.validation.Valid;
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +
8 /** 13 /**
9 * 短信渠道Service接口 14 * 短信渠道Service接口
10 * 15 *
@@ -19,19 +24,49 @@ public interface SysSmsChannelService { @@ -19,19 +24,49 @@ public interface SysSmsChannelService {
19 void initSmsClients(); 24 void initSmsClients();
20 25
21 /** 26 /**
22 - * 分页查询短信渠道信息 27 + * 创建短信渠道
  28 + *
  29 + * @param createReqVO 创建信息
  30 + * @return 编号
  31 + */
  32 + Long createSmsChannel(@Valid SysSmsChannelCreateReqVO createReqVO);
  33 +
  34 + /**
  35 + * 更新短信渠道
  36 + *
  37 + * @param updateReqVO 更新信息
  38 + */
  39 + void updateSmsChannel(@Valid SysSmsChannelUpdateReqVO updateReqVO);
  40 +
  41 + /**
  42 + * 删除短信渠道
  43 + *
  44 + * @param id 编号
  45 + */
  46 + void deleteSmsChannel(Long id);
  47 +
  48 + /**
  49 + * 获得短信渠道
  50 + *
  51 + * @param id 编号
  52 + * @return 短信渠道
  53 + */
  54 + SysSmsChannelDO getSmsChannel(Long id);
  55 +
  56 + /**
  57 + * 获得短信渠道列表
23 * 58 *
24 - * @param reqVO 参数对象  
25 - * @return 短信渠道分页对象 59 + * @param ids 编号
  60 + * @return 短信渠道列表
26 */ 61 */
27 - PageResult<SysSmsChannelDO> pageSmsChannels(SmsChannelPageReqVO reqVO); 62 + List<SysSmsChannelDO> getSmsChannelList(Collection<Long> ids);
28 63
29 /** 64 /**
30 - * 创建新的渠道信息 65 + * 获得短信渠道分页
31 * 66 *
32 - * @param reqVO 参数对象  
33 - * @return 渠道id 67 + * @param pageReqVO 分页查询
  68 + * @return 短信渠道分页
34 */ 69 */
35 - Long createSmsChannel(SmsChannelCreateReqVO reqVO); 70 + PageResult<SysSmsChannelDO> getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO);
36 71
37 } 72 }
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsChannelServiceImpl.java
@@ -4,9 +4,10 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum; @@ -4,9 +4,10 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory; 5 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory;
6 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties; 6 import cn.iocoder.dashboard.framework.sms.core.property.SmsChannelProperties;
7 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelCreateReqVO;  
8 -import cn.iocoder.dashboard.modules.system.controller.sms.vo.req.SmsChannelPageReqVO;  
9 -import cn.iocoder.dashboard.modules.system.convert.sms.SmsChannelConvert; 7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
  10 +import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsChannelConvert;
10 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; 11 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
11 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper; 12 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper;
12 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; 13 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
@@ -14,8 +15,12 @@ import org.springframework.stereotype.Service; @@ -14,8 +15,12 @@ import org.springframework.stereotype.Service;
14 15
15 import javax.annotation.PostConstruct; 16 import javax.annotation.PostConstruct;
16 import javax.annotation.Resource; 17 import javax.annotation.Resource;
  18 +import java.util.Collection;
17 import java.util.List; 19 import java.util.List;
18 20
  21 +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
  22 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
  23 +
19 /** 24 /**
20 * 短信渠道Service实现类 25 * 短信渠道Service实现类
21 * 26 *
@@ -29,46 +34,65 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService { @@ -29,46 +34,65 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService {
29 private SmsClientFactory smsClientFactory; 34 private SmsClientFactory smsClientFactory;
30 35
31 @Resource 36 @Resource
32 - private SysSmsChannelMapper channelMapper; 37 + private SysSmsChannelMapper smsChannelMapper;
33 38
34 @Override 39 @Override
35 @PostConstruct 40 @PostConstruct
36 public void initSmsClients() { 41 public void initSmsClients() {
37 // 查询有效渠道信息 42 // 查询有效渠道信息
38 - List<SysSmsChannelDO> channelDOList = channelMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus()); 43 + List<SysSmsChannelDO> channelDOList = smsChannelMapper.selectListByStatus(CommonStatusEnum.ENABLE.getStatus());
39 // 创建渠道 Client 44 // 创建渠道 Client
40 - List<SmsChannelProperties> propertiesList = SmsChannelConvert.INSTANCE.convertList(channelDOList); 45 + List<SmsChannelProperties> propertiesList = SysSmsChannelConvert.INSTANCE.convertList02(channelDOList);
41 propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties)); 46 propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties));
42 } 47 }
43 48
44 // TODO 芋艿:刷新缓存 49 // TODO 芋艿:刷新缓存
45 50
46 @Override 51 @Override
47 - public PageResult<SysSmsChannelDO> pageSmsChannels(SmsChannelPageReqVO reqVO) {  
48 - return channelMapper.selectChannelPage(reqVO); 52 + public Long createSmsChannel(SysSmsChannelCreateReqVO createReqVO) {
  53 + // 插入
  54 + SysSmsChannelDO smsChannel = SysSmsChannelConvert.INSTANCE.convert(createReqVO);
  55 + smsChannelMapper.insert(smsChannel);
  56 + // 返回
  57 + return smsChannel.getId();
  58 + }
  59 +
  60 + @Override
  61 + public void updateSmsChannel(SysSmsChannelUpdateReqVO updateReqVO) {
  62 + // 校验存在
  63 + this.validateSmsChannelExists(updateReqVO.getId());
  64 + // 更新
  65 + SysSmsChannelDO updateObj = SysSmsChannelConvert.INSTANCE.convert(updateReqVO);
  66 + smsChannelMapper.updateById(updateObj);
  67 + }
  68 +
  69 + @Override
  70 + public void deleteSmsChannel(Long id) {
  71 + // 校验存在
  72 + this.validateSmsChannelExists(id);
  73 + // 更新
  74 + smsChannelMapper.deleteById(id);
  75 + }
  76 +
  77 + private void validateSmsChannelExists(Long id) {
  78 + if (smsChannelMapper.selectById(id) == null) {
  79 + throw exception(SMS_CHANNEL_NOT_EXISTS);
  80 + }
  81 + }
  82 +
  83 + @Override
  84 + public SysSmsChannelDO getSmsChannel(Long id) {
  85 + return smsChannelMapper.selectById(id);
  86 + }
  87 +
  88 + @Override
  89 + public List<SysSmsChannelDO> getSmsChannelList(Collection<Long> ids) {
  90 + return smsChannelMapper.selectBatchIds(ids);
49 } 91 }
50 92
51 @Override 93 @Override
52 - public Long createSmsChannel(SmsChannelCreateReqVO reqVO) {  
53 - SysSmsChannelDO channelDO = SmsChannelConvert.INSTANCE.convert(reqVO);  
54 - channelMapper.insert(channelDO);  
55 - return channelDO.getId(); 94 + public PageResult<SysSmsChannelDO> getSmsChannelPage(SysSmsChannelPageReqVO pageReqVO) {
  95 + return smsChannelMapper.selectPage(pageReqVO);
56 } 96 }
57 97
58 -// @Override  
59 -// public List<SmsChannelAllVO> listSmsChannelAllEnabledInfo() {  
60 -// List<SysSmsChannelDO> channelDOList = channelMapper.selectListByStatus();  
61 -// if (ObjectUtil.isNull(channelDOList)) {  
62 -// return null;  
63 -// }  
64 -// List<SmsChannelAllVO> channelAllVOList = SmsChannelConvert.INSTANCE.convert(channelDOList);  
65 -// channelAllVOList.forEach(smsChannelDO -> {  
66 -// List<SysSmsTemplateDO> templateDOList = templateMapper.selectListByChannelId(smsChannelDO.getId());  
67 -// if (ObjectUtil.isNull(templateDOList)) {  
68 -// templateDOList = new ArrayList<>();  
69 -// }  
70 -// smsChannelDO.setTemplateList(SmsTemplateConvert.INSTANCE.convert(templateDOList));  
71 -// });  
72 -// return channelAllVOList;  
73 -// }  
74 } 98 }
src/test/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptServiceTest.java
@@ -270,4 +270,5 @@ class SysDeptServiceTest extends BaseDbUnitTest { @@ -270,4 +270,5 @@ class SysDeptServiceTest extends BaseDbUnitTest {
270 }; 270 };
271 return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers)); 271 return randomPojo(SysDeptDO.class, ArrayUtils.append(consumer, consumers));
272 } 272 }
  273 +
273 } 274 }
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.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.enums.CommonStatusEnum;
  5 +import cn.iocoder.dashboard.common.pojo.PageResult;
  6 +import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory;
  7 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelCreateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelPageReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.sms.vo.channel.SysSmsChannelUpdateReqVO;
  10 +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
  11 +import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper;
  12 +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsChannelServiceImpl;
  13 +import cn.iocoder.dashboard.util.collection.ArrayUtils;
  14 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  15 +import org.junit.jupiter.api.Test;
  16 +import org.springframework.boot.test.mock.mockito.MockBean;
  17 +import org.springframework.context.annotation.Import;
  18 +
  19 +import javax.annotation.Resource;
  20 +import java.util.function.Consumer;
  21 +
  22 +import static cn.hutool.core.util.RandomUtil.randomEle;
  23 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.SMS_CHANNEL_NOT_EXISTS;
  24 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  25 +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
  26 +import static cn.iocoder.dashboard.util.RandomUtils.*;
  27 +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  28 +import static org.junit.jupiter.api.Assertions.*;
  29 +
  30 +/**
  31 +* {@link SysSmsChannelServiceImpl} 的单元测试类
  32 +*
  33 +* @author 芋道源码
  34 +*/
  35 +@Import(SysSmsChannelServiceImpl.class)
  36 +public class SysSmsChannelServiceTest extends BaseDbUnitTest {
  37 +
  38 + @Resource
  39 + private SysSmsChannelServiceImpl smsChannelService;
  40 +
  41 + @MockBean
  42 + private SmsClientFactory smsClientFactory;
  43 +
  44 + @Resource
  45 + private SysSmsChannelMapper smsChannelMapper;
  46 +
  47 + @Test
  48 + public void testCreateSmsChannel_success() {
  49 + // 准备参数
  50 + SysSmsChannelCreateReqVO reqVO = randomPojo(SysSmsChannelCreateReqVO.class, o -> o.setStatus(randomCommonStatus()));
  51 +
  52 + // 调用
  53 + Long smsChannelId = smsChannelService.createSmsChannel(reqVO);
  54 + // 断言
  55 + assertNotNull(smsChannelId);
  56 + // 校验记录的属性是否正确
  57 + SysSmsChannelDO smsChannel = smsChannelMapper.selectById(smsChannelId);
  58 + assertPojoEquals(reqVO, smsChannel);
  59 + }
  60 +
  61 + @Test
  62 + public void testUpdateSmsChannel_success() {
  63 + // mock 数据
  64 + SysSmsChannelDO dbSmsChannel = randomSmsChannelDO();
  65 + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据
  66 + // 准备参数
  67 + SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class, o -> {
  68 + o.setId(dbSmsChannel.getId()); // 设置更新的 ID
  69 + o.setStatus(randomCommonStatus());
  70 + });
  71 +
  72 + // 调用
  73 + smsChannelService.updateSmsChannel(reqVO);
  74 + // 校验是否更新正确
  75 + SysSmsChannelDO smsChannel = smsChannelMapper.selectById(reqVO.getId()); // 获取最新的
  76 + assertPojoEquals(reqVO, smsChannel);
  77 + }
  78 +
  79 + @Test
  80 + public void testUpdateSmsChannel_notExists() {
  81 + // 准备参数
  82 + SysSmsChannelUpdateReqVO reqVO = randomPojo(SysSmsChannelUpdateReqVO.class);
  83 +
  84 + // 调用, 并断言异常
  85 + assertServiceException(() -> smsChannelService.updateSmsChannel(reqVO), SMS_CHANNEL_NOT_EXISTS);
  86 + }
  87 +
  88 + @Test
  89 + public void testDeleteSmsChannel_success() {
  90 + // mock 数据
  91 + SysSmsChannelDO dbSmsChannel = randomSmsChannelDO();
  92 + smsChannelMapper.insert(dbSmsChannel);// @Sql: 先插入出一条存在的数据
  93 + // 准备参数
  94 + Long id = dbSmsChannel.getId();
  95 +
  96 + // 调用
  97 + smsChannelService.deleteSmsChannel(id);
  98 + // 校验数据不存在了
  99 + assertNull(smsChannelMapper.selectById(id));
  100 + }
  101 +
  102 + @Test
  103 + public void testDeleteSmsChannel_notExists() {
  104 + // 准备参数
  105 + Long id = randomLongId();
  106 +
  107 + // 调用, 并断言异常
  108 + assertServiceException(() -> smsChannelService.deleteSmsChannel(id), SMS_CHANNEL_NOT_EXISTS);
  109 + }
  110 +
  111 + @Test
  112 + public void testGetSmsChannelPage() {
  113 + // mock 数据
  114 + SysSmsChannelDO dbSmsChannel = randomPojo(SysSmsChannelDO.class, o -> { // 等会查询到
  115 + o.setSignature("芋道源码");
  116 + o.setStatus(CommonStatusEnum.ENABLE.getStatus());
  117 + o.setCreateTime(buildTime(2020, 12, 12));
  118 + });
  119 + smsChannelMapper.insert(dbSmsChannel);
  120 + // 测试 signature 不匹配
  121 + smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setSignature("源码")));
  122 + // 测试 status 不匹配
  123 + smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus())));
  124 + // 测试 createTime 不匹配
  125 + smsChannelMapper.insert(ObjectUtils.clone(dbSmsChannel, o -> o.setCreateTime(buildTime(2020, 11, 11))));
  126 + // 准备参数
  127 + SysSmsChannelPageReqVO reqVO = new SysSmsChannelPageReqVO();
  128 + reqVO.setSignature("芋道");
  129 + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  130 + reqVO.setBeginCreateTime(buildTime(2020, 12, 1));
  131 + reqVO.setEndCreateTime(buildTime(2020, 12, 24));
  132 +
  133 + // 调用
  134 + PageResult<SysSmsChannelDO> pageResult = smsChannelService.getSmsChannelPage(reqVO);
  135 + // 断言
  136 + assertEquals(1, pageResult.getTotal());
  137 + assertEquals(1, pageResult.getList().size());
  138 + assertPojoEquals(dbSmsChannel, pageResult.getList().get(0));
  139 + }
  140 +
  141 + @SafeVarargs
  142 + private static SysSmsChannelDO randomSmsChannelDO(Consumer<SysSmsChannelDO>... consumers) {
  143 + Consumer<SysSmsChannelDO> consumer = (o) -> {
  144 + o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围
  145 + };
  146 + return randomPojo(SysSmsChannelDO.class, ArrayUtils.append(consumer, consumers));
  147 + }
  148 +
  149 +}
src/test/resources/sql/clean.sql
@@ -19,3 +19,4 @@ DELETE FROM &quot;sys_post&quot;; @@ -19,3 +19,4 @@ DELETE FROM &quot;sys_post&quot;;
19 DELETE FROM "sys_login_log"; 19 DELETE FROM "sys_login_log";
20 DELETE FROM "sys_operate_log"; 20 DELETE FROM "sys_operate_log";
21 DELETE FROM "sys_user"; 21 DELETE FROM "sys_user";
  22 +DELETE FROM "sys_sms_channel";
src/test/resources/sql/create_tables.sql
@@ -47,8 +47,7 @@ CREATE TABLE IF NOT EXISTS &quot;inf_job&quot; ( @@ -47,8 +47,7 @@ CREATE TABLE IF NOT EXISTS &quot;inf_job&quot; (
47 PRIMARY KEY ("id") 47 PRIMARY KEY ("id")
48 ) COMMENT='定时任务表'; 48 ) COMMENT='定时任务表';
49 49
50 -DROP TABLE IF EXISTS "inf_job_log";  
51 -CREATE TABLE "inf_job_log" ( 50 +CREATE TABLE IF NOT EXISTS "inf_job_log" (
52 "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号', 51 "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号',
53 "job_id" bigint(20) NOT NULL COMMENT '任务编号', 52 "job_id" bigint(20) NOT NULL COMMENT '任务编号',
54 "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字', 53 "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
@@ -192,8 +191,7 @@ CREATE TABLE IF NOT EXISTS `sys_user_session` ( @@ -192,8 +191,7 @@ CREATE TABLE IF NOT EXISTS `sys_user_session` (
192 PRIMARY KEY (`id`) 191 PRIMARY KEY (`id`)
193 ) COMMENT '用户在线 Session'; 192 ) COMMENT '用户在线 Session';
194 193
195 -CREATE TABLE IF NOT EXISTS "sys_post"  
196 -( 194 +CREATE TABLE IF NOT EXISTS "sys_post" (
197 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 195 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
198 "code" varchar(64) NOT NULL, 196 "code" varchar(64) NOT NULL,
199 "name" varchar(50) NOT NULL, 197 "name" varchar(50) NOT NULL,
@@ -208,7 +206,6 @@ CREATE TABLE IF NOT EXISTS &quot;sys_post&quot; @@ -208,7 +206,6 @@ CREATE TABLE IF NOT EXISTS &quot;sys_post&quot;
208 PRIMARY KEY ("id") 206 PRIMARY KEY ("id")
209 ) COMMENT '岗位信息表'; 207 ) COMMENT '岗位信息表';
210 208
211 -  
212 CREATE TABLE IF NOT EXISTS "sys_notice" ( 209 CREATE TABLE IF NOT EXISTS "sys_notice" (
213 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 210 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
214 "title" varchar(50) NOT NULL COMMENT '公告标题', 211 "title" varchar(50) NOT NULL COMMENT '公告标题',
@@ -223,7 +220,6 @@ CREATE TABLE IF NOT EXISTS &quot;sys_notice&quot; ( @@ -223,7 +220,6 @@ CREATE TABLE IF NOT EXISTS &quot;sys_notice&quot; (
223 PRIMARY KEY("id") 220 PRIMARY KEY("id")
224 ) COMMENT '通知公告表'; 221 ) COMMENT '通知公告表';
225 222
226 -  
227 CREATE TABLE IF NOT EXISTS `sys_login_log` ( 223 CREATE TABLE IF NOT EXISTS `sys_login_log` (
228 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, 224 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
229 `log_type` bigint(4) NOT NULL, 225 `log_type` bigint(4) NOT NULL,
@@ -240,7 +236,6 @@ CREATE TABLE IF NOT EXISTS `sys_login_log` ( @@ -240,7 +236,6 @@ CREATE TABLE IF NOT EXISTS `sys_login_log` (
240 PRIMARY KEY (`id`) 236 PRIMARY KEY (`id`)
241 ) COMMENT ='系统访问记录'; 237 ) COMMENT ='系统访问记录';
242 238
243 -  
244 CREATE TABLE IF NOT EXISTS `sys_operate_log` ( 239 CREATE TABLE IF NOT EXISTS `sys_operate_log` (
245 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY, 240 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
246 `trace_id` varchar(64) NOT NULL DEFAULT '', 241 `trace_id` varchar(64) NOT NULL DEFAULT '',
@@ -346,3 +341,20 @@ CREATE TABLE IF NOT EXISTS &quot;inf_api_error_log&quot; ( @@ -346,3 +341,20 @@ CREATE TABLE IF NOT EXISTS &quot;inf_api_error_log&quot; (
346 "deleted" bit not null default false, 341 "deleted" bit not null default false,
347 primary key ("id") 342 primary key ("id")
348 ) COMMENT '系统异常日志'; 343 ) COMMENT '系统异常日志';
  344 +
  345 +CREATE TABLE IF NOT EXISTS "sys_sms_channel" (
  346 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  347 + "signature" varchar(10) NOT NULL,
  348 + "code" varchar(63) NOT NULL,
  349 + "status" tinyint NOT NULL,
  350 + "remark" varchar(255) DEFAULT NULL,
  351 + "api_key" varchar(63) NOT NULL,
  352 + "api_secret" varchar(63) DEFAULT NULL,
  353 + "callback_url" varchar(255) DEFAULT NULL,
  354 + "creator" varchar(64) DEFAULT '',
  355 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  356 + "updater" varchar(64) DEFAULT '',
  357 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  358 + "deleted" bit NOT NULL DEFAULT FALSE,
  359 + PRIMARY KEY ("id")
  360 +) COMMENT '短信渠道';