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 1 package cn.iocoder.dashboard.modules.system.controller.sms;
2 2  
3 3 import cn.hutool.core.util.URLUtil;
  4 +import cn.hutool.extra.servlet.ServletUtil;
  5 +import cn.iocoder.dashboard.common.pojo.CommonResult;
4 6 import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
5 7 import cn.iocoder.dashboard.framework.sms.core.enums.SmsChannelEnum;
6 8 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsService;
... ... @@ -13,6 +15,9 @@ import org.springframework.web.bind.annotation.RequestParam;
13 15 import org.springframework.web.bind.annotation.RestController;
14 16  
15 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 22 @Api(tags = "短信回调")
18 23 @RestController
... ... @@ -32,4 +37,13 @@ public class SmsCallbackController {
32 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 2  
3 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 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 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 11 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
9 12 import io.swagger.annotations.Api;
  13 +import io.swagger.annotations.ApiImplicitParam;
10 14 import io.swagger.annotations.ApiOperation;
11   -import org.springframework.validation.annotation.Validated;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
12 16 import org.springframework.web.bind.annotation.*;
13 17  
14 18 import javax.annotation.Resource;
  19 +import javax.validation.Valid;
15 20  
16 21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
17 22  
18   -@Api("短信 渠道/签名 API")
  23 +@Api(tags = "短信渠道")
19 24 @RestController
20 25 @RequestMapping("/sms/channel")
21 26 public class SmsChannelController {
22 27  
23 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 1 package cn.iocoder.dashboard.modules.system.dal.mysql.sms;
2 2  
3   -import cn.hutool.core.util.StrUtil;
4 3 import cn.iocoder.dashboard.common.pojo.PageResult;
5 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 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
8 8 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
9 9 import org.apache.ibatis.annotations.Mapper;
... ... @@ -13,14 +13,16 @@ import java.util.List;
13 13 @Mapper
14 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 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 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 78 ErrorCode FILE_UPLOAD_FAILED = new ErrorCode(1002009002, "文件上传失败");
79 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 18 SYS_LOGIN_RESULT("sys_login_result"), // 登陆结果
19 19 SYS_CONFIG_TYPE("sys_config_type"), // 参数配置类型
20 20 SYS_BOOLEAN_STRING("sys_boolean_string"), // Boolean 是否类型
  21 + SYS_SMS_CHANNEL_CODE("sys_sms_channel_code"), // 短信渠道编码
21 22  
22 23 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
23 24 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelService.java
1 1 package cn.iocoder.dashboard.modules.system.service.sms;
2 2  
3 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 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 14 * 短信渠道Service接口
10 15 *
... ... @@ -19,19 +24,49 @@ public interface SysSmsChannelService {
19 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 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 5 import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory;
6 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 11 import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO;
11 12 import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsChannelMapper;
12 13 import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService;
... ... @@ -14,8 +15,12 @@ import org.springframework.stereotype.Service;
14 15  
15 16 import javax.annotation.PostConstruct;
16 17 import javax.annotation.Resource;
  18 +import java.util.Collection;
17 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 25 * 短信渠道Service实现类
21 26 *
... ... @@ -29,46 +34,65 @@ public class SysSmsChannelServiceImpl implements SysSmsChannelService {
29 34 private SmsClientFactory smsClientFactory;
30 35  
31 36 @Resource
32   - private SysSmsChannelMapper channelMapper;
  37 + private SysSmsChannelMapper smsChannelMapper;
33 38  
34 39 @Override
35 40 @PostConstruct
36 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 44 // 创建渠道 Client
40   - List<SmsChannelProperties> propertiesList = SmsChannelConvert.INSTANCE.convertList(channelDOList);
  45 + List<SmsChannelProperties> propertiesList = SysSmsChannelConvert.INSTANCE.convertList02(channelDOList);
41 46 propertiesList.forEach(properties -> smsClientFactory.createOrUpdateSmsClient(properties));
42 47 }
43 48  
44 49 // TODO 芋艿:刷新缓存
45 50  
46 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 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 270 };
271 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 19 DELETE FROM "sys_login_log";
20 20 DELETE FROM "sys_operate_log";
21 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 47 PRIMARY KEY ("id")
48 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 51 "id" bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY COMMENT '日志编号',
53 52 "job_id" bigint(20) NOT NULL COMMENT '任务编号',
54 53 "handler_name" varchar(64) NOT NULL COMMENT '处理器的名字',
... ... @@ -192,8 +191,7 @@ CREATE TABLE IF NOT EXISTS `sys_user_session` (
192 191 PRIMARY KEY (`id`)
193 192 ) COMMENT '用户在线 Session';
194 193  
195   -CREATE TABLE IF NOT EXISTS "sys_post"
196   -(
  194 +CREATE TABLE IF NOT EXISTS "sys_post" (
197 195 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
198 196 "code" varchar(64) NOT NULL,
199 197 "name" varchar(50) NOT NULL,
... ... @@ -208,7 +206,6 @@ CREATE TABLE IF NOT EXISTS &quot;sys_post&quot;
208 206 PRIMARY KEY ("id")
209 207 ) COMMENT '岗位信息表';
210 208  
211   -
212 209 CREATE TABLE IF NOT EXISTS "sys_notice" (
213 210 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
214 211 "title" varchar(50) NOT NULL COMMENT '公告标题',
... ... @@ -223,7 +220,6 @@ CREATE TABLE IF NOT EXISTS &quot;sys_notice&quot; (
223 220 PRIMARY KEY("id")
224 221 ) COMMENT '通知公告表';
225 222  
226   -
227 223 CREATE TABLE IF NOT EXISTS `sys_login_log` (
228 224 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
229 225 `log_type` bigint(4) NOT NULL,
... ... @@ -240,7 +236,6 @@ CREATE TABLE IF NOT EXISTS `sys_login_log` (
240 236 PRIMARY KEY (`id`)
241 237 ) COMMENT ='系统访问记录';
242 238  
243   -
244 239 CREATE TABLE IF NOT EXISTS `sys_operate_log` (
245 240 `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
246 241 `trace_id` varchar(64) NOT NULL DEFAULT '',
... ... @@ -346,3 +341,20 @@ CREATE TABLE IF NOT EXISTS &quot;inf_api_error_log&quot; (
346 341 "deleted" bit not null default false,
347 342 primary key ("id")
348 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 '短信渠道';
... ...