فهرست منبع

邮箱模块:完善 template 模版的增删改查功能

YunaiV 2 سال پیش
والد
کامیت
ea39dcc5c8
22فایلهای تغییر یافته به همراه542 افزوده شده و 191 حذف شده
  1. 4 4
      yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
  2. 14 21
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailTemplateController.java
  3. 4 4
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountBaseVO.java
  4. 1 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java
  5. 22 19
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateBaseVO.java
  6. 1 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateCreateReqVO.java
  7. 16 17
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplatePageReqVO.java
  8. 24 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java
  9. 17 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java
  10. 2 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateUpdateReqVO.java
  11. 6 5
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailTemplateConvert.java
  12. 2 2
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailAccountDO.java
  13. 11 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java
  14. 5 1
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailTemplateDO.java
  15. 11 22
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailTemplateMapper.java
  16. 18 18
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java
  17. 50 62
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java
  18. 3 0
      yudao-server/src/main/resources/application.yaml
  19. 8 0
      yudao-ui-admin/src/api/system/mail/account.js
  20. 44 0
      yudao-ui-admin/src/api/system/mail/template.js
  21. 10 10
      yudao-ui-admin/src/views/system/mail/account/index.vue
  22. 269 0
      yudao-ui-admin/src/views/system/mail/template/index.vue

+ 4 - 4
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 优化
 
 }

+ 14 - 21
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<Long> 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<Boolean> 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<Boolean> deleteMailTemplate(@Valid @RequestBody Long id) {
-        mailTempleService.delete(id);
+    public CommonResult<Boolean> 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<MailTemplateRespVO> 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<PageResult<MailTemplateRespVO>> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) {
         PageResult<MailTemplateDO> pageResult = mailTempleService.getMailTemplatePage(pageReqVO);
@@ -73,11 +68,9 @@ public class MailTemplateController {
     }
 
     @GetMapping("/list-all-simple")
-    @ApiOperation(value = "获得邮模版精简列表")
-    public CommonResult<List<MailTemplateRespVO>> getSimpleTemplateList() {
+    @ApiOperation(value = "获得邮模版精简列表")
+    public CommonResult<List<MailTemplateSimpleRespVO>> getSimpleTemplateList() {
         List<MailTemplateDO> list = mailTempleService.getMailTemplateList();
-        // 排序后,返回给前端
-        list.sort(Comparator.comparing(MailTemplateDO::getId));
         return success(MailTemplateConvert.INSTANCE.convertList02(list));
     }
 }

+ 4 - 4
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")

+ 1 - 1
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")

+ 22 - 19
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;
+
 }

+ 1 - 2
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 {
 
-
 }

+ 16 - 17
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(value = "状态", example = "1", notes = "参见 CommonStatusEnum 枚举")
+    private Integer status;
 
-    @ApiModelProperty("标识")
+    @ApiModelProperty(value = "标识", example = "code_1024", notes = "模糊匹配")
     private String code;
 
-    @ApiModelProperty("发件人")
-    private String username;
-
-    @ApiModelProperty("标题")
-    private String title;
+    @ApiModelProperty(value = "名称", example = "芋头", notes = "模糊匹配")
+    private String name;
 
-    @ApiModelProperty("内容")
-    private String content;
+    @ApiModelProperty(value = "账号编号", example = "2048")
+    private Long accountId;
 
-    @ApiModelProperty("状态")
-    private Integer status;
+    @ApiModelProperty(value = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
 
-    @ApiModelProperty("备注")
-    private String remark;
 }

+ 24 - 1
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<String> params;
+
+    @ApiModelProperty(value = "创建时间", required = true)
+    private LocalDateTime createTime;
+
 }

+ 17 - 0
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;
+
+}

+ 2 - 1
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;
+
 }

+ 6 - 5
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<MailTemplateRespVO> convertPage(PageResult<MailTemplateDO> pageResult);
 
-    List<MailTemplateRespVO> convertList02(List<MailTemplateDO> list);
+    List<MailTemplateSimpleRespVO> convertList02(List<MailTemplateDO> list);
 
 }

+ 2 - 2
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;
     /**

+ 11 - 1
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;
     /**
      * 模版内容
      *

+ 5 - 1
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;
     /**
      * 标题
      */

