From ea39dcc5c803ffd0a569243cb2a678ebc0d04b1b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 25 Jan 2023 20:44:48 +0800 Subject: [PATCH] =?UTF-8?q?=E9=82=AE=E7=AE=B1=E6=A8=A1=E5=9D=97=EF=BC=9A?= =?UTF-8?q?=E5=AE=8C=E5=96=84=20template=20=E6=A8=A1=E7=89=88=E7=9A=84?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/enums/ErrorCodeConstants.java | 8 +- .../admin/mail/MailTemplateController.java | 35 +-- .../mail/vo/account/MailAccountBaseVO.java | 8 +- .../vo/account/MailAccountSimpleRespVO.java | 2 +- .../mail/vo/template/MailTemplateBaseVO.java | 41 +-- .../vo/template/MailTemplateCreateReqVO.java | 3 +- .../vo/template/MailTemplatePageReqVO.java | 41 ++- .../mail/vo/template/MailTemplateRespVO.java | 25 +- .../vo/template/MailTemplateSimpleRespVO.java | 17 ++ .../vo/template/MailTemplateUpdateReqVO.java | 3 +- .../convert/mail/MailTemplateConvert.java | 11 +- .../dal/dataobject/mail/MailAccountDO.java | 4 +- .../system/dal/dataobject/mail/MailLogDO.java | 12 +- .../dal/dataobject/mail/MailTemplateDO.java | 6 +- .../dal/mysql/mail/MailTemplateMapper.java | 33 +-- .../service/mail/MailTemplateService.java | 36 +-- .../mail/impl/MailTemplateServiceImpl.java | 120 ++++---- .../src/main/resources/application.yaml | 3 + yudao-ui-admin/src/api/system/mail/account.js | 8 + .../src/api/system/mail/template.js | 44 +++ .../src/views/system/mail/account/index.vue | 20 +- .../src/views/system/mail/template/index.vue | 269 ++++++++++++++++++ 22 files changed, 550 insertions(+), 199 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java create mode 100755 yudao-ui-admin/src/api/system/mail/template.js create mode 100755 yudao-ui-admin/src/views/system/mail/template/index.vue diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 135248867..577fcb2ad 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -145,9 +145,9 @@ public interface ErrorCodeConstants { ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002023000, "邮箱账号不存在"); ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002023001, "无法删除,该邮箱账号还有邮件模板"); - // ========== 邮箱模版 1002021000 ========== - ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002021000, "邮箱模版不存在"); - ErrorCode MAIL_TEMPLATE_EXISTS = new ErrorCode(1002021001, "邮箱模版存在"); - ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); + // ========== 邮箱模版 1002024000 ========== + ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002024000, "邮件模版不存在"); + ErrorCode MAIL_TEMPLATE_CODE_EXISTS = new ErrorCode(1002024001, "邮件模版 code({}) 已存在"); + ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); // TODO 优化 } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java index 2fae6164b..741462c95 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.controller.admin.mail; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.send.MailReqVO; import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*; import cn.iocoder.yudao.module.system.convert.mail.MailTemplateConvert; import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; @@ -10,13 +9,11 @@ import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.validation.Valid; - -import java.util.Comparator; import java.util.List; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -26,37 +23,35 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @RequestMapping("/system/mail-template") public class MailTemplateController { - // TODO @wangjingyi:private DONE - @Autowired + @Resource private MailTemplateService mailTempleService; @PostMapping("/create") - @ApiOperation("创建邮箱模版") + @ApiOperation("创建邮件模版") @PreAuthorize("@ss.hasPermission('system:mail-template:create')") public CommonResult createMailTemplate(@Valid @RequestBody MailTemplateCreateReqVO createReqVO){ - return success(mailTempleService.create(createReqVO)); + return success(mailTempleService.createMailTemplate(createReqVO)); } @PutMapping("/update") - @ApiOperation("修改邮箱模版") + @ApiOperation("修改邮件模版") @PreAuthorize("@ss.hasPermission('system:mail-template:update')") public CommonResult updateMailTemplate(@Valid @RequestBody MailTemplateUpdateReqVO updateReqVO){ - mailTempleService.update(updateReqVO); + mailTempleService.updateMailTemplate(updateReqVO); return success(true); } @DeleteMapping("/delete") - @ApiOperation("删除邮箱模版") + @ApiOperation("删除邮件模版") + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:mail-template:delete')") - public CommonResult deleteMailTemplate(@Valid @RequestBody Long id) { - mailTempleService.delete(id); + public CommonResult deleteMailTemplate(@RequestParam("id") Long id) { + mailTempleService.deleteMailTemplate(id); return success(true); } - // TODO @wangjingyi:下面几个 VO 也参考我在 account 给的建议 DONE RespVO中需要BaseVO 中哪些字段 - @GetMapping("/get") - @ApiOperation("获得邮箱模版") + @ApiOperation("获得邮件模版") @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) @PreAuthorize("@ss.hasPermission('system:mail-template:get')") public CommonResult getMailTemplate(@RequestParam("id") Long id) { @@ -65,7 +60,7 @@ public class MailTemplateController { } @GetMapping("/page") - @ApiOperation("获得邮箱模版分页") + @ApiOperation("获得邮件模版分页") @PreAuthorize("@ss.hasPermission('system:mail-template:query')") public CommonResult> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) { PageResult pageResult = mailTempleService.getMailTemplatePage(pageReqVO); @@ -73,11 +68,9 @@ public class MailTemplateController { } @GetMapping("/list-all-simple") - @ApiOperation(value = "获得邮箱模版精简列表") - public CommonResult> getSimpleTemplateList() { + @ApiOperation(value = "获得邮件模版精简列表") + public CommonResult> getSimpleTemplateList() { List list = mailTempleService.getMailTemplateList(); - // 排序后,返回给前端 - list.sort(Comparator.comparing(MailTemplateDO::getId)); return success(MailTemplateConvert.INSTANCE.convertList02(list)); } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountBaseVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountBaseVO.java index 7a3f2347f..ef18cb6ac 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountBaseVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountBaseVO.java @@ -26,12 +26,12 @@ public class MailAccountBaseVO { @NotNull(message = "密码必填") private String password; - @ApiModelProperty(value = "网站", required = true, example = "www.iocoder.cn") - @NotNull(message = "网站不能为空") + @ApiModelProperty(value = "SMTP 服务器域名", required = true, example = "www.iocoder.cn") + @NotNull(message = "SMTP 服务器域名不能为空") private String host; - @ApiModelProperty(value = "端口", required = true, example = "80") - @NotNull(message = "端口不能为空") + @ApiModelProperty(value = "SMTP 服务器端口", required = true, example = "80") + @NotNull(message = "SMTP 服务器端口不能为空") private Integer port; @ApiModelProperty(value = "是否开启 ssl", required = true, example = "true") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java index 93118388e..96916a715 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java @@ -8,7 +8,7 @@ import lombok.Data; @Data public class MailAccountSimpleRespVO { - @ApiModelProperty(value = "邮箱比那好", required = true, example = "1024") + @ApiModelProperty(value = "邮箱编号", required = true, example = "1024") private Long id; @ApiModelProperty(value = "邮箱", required = true, example = "768541388@qq.com") diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateBaseVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateBaseVO.java index 1e44336aa..e2835debd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateBaseVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateBaseVO.java @@ -1,44 +1,47 @@ package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template; -import io.swagger.annotations.ApiModel; +import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; -import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; -@ApiModel("管理后台 - 邮箱模版基类 Base VO") +/** + * 邮件模版 Base VO,提供给添加、修改、详细的子 VO 使用 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 + */ @Data public class MailTemplateBaseVO { - @ApiModelProperty("主键") - @NotNull(message = "主键不能为空") - private Long id; - @ApiModelProperty("名称") + @ApiModelProperty(value = "模版名称", required = true, example = "测试名字") @NotNull(message = "名称不能为空") private String name; - @ApiModelProperty("标识") - @NotNull(message = "邮箱模版code不能为空") + @ApiModelProperty(value = "模版编号", required = true, example = "test") + @NotNull(message = "模版编号不能为空") private String code; - @ApiModelProperty("发件人") - @NotNull(message = "发件人不能为空") - @Email(message = "发件人格式有误") - private String username; + @ApiModelProperty(value = "发送的邮箱账号编号", required = true, example = "1") + @NotNull(message = "发送的邮箱账号编号不能为空") + private Long accountId; - @ApiModelProperty("标题") - @NotNull(message = "标题不能为空") + @ApiModelProperty(value = "发送人名称", example = "芋头") + private String nickname; + + @ApiModelProperty(value = "标题", required = true, example = "注册成功") + @NotEmpty(message = "标题不能为空") private String title; - @ApiModelProperty("内容") - @NotNull(message = "内容不能为空") + @ApiModelProperty(value = "内容", required = true, example = "你好,注册成功啦") + @NotEmpty(message = "内容不能为空") private String content; - @ApiModelProperty("状态") + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举") @NotNull(message = "状态不能为空") private Integer status; - @ApiModelProperty("备注") + @ApiModelProperty(value = "备注", example = "奥特曼") private String remark; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateCreateReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateCreateReqVO.java index 2311cb087..6eab6e9ab 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateCreateReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateCreateReqVO.java @@ -5,11 +5,10 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; -@ApiModel("管理后台 - 邮箱模版创建 Request VO") +@ApiModel("管理后台 - 邮件模版创建 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class MailTemplateCreateReqVO extends MailTemplateBaseVO { - } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java index a48c5a91a..f3cec08f9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java @@ -6,33 +6,32 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; -@ApiModel("管理后台 - 邮箱模版分页 Request VO") +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@ApiModel("管理后台 - 邮件模版分页 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) public class MailTemplatePageReqVO extends PageParam { - @ApiModelProperty("主键") - private Long id; - @ApiModelProperty("名称") - private String name; - - @ApiModelProperty("标识") - private String code; - - @ApiModelProperty("发件人") - private String username; - - @ApiModelProperty("标题") - private String title; - - @ApiModelProperty("内容") - private String content; - - @ApiModelProperty("状态") + @ApiModelProperty(value = "状态", example = "1", notes = "参见 CommonStatusEnum 枚举") private Integer status; - @ApiModelProperty("备注") - private String remark; + @ApiModelProperty(value = "标识", example = "code_1024", notes = "模糊匹配") + private String code; + + @ApiModelProperty(value = "名称", example = "芋头", notes = "模糊匹配") + private String name; + + @ApiModelProperty(value = "账号编号", example = "2048") + private Long accountId; + + @ApiModelProperty(value = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java index 33683b1c5..a2153f9cd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java @@ -1,4 +1,27 @@ package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template; -public class MailTemplateRespVO extends MailTemplateBaseVO{ +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +import java.time.LocalDateTime; +import java.util.List; + +@ApiModel("管理后台 - 邮件末班 Response VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MailTemplateRespVO extends MailTemplateBaseVO { + + @ApiModelProperty(value = "编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "参数数组", example = "name,code") + private List params; + + @ApiModelProperty(value = "创建时间", required = true) + private LocalDateTime createTime; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java new file mode 100644 index 000000000..2ff488036 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel("管理后台 - 邮件模版的精简 Response VO") +@Data +public class MailTemplateSimpleRespVO { + + @ApiModelProperty(value = "模版编号", required = true, example = "1024") + private Long id; + + @ApiModelProperty(value = "模版名字", required = true, example = "哒哒哒") + private String name; + +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateUpdateReqVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateUpdateReqVO.java index 82d9997be..5dfa377a2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateUpdateReqVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateUpdateReqVO.java @@ -8,7 +8,7 @@ import lombok.ToString; import javax.validation.constraints.NotNull; -@ApiModel("管理后台 - 邮箱模版修改 Request VO") +@ApiModel("管理后台 - 邮件模版修改 Request VO") @Data @EqualsAndHashCode(callSuper = true) @ToString(callSuper = true) @@ -17,4 +17,5 @@ public class MailTemplateUpdateReqVO extends MailTemplateBaseVO { @ApiModelProperty(value = "编号", required = true, example = "1024") @NotNull(message = "编号不能为空") private Long id; + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailTemplateConvert.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailTemplateConvert.java index 46a25b9e2..4430ffb05 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailTemplateConvert.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailTemplateConvert.java @@ -1,8 +1,7 @@ package cn.iocoder.yudao.module.system.convert.mail; import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateBaseVO; -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateRespVO; +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*; import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; @@ -14,12 +13,14 @@ public interface MailTemplateConvert { MailTemplateConvert INSTANCE = Mappers.getMapper(MailTemplateConvert.class); - MailTemplateDO convert(MailTemplateBaseVO baseVO); + MailTemplateDO convert(MailTemplateUpdateReqVO bean); - MailTemplateRespVO convert(MailTemplateDO mailTemplateDO); + MailTemplateDO convert(MailTemplateCreateReqVO bean); + + MailTemplateRespVO convert(MailTemplateDO bean); PageResult convertPage(PageResult pageResult); - List convertList02(List list); + List convertList02(List list); } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailAccountDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailAccountDO.java index 33e6859e2..b5d349439 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailAccountDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailAccountDO.java @@ -36,11 +36,11 @@ public class MailAccountDO extends BaseDO { */ private String password; /** - * 主机 + * SMTP 服务器域名 */ private String host; /** - * 端口 + * SMTP 服务器端口 */ private Integer port; /** diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java index 598b52cfc..ddd0f7158 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java @@ -69,11 +69,21 @@ public class MailLogDO extends BaseDO implements Serializable { */ private Long templateId; /** - * 末班编码 + * 模版编码 * * 冗余 {@link MailTemplateDO#getCode()} */ private String templateCode; + /** + * 模版发送人名称 + * + * 冗余 {@link MailTemplateDO#getNickname()} + */ + private String templateNickname; + /** + * 模版标题 + */ + private String templateTitle; /** * 模版内容 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailTemplateDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailTemplateDO.java index c3c1cae83..f669b455f 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailTemplateDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailTemplateDO.java @@ -11,7 +11,7 @@ import lombok.EqualsAndHashCode; import java.util.List; /** - * 邮箱模版 DO + * 邮件模版 DO * * @author wangjingyi * @since 2022-03-21 @@ -40,6 +40,10 @@ public class MailTemplateDO extends BaseDO { */ private Long accountId; + /** + * 发送人名称 + */ + private String nickname; /** * 标题 */ diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailTemplateMapper.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailTemplateMapper.java index 86bb5e8f5..f03aa4ae9 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailTemplateMapper.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailTemplateMapper.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.mail; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; @@ -11,36 +12,24 @@ import org.apache.ibatis.annotations.Select; import java.util.Date; - @Mapper public interface MailTemplateMapper extends BaseMapperX { default PageResult selectPage(MailTemplatePageReqVO pageReqVO){ - return selectPage(pageReqVO , new QueryWrapperX() - .likeIfPresent("name" , pageReqVO.getName()) - .likeIfPresent("username" , pageReqVO.getUsername()) - .likeIfPresent("title" , pageReqVO.getTitle()) - .likeIfPresent("content" , pageReqVO.getContent()) - .eqIfPresent("status" , pageReqVO.getStatus()) - .likeIfPresent("remark" , pageReqVO.getRemark()) - ); - } - - default MailTemplateDO selectOneByCode(String code){ - return selectOne(new QueryWrapperX() - .eqIfPresent("code" , code)); - }; - - @Select("SELECT COUNT(*) FROM system_mail_template WHERE update_time > #{maxUpdateTime} LIMIT 1") - Long selectByMaxUpdateTime(Date maxUpdateTime); - - default MailTemplateDO selectOneByAccountId(Long accountId){ - return selectOne(new QueryWrapperX() - .eqIfPresent("account_id" , accountId)); + return selectPage(pageReqVO , new LambdaQueryWrapperX() + .eqIfPresent(MailTemplateDO::getStatus, pageReqVO.getStatus()) + .likeIfPresent(MailTemplateDO::getCode, pageReqVO.getCode()) + .likeIfPresent(MailTemplateDO::getName, pageReqVO.getName()) + .eqIfPresent(MailTemplateDO::getAccountId, pageReqVO.getAccountId()) + .betweenIfPresent(MailTemplateDO::getCreateTime, pageReqVO.getCreateTime())); } default Long selectCountByAccountId(Long accountId) { return selectCount(MailTemplateDO::getAccountId, accountId); } + default MailTemplateDO selectByCode(String code) { + return selectOne(MailTemplateDO::getCode, code); + } + } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java index 662d77623..704f7d653 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java @@ -11,7 +11,7 @@ import java.util.List; import java.util.Map; /** - * 邮箱模版服务类 + * 邮件模版 Service 接口 * * @author wangjingyi * @since 2022-03-21 @@ -19,34 +19,34 @@ import java.util.Map; public interface MailTemplateService { /** - * 初始化邮箱模版的本地缓存 + * 初始化邮件模版的本地缓存 */ void initLocalCache(); /** - * 邮箱模版创建 + * 邮件模版创建 * - * @param createReqVO 邮箱信息 + * @param createReqVO 邮件信息 * @return 编号 */ - Long create(@Valid MailTemplateCreateReqVO createReqVO); + Long createMailTemplate(@Valid MailTemplateCreateReqVO createReqVO); /** - * 邮箱模版修改 + * 邮件模版修改 * - * @param updateReqVO 邮箱信息 + * @param updateReqVO 邮件信息 */ - void update(@Valid MailTemplateUpdateReqVO updateReqVO); + void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO); /** - * 邮箱模版删除 + * 邮件模版删除 * * @param id 编号 */ - void delete(Long id); + void deleteMailTemplate(Long id); /** - * 获取邮箱模版 + * 获取邮件模版 * * @param id 编号 * @return 邮件模版 @@ -54,39 +54,39 @@ public interface MailTemplateService { MailTemplateDO getMailTemplate(Long id); /** - * 获取邮箱模版分页 + * 获取邮件模版分页 * * @param pageReqVO 模版信息 - * @return 邮箱模版分页信息 + * @return 邮件模版分页信息 */ PageResult getMailTemplatePage(MailTemplatePageReqVO pageReqVO); /** - * 获取邮箱模板数组 + * 获取邮件模板数组 * * @return 模版数组 */ List getMailTemplateList(); /** - * 从缓存中获取邮箱模版 + * 从缓存中获取邮件模版 * * @param code 模板编码 - * @return 邮箱模板 + * @return 邮件模板 */ MailTemplateDO getMailTemplateByCodeFromCache(String code); /** * 邮件模版内容合成 * - * @param content 邮箱模版 + * @param content 邮件模版 * @param params 合成参数 * @return 格式化后的内容 */ String formatMailTemplateContent(String content, Map params); /** - * 获得指定邮箱账号下的邮件模板数量 + * 获得指定邮件账号下的邮件模板数量 * * @param accountId 账号编号 * @return 数量 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java index 9ae635cee..753614683 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java @@ -2,9 +2,11 @@ package cn.iocoder.yudao.module.system.service.mail.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO; import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateUpdateReqVO; @@ -13,6 +15,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; +import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -25,8 +28,8 @@ import java.util.List; import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_EXISTS; -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** * 邮箱模版 Service 实现类 @@ -47,56 +50,71 @@ public class MailTemplateServiceImpl implements MailTemplateService { /** * 邮件模板缓存 - * key:邮箱模板编码 {@link MailTemplateDO#getId()} + * key:邮件模版标识 {@link MailTemplateDO#getCode()} * * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 */ - private volatile Map mailTemplateCache; + private volatile Map mailTemplateCache; @Override @PostConstruct public void initLocalCache() { - if (true) { - return; - } - List mailTemplateDOList = this.loadMailTemplateIfUpdate(null); - if (CollUtil.isEmpty(mailTemplateDOList)) { - return; - } + // 第一步:查询数据 + List templates = mailTemplateMapper.selectList(); + log.info("[initLocalCache][缓存邮件模版,数量:{}]", templates.size()); - // 写入缓存 - mailTemplateCache = CollectionUtils.convertMap(mailTemplateDOList, MailTemplateDO::getId); - log.info("[initLocalCache][初始化 mailTemplate 数量为 {}]", mailTemplateDOList.size()); + // 第二步:构建缓存 + mailTemplateCache = convertMap(templates, MailTemplateDO::getCode); } @Override - public Long create(MailTemplateCreateReqVO createReqVO) { - // 要校验存在 - validateMailTemplateExists(createReqVO.getId()); - MailTemplateDO mailTemplateDO = MailTemplateConvert.INSTANCE.convert(createReqVO); - mailTemplateMapper.insert(mailTemplateDO); - // TODO @wangjingyi:mq 更新 DONE + public Long createMailTemplate(MailTemplateCreateReqVO createReqVO) { + // 校验 code 是否唯一 + validateCodeUnique(null, createReqVO.getCode()); + + // 插入 + MailTemplateDO template = MailTemplateConvert.INSTANCE.convert(createReqVO); + mailTemplateMapper.insert(template); + // 发送刷新消息 mailProducer.sendMailTemplateRefreshMessage(); - return mailTemplateDO.getId(); + return template.getId(); } @Override - public void update(@Valid MailTemplateUpdateReqVO updateReqVO) { - // 校验是否唯一 - // TODO @wangjingyi:参考下我在 account 给的唯一校验的说明。DONE - this.validateMailTemplateOnlyByCode(updateReqVO.getId(),updateReqVO.getCode()); - MailTemplateDO mailTemplateDO = MailTemplateConvert.INSTANCE.convert(updateReqVO); - mailTemplateMapper.updateById(mailTemplateDO); - // TODO @wangjingyi:mq 更新 DONE - mailProducer.sendMailTemplateRefreshMessage(); - } - - @Override - public void delete(Long id) { + public void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO) { // 校验是否存在 - this.validateMailTemplateExists(id); + validateMailTemplateExists(updateReqVO.getId()); + // 校验 code 是否唯一 + validateCodeUnique(updateReqVO.getId(),updateReqVO.getCode()); + + // 更新 + MailTemplateDO updateObj = MailTemplateConvert.INSTANCE.convert(updateReqVO); + mailTemplateMapper.updateById(updateObj); + // 发送刷新消息 + mailProducer.sendMailTemplateRefreshMessage(); + } + + @VisibleForTesting + public void validateCodeUnique(Long id, String code) { + MailTemplateDO template = mailTemplateMapper.selectByCode(code); + if (template == null) { + return; + } + // 存在 template 记录的情况下 + if (id == null // 新增时,说明重复 + || ObjUtil.notEqual(id, template.getId())) { // 更新时,如果 id 不一致,说明重复 + throw exception(MAIL_TEMPLATE_CODE_EXISTS); + } + } + + @Override + public void deleteMailTemplate(Long id) { + // 校验是否存在 + validateMailTemplateExists(id); + + // 删除 mailTemplateMapper.deleteById(id); - // TODO @wangjingyi:mq 更新 DONE + // 发送刷新消息 mailProducer.sendMailTemplateRefreshMessage(); } @@ -122,41 +140,11 @@ public class MailTemplateServiceImpl implements MailTemplateService { } private void validateMailTemplateExists(Long id) { - if (mailTemplateCache.get(id) == null) { + if (mailTemplateMapper.selectById(id) == null) { throw exception(MAIL_TEMPLATE_NOT_EXISTS); } } - private void validateMailTemplateOnlyByCode(Long id ,String code){ - mailTemplateCache.forEach((key,value)->{ - if (value.getCode().equals(code)){ - if (!key.equals(id)){ - throw exception(MAIL_TEMPLATE_EXISTS); - } - } - }); - } - /** - * 如果邮件模板发生变化,从数据库中获取最新的全量邮件模板。 - * 如果未发生变化,则返回空 - * - * @param maxUpdateTime 当前邮件模板的最大更新时间 - * @return 邮件模板列表 - */ - private List loadMailTemplateIfUpdate(Date maxUpdateTime) { - // 第一步,判断是否要更新。 - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 - log.info("[loadMailTemplateIfUpdate][首次加载全量邮件模板]"); - } else { // 判断数据库中是否有更新的邮件模板 - if (mailTemplateMapper.selectByMaxUpdateTime(maxUpdateTime) == 0) { - return null; - } - log.info("[loadSmsTemplateIfUpdate][增量加载全量邮件模板]"); - } - // 第二步,如果有更新,则从数据库加载所有邮件模板 - return mailTemplateMapper.selectList(); - } - @Override public long countByAccountId(Long accountId) { return mailTemplateMapper.selectCountByAccountId(accountId); diff --git a/yudao-server/src/main/resources/application.yaml b/yudao-server/src/main/resources/application.yaml index 325e88f42..e1bcb137e 100644 --- a/yudao-server/src/main/resources/application.yaml +++ b/yudao-server/src/main/resources/application.yaml @@ -138,6 +138,9 @@ yudao: - system_sms_log - system_sensitive_word - system_oauth2_client + - system_mail_account + - system_mail_template + - system_mail_log - infra_codegen_column - infra_codegen_table - infra_test_demo diff --git a/yudao-ui-admin/src/api/system/mail/account.js b/yudao-ui-admin/src/api/system/mail/account.js index 171fe553f..0868e4f37 100755 --- a/yudao-ui-admin/src/api/system/mail/account.js +++ b/yudao-ui-admin/src/api/system/mail/account.js @@ -42,3 +42,11 @@ export function getMailAccountPage(query) { params: query }) } + +// 获取邮箱账号的精简信息列表 +export function getSimpleMailAccountList() { + return request({ + url: '/system/mail-account/list-all-simple', + method: 'get', + }) +} diff --git a/yudao-ui-admin/src/api/system/mail/template.js b/yudao-ui-admin/src/api/system/mail/template.js new file mode 100755 index 000000000..ee5d8d454 --- /dev/null +++ b/yudao-ui-admin/src/api/system/mail/template.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 创建邮件模版 +export function createMailTemplate(data) { + return request({ + url: '/system/mail-template/create', + method: 'post', + data: data + }) +} + +// 更新邮件模版 +export function updateMailTemplate(data) { + return request({ + url: '/system/mail-template/update', + method: 'put', + data: data + }) +} + +// 删除邮件模版 +export function deleteMailTemplate(id) { + return request({ + url: '/system/mail-template/delete?id=' + id, + method: 'delete' + }) +} + +// 获得邮件模版 +export function getMailTemplate(id) { + return request({ + url: '/system/mail-template/get?id=' + id, + method: 'get' + }) +} + +// 获得邮件模版分页 +export function getMailTemplatePage(query) { + return request({ + url: '/system/mail-template/page', + method: 'get', + params: query + }) +} diff --git a/yudao-ui-admin/src/views/system/mail/account/index.vue b/yudao-ui-admin/src/views/system/mail/account/index.vue index f3821d8bc..96e3cc461 100755 --- a/yudao-ui-admin/src/views/system/mail/account/index.vue +++ b/yudao-ui-admin/src/views/system/mail/account/index.vue @@ -29,8 +29,8 @@ - - + +