Commit d8d458a0249f2138be8c5eb13e8086202399a7be
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 "sys_post"; | @@ -19,3 +19,4 @@ DELETE FROM "sys_post"; | ||
| 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 "inf_job" ( | @@ -47,8 +47,7 @@ CREATE TABLE IF NOT EXISTS "inf_job" ( | ||
| 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 "sys_post" | @@ -208,7 +206,6 @@ CREATE TABLE IF NOT EXISTS "sys_post" | ||
| 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 "sys_notice" ( | @@ -223,7 +220,6 @@ CREATE TABLE IF NOT EXISTS "sys_notice" ( | ||
| 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 "inf_api_error_log" ( | @@ -346,3 +341,20 @@ CREATE TABLE IF NOT EXISTS "inf_api_error_log" ( | ||
| 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 '短信渠道'; |