+ 11 - 22
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<MailTemplateDO> {
 
     default PageResult<MailTemplateDO> selectPage(MailTemplatePageReqVO pageReqVO){
-        return selectPage(pageReqVO , new QueryWrapperX<MailTemplateDO>()
-                .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<MailTemplateDO>()
-                .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<MailTemplateDO>()
-                .eqIfPresent("account_id" , accountId));
+        return selectPage(pageReqVO , new LambdaQueryWrapperX<MailTemplateDO>()
+                .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);
+    }
+
 }

+ 18 - 18
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<MailTemplateDO> getMailTemplatePage(MailTemplatePageReqVO pageReqVO);
 
     /**
-     * 获取邮模板数组
+     * 获取邮模板数组
      *
      * @return 模版数组
      */
     List<MailTemplateDO> getMailTemplateList();
 
     /**
-     * 从缓存中获取邮模版
+     * 从缓存中获取邮模版
      *
      * @param code 模板编码
-     * @return 邮模板
+     * @return 邮模板
      */
     MailTemplateDO getMailTemplateByCodeFromCache(String code);
 
     /**
      * 邮件模版内容合成
      *
-     * @param content 邮模版
+     * @param content 邮模版
      * @param params 合成参数
      * @return 格式化后的内容
      */
     String formatMailTemplateContent(String content, Map<String, String> params);
 
     /**
-     * 获得指定邮账号下的邮件模板数量
+     * 获得指定邮账号下的邮件模板数量
      *
      * @param accountId 账号编号
      * @return 数量

+ 50 - 62
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<Long, MailTemplateDO> mailTemplateCache;
+    private volatile Map<String, MailTemplateDO> mailTemplateCache;
 
     @Override
     @PostConstruct
     public void initLocalCache() {
-        if (true) {
-            return;
-        }
-        List<MailTemplateDO> mailTemplateDOList = this.loadMailTemplateIfUpdate(null);
-        if (CollUtil.isEmpty(mailTemplateDOList)) {
-            return;
-        }
+        // 第一步:查询数据
+        List<MailTemplateDO> 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
+    public void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO) {
+        // 校验是否存在
+        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 delete(Long id) {
+    public void deleteMailTemplate(Long id) {
         // 校验是否存在
-        this.validateMailTemplateExists(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<MailTemplateDO> 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);

+ 3 - 0
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

+ 8 - 0
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',
+  })
+}

+ 44 - 0
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
+  })
+}

+ 10 - 10
yudao-ui-admin/src/views/system/mail/account/index.vue

@@ -29,8 +29,8 @@
       <el-table-column label="主键" align="center" prop="id" />
       <el-table-column label="邮箱" align="center" prop="mail" />
       <el-table-column label="用户名" align="center" prop="username" />
-      <el-table-column label="主机" align="center" prop="host" />
-      <el-table-column label="端口" align="center" prop="port" />
+      <el-table-column label="SMTP 服务器域名" align="center" prop="host" />
+      <el-table-column label="SMTP 服务器端口" align="center" prop="port" />
       <el-table-column label="是否开启 SSL" align="center" prop="sslEnable">
         <template v-slot="scope">
           <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.sslEnable" />
@@ -56,7 +56,7 @@
 
     <!-- 对话框(添加 / 修改) -->
     <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="140px">
         <el-form-item label="邮箱" prop="mail">
           <el-input v-model="form.mail" placeholder="请输入邮箱" />
         </el-form-item>
@@ -66,11 +66,11 @@
         <el-form-item label="密码" prop="password">
           <el-input v-model="form.password" placeholder="请输入密码" />
         </el-form-item>
-        <el-form-item label="主机" prop="host">
-          <el-input v-model="form.host" placeholder="请输入主机" />
+        <el-form-item label="SMTP 服务器域名" prop="host">
+          <el-input v-model="form.host" placeholder="请输入 SMTP 服务器域名" />
         </el-form-item>
-        <el-form-item label="端口" prop="port">
-          <el-input v-model="form.port" placeholder="请输入端口" />
+        <el-form-item label="SMTP 服务器端口" prop="port">
+          <el-input v-model="form.port" placeholder="请输入 SMTP 服务器端口" />
         </el-form-item>
         <el-form-item label="是否开启 SSL" prop="sslEnable">
           <el-radio-group v-model="form.sslEnable">
@@ -124,10 +124,10 @@ export default {
         mail: [{ required: true, message: "邮箱不能为空", trigger: "blur" }],
         username: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
         password: [{ required: true, message: "密码不能为空", trigger: "blur" }],
-        host: [{ required: true, message: "主机不能为空", trigger: "blur" }],
-        port: [{ required: true, message: "端口不能为空", trigger: "blur" }],
+        host: [{ required: true, message: "SMTP 服务器域名不能为空", trigger: "blur" }],
+        port: [{ required: true, message: "SMTP 服务器端口不能为空", trigger: "blur" }],
         sslEnable: [{ required: true, message: "是否开启 SSL不能为空", trigger: "blur" }],
-      }
+      },
     };
   },
   created() {

+ 269 - 0
yudao-ui-admin/src/views/system/mail/template/index.vue

@@ -0,0 +1,269 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="模板名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入模板名称" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="模板编码" prop="code">
+        <el-input v-model="queryParams.code" placeholder="请输入模板编码" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="邮箱账号" prop="accountId">
+        <el-select v-model="queryParams.accountId" placeholder="请输入邮箱账号" clearable>
+          <el-option v-for="account in accountOptions" :key="account.id" :value="account.id" :label="account.mail" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="开启状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择开启状态" clearable size="small">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
+                     :key="dict.value" :label="dict.label" :value="dict.value"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['system:mail-template:create']">新增</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="模板编码" align="center" prop="code" />
+      <el-table-column label="模板名称" align="center" prop="name" />
+      <el-table-column label="模板标题" align="center" prop="title" />
+      <el-table-column label="邮箱账号" align="center" prop="accountId">
+        <template v-slot="scope">
+          {{ accountOptions.find(account => account.id === scope.row.accountId)?.mail }}
+        </template>
+      </el-table-column>
+      <el-table-column label="发送人名称" align="center" prop="nickname" />
+      <el-table-column label="开启状态" align="center" prop="status">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['system:mail-template:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['system:mail-template:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"/>
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="600px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="模板名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入模板名称" />
+        </el-form-item>
+        <el-form-item label="模板编码" prop="code">
+          <el-input v-model="form.code" placeholder="请输入模板编码" />
+        </el-form-item>
+        <el-form-item label="邮箱账号" prop="accountId">
+          <el-select v-model="form.accountId" placeholder="请输入邮箱账号">
+            <el-option v-for="account in accountOptions" :key="account.id" :value="account.id" :label="account.mail" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="发送人名称" prop="nickname">
+          <el-input v-model="form.nickname" placeholder="请输入发送人名称" />
+        </el-form-item>
+        <el-form-item label="模板标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入模板标题" />
+        </el-form-item>
+        <el-form-item label="模板内容">
+          <editor v-model="form.content" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="开启状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
+                      :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { createMailTemplate, updateMailTemplate, deleteMailTemplate, getMailTemplate, getMailTemplatePage } from "@/api/system/mail/template";
+import Editor from '@/components/Editor';
+import { CommonStatusEnum } from "@/utils/constants";
+import { getSimpleMailAccountList } from "@/api/system/mail/account";
+
+export default {
+  name: "MailTemplate",
+  components: {
+    Editor,
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 邮件模版列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        name: null,
+        code: null,
+        accountId: null,
+        status: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [{ required: true, message: "模板名称不能为空", trigger: "blur" }],
+        code: [{ required: true, message: "模板编码不能为空", trigger: "blur" }],
+        accountId: [{ required: true, message: "邮箱账号不能为空", trigger: "blur" }],
+        title: [{ required: true, message: "模板标题不能为空", trigger: "blur" }],
+        content: [{ required: true, message: "模板内容不能为空", trigger: "blur" }],
+        status: [{ required: true, message: "开启状态不能为空", trigger: "blur" }],
+      },
+      // 邮箱账号
+      accountOptions: []
+    };
+  },
+  created() {
+    this.getList();
+    // 获得邮箱账号列表
+    getSimpleMailAccountList().then(response => {
+      this.accountOptions = response.data
+    })
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getMailTemplatePage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        code: undefined,
+        accountId: undefined,
+        nickname: undefined,
+        title: undefined,
+        content: undefined,
+        status: CommonStatusEnum.ENABLE,
+        remark: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加邮件模版";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getMailTemplate(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改邮件模版";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateMailTemplate(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createMailTemplate(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除邮件模版编号为"' + id + '"的数据项?').then(function() {
+          return deleteMailTemplate(id);
+        }).then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        }).catch(() => {});
+    }
+  }
+};
+</script>