Commit ea39dcc5c803ffd0a569243cb2a678ebc0d04b1b

Authored by YunaiV
1 parent 0262fa5c

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

Showing 22 changed files with 542 additions and 191 deletions
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 {
145 145 ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002023000, "邮箱账号不存在");
146 146 ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002023001, "无法删除,该邮箱账号还有邮件模板");
147 147  
148   - // ========== 邮箱模版 1002021000 ==========
149   - ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002021000, "邮箱模版不存在");
150   - ErrorCode MAIL_TEMPLATE_EXISTS = new ErrorCode(1002021001, "邮箱模版存在");
151   - ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失");
  148 + // ========== 邮箱模版 1002024000 ==========
  149 + ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002024000, "邮件模版不存在");
  150 + ErrorCode MAIL_TEMPLATE_CODE_EXISTS = new ErrorCode(1002024001, "邮件模版 code({}) 已存在");
  151 + ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); // TODO 优化
152 152  
153 153 }
... ...
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;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.send.MailReqVO;
6 5 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*;
7 6 import cn.iocoder.yudao.module.system.convert.mail.MailTemplateConvert;
8 7 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
... ... @@ -10,13 +9,11 @@ import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
10 9 import io.swagger.annotations.Api;
11 10 import io.swagger.annotations.ApiImplicitParam;
12 11 import io.swagger.annotations.ApiOperation;
13   -import org.springframework.beans.factory.annotation.Autowired;
14 12 import org.springframework.security.access.prepost.PreAuthorize;
15 13 import org.springframework.web.bind.annotation.*;
16 14  
  15 +import javax.annotation.Resource;
17 16 import javax.validation.Valid;
18   -
19   -import java.util.Comparator;
20 17 import java.util.List;
21 18  
22 19 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
... ... @@ -26,37 +23,35 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26 23 @RequestMapping("/system/mail-template")
27 24 public class MailTemplateController {
28 25  
29   - // TODO @wangjingyi:private DONE
30   - @Autowired
  26 + @Resource
31 27 private MailTemplateService mailTempleService;
32 28  
33 29 @PostMapping("/create")
34   - @ApiOperation("创建邮箱模版")
  30 + @ApiOperation("创建邮件模版")
35 31 @PreAuthorize("@ss.hasPermission('system:mail-template:create')")
36 32 public CommonResult<Long> createMailTemplate(@Valid @RequestBody MailTemplateCreateReqVO createReqVO){
37   - return success(mailTempleService.create(createReqVO));
  33 + return success(mailTempleService.createMailTemplate(createReqVO));
38 34 }
39 35  
40 36 @PutMapping("/update")
41   - @ApiOperation("修改邮箱模版")
  37 + @ApiOperation("修改邮件模版")
42 38 @PreAuthorize("@ss.hasPermission('system:mail-template:update')")
43 39 public CommonResult<Boolean> updateMailTemplate(@Valid @RequestBody MailTemplateUpdateReqVO updateReqVO){
44   - mailTempleService.update(updateReqVO);
  40 + mailTempleService.updateMailTemplate(updateReqVO);
45 41 return success(true);
46 42 }
47 43  
48 44 @DeleteMapping("/delete")
49   - @ApiOperation("删除邮箱模版")
  45 + @ApiOperation("删除邮件模版")
  46 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
50 47 @PreAuthorize("@ss.hasPermission('system:mail-template:delete')")
51   - public CommonResult<Boolean> deleteMailTemplate(@Valid @RequestBody Long id) {
52   - mailTempleService.delete(id);
  48 + public CommonResult<Boolean> deleteMailTemplate(@RequestParam("id") Long id) {
  49 + mailTempleService.deleteMailTemplate(id);
53 50 return success(true);
54 51 }
55 52  
56   - // TODO @wangjingyi:下面几个 VO 也参考我在 account 给的建议 DONE RespVO中需要BaseVO 中哪些字段
57   -
58 53 @GetMapping("/get")
59   - @ApiOperation("获得邮箱模版")
  54 + @ApiOperation("获得邮件模版")
60 55 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
61 56 @PreAuthorize("@ss.hasPermission('system:mail-template:get')")
62 57 public CommonResult<MailTemplateRespVO> getMailTemplate(@RequestParam("id") Long id) {
... ... @@ -65,7 +60,7 @@ public class MailTemplateController {
65 60 }
66 61  
67 62 @GetMapping("/page")
68   - @ApiOperation("获得邮箱模版分页")
  63 + @ApiOperation("获得邮件模版分页")
69 64 @PreAuthorize("@ss.hasPermission('system:mail-template:query')")
70 65 public CommonResult<PageResult<MailTemplateRespVO>> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) {
71 66 PageResult<MailTemplateDO> pageResult = mailTempleService.getMailTemplatePage(pageReqVO);
... ... @@ -73,11 +68,9 @@ public class MailTemplateController {
73 68 }
74 69  
75 70 @GetMapping("/list-all-simple")
76   - @ApiOperation(value = "获得邮箱模版精简列表")
77   - public CommonResult<List<MailTemplateRespVO>> getSimpleTemplateList() {
  71 + @ApiOperation(value = "获得邮件模版精简列表")
  72 + public CommonResult<List<MailTemplateSimpleRespVO>> getSimpleTemplateList() {
78 73 List<MailTemplateDO> list = mailTempleService.getMailTemplateList();
79   - // 排序后,返回给前端
80   - list.sort(Comparator.comparing(MailTemplateDO::getId));
81 74 return success(MailTemplateConvert.INSTANCE.convertList02(list));
82 75 }
83 76 }
... ...
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 {
26 26 @NotNull(message = "密码必填")
27 27 private String password;
28 28  
29   - @ApiModelProperty(value = "网站", required = true, example = "www.iocoder.cn")
30   - @NotNull(message = "网站不能为空")
  29 + @ApiModelProperty(value = "SMTP 服务器域名", required = true, example = "www.iocoder.cn")
  30 + @NotNull(message = "SMTP 服务器域名不能为空")
31 31 private String host;
32 32  
33   - @ApiModelProperty(value = "端口", required = true, example = "80")
34   - @NotNull(message = "端口不能为空")
  33 + @ApiModelProperty(value = "SMTP 服务器端口", required = true, example = "80")
  34 + @NotNull(message = "SMTP 服务器端口不能为空")
35 35 private Integer port;
36 36  
37 37 @ApiModelProperty(value = "是否开启 ssl", required = true, example = "true")
... ...
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;
8 8 @Data
9 9 public class MailAccountSimpleRespVO {
10 10  
11   - @ApiModelProperty(value = "邮箱比那好", required = true, example = "1024")
  11 + @ApiModelProperty(value = "邮箱编号", required = true, example = "1024")
12 12 private Long id;
13 13  
14 14 @ApiModelProperty(value = "邮箱", required = true, example = "768541388@qq.com")
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateBaseVO.java
1 1 package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template;
2 2  
3   -import io.swagger.annotations.ApiModel;
  3 +import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO;
4 4 import io.swagger.annotations.ApiModelProperty;
5 5 import lombok.Data;
6 6  
7   -import javax.validation.constraints.Email;
  7 +import javax.validation.constraints.NotEmpty;
8 8 import javax.validation.constraints.NotNull;
9 9  
10   -@ApiModel("管理后台 - 邮箱模版基类 Base VO")
  10 +/**
  11 + * 邮件模版 Base VO,提供给添加、修改、详细的子 VO 使用
  12 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  13 + */
11 14 @Data
12 15 public class MailTemplateBaseVO {
13   - @ApiModelProperty("主键")
14   - @NotNull(message = "主键不能为空")
15   - private Long id;
16 16  
17   - @ApiModelProperty("名称")
  17 + @ApiModelProperty(value = "模版名称", required = true, example = "测试名字")
18 18 @NotNull(message = "名称不能为空")
19 19 private String name;
20 20  
21   - @ApiModelProperty("标识")
22   - @NotNull(message = "邮箱模版code不能为空")
  21 + @ApiModelProperty(value = "模版编号", required = true, example = "test")
  22 + @NotNull(message = "模版编号不能为空")
23 23 private String code;
24 24  
25   - @ApiModelProperty("发件人")
26   - @NotNull(message = "发件人不能为空")
27   - @Email(message = "发件人格式有误")
28   - private String username;
  25 + @ApiModelProperty(value = "发送的邮箱账号编号", required = true, example = "1")
  26 + @NotNull(message = "发送的邮箱账号编号不能为空")
  27 + private Long accountId;
29 28  
30   - @ApiModelProperty("标题")
31   - @NotNull(message = "标题不能为空")
  29 + @ApiModelProperty(value = "发送人名称", example = "芋头")
  30 + private String nickname;
  31 +
  32 + @ApiModelProperty(value = "标题", required = true, example = "注册成功")
  33 + @NotEmpty(message = "标题不能为空")
32 34 private String title;
33 35  
34   - @ApiModelProperty("内容")
35   - @NotNull(message = "内容不能为空")
  36 + @ApiModelProperty(value = "内容", required = true, example = "你好,注册成功啦")
  37 + @NotEmpty(message = "内容不能为空")
36 38 private String content;
37 39  
38   - @ApiModelProperty("状态")
  40 + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
39 41 @NotNull(message = "状态不能为空")
40 42 private Integer status;
41 43  
42   - @ApiModelProperty("备注")
  44 + @ApiModelProperty(value = "备注", example = "奥特曼")
43 45 private String remark;
  46 +
44 47 }
... ...
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;
5 5 import lombok.EqualsAndHashCode;
6 6 import lombok.ToString;
7 7  
8   -@ApiModel("管理后台 - 邮箱模版创建 Request VO")
  8 +@ApiModel("管理后台 - 邮件模版创建 Request VO")
9 9 @Data
10 10 @EqualsAndHashCode(callSuper = true)
11 11 @ToString(callSuper = true)
12 12 public class MailTemplateCreateReqVO extends MailTemplateBaseVO {
13 13  
14   -
15 14 }
... ...
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;
6 6 import lombok.Data;
7 7 import lombok.EqualsAndHashCode;
8 8 import lombok.ToString;
  9 +import org.springframework.format.annotation.DateTimeFormat;
9 10  
10   -@ApiModel("管理后台 - 邮箱模版分页 Request VO")
  11 +import java.time.LocalDateTime;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  14 +
  15 +@ApiModel("管理后台 - 邮件模版分页 Request VO")
11 16 @Data
12 17 @EqualsAndHashCode(callSuper = true)
13 18 @ToString(callSuper = true)
14 19 public class MailTemplatePageReqVO extends PageParam {
15   - @ApiModelProperty("主键")
16   - private Long id;
17 20  
18   - @ApiModelProperty("名称")
19   - private String name;
  21 + @ApiModelProperty(value = "状态", example = "1", notes = "参见 CommonStatusEnum 枚举")
  22 + private Integer status;
20 23  
21   - @ApiModelProperty("标识")
  24 + @ApiModelProperty(value = "标识", example = "code_1024", notes = "模糊匹配")
22 25 private String code;
23 26  
24   - @ApiModelProperty("发件人")
25   - private String username;
26   -
27   - @ApiModelProperty("标题")
28   - private String title;
  27 + @ApiModelProperty(value = "名称", example = "芋头", notes = "模糊匹配")
  28 + private String name;
29 29  
30   - @ApiModelProperty("内容")
31   - private String content;
  30 + @ApiModelProperty(value = "账号编号", example = "2048")
  31 + private Long accountId;
32 32  
33   - @ApiModelProperty("状态")
34   - private Integer status;
  33 + @ApiModelProperty(value = "创建时间")
  34 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  35 + private LocalDateTime[] createTime;
35 36  
36   - @ApiModelProperty("备注")
37   - private String remark;
38 37 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateRespVO.java
1 1 package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template;
2 2  
3   -public class MailTemplateRespVO extends MailTemplateBaseVO{
  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.time.LocalDateTime;
  10 +import java.util.List;
  11 +
  12 +@ApiModel("管理后台 - 邮件末班 Response VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class MailTemplateRespVO extends MailTemplateBaseVO {
  17 +
  18 + @ApiModelProperty(value = "编号", required = true, example = "1024")
  19 + private Long id;
  20 +
  21 + @ApiModelProperty(value = "参数数组", example = "name,code")
  22 + private List<String> params;
  23 +
  24 + @ApiModelProperty(value = "创建时间", required = true)
  25 + private LocalDateTime createTime;
  26 +
4 27 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/template/MailTemplateSimpleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +
  7 +@ApiModel("管理后台 - 邮件模版的精简 Response VO")
  8 +@Data
  9 +public class MailTemplateSimpleRespVO {
  10 +
  11 + @ApiModelProperty(value = "模版编号", required = true, example = "1024")
  12 + private Long id;
  13 +
  14 + @ApiModelProperty(value = "模版名字", required = true, example = "哒哒哒")
  15 + private String name;
  16 +
  17 +}
... ...
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;
8 8  
9 9 import javax.validation.constraints.NotNull;
10 10  
11   -@ApiModel("管理后台 - 邮箱模版修改 Request VO")
  11 +@ApiModel("管理后台 - 邮件模版修改 Request VO")
12 12 @Data
13 13 @EqualsAndHashCode(callSuper = true)
14 14 @ToString(callSuper = true)
... ... @@ -17,4 +17,5 @@ public class MailTemplateUpdateReqVO extends MailTemplateBaseVO {
17 17 @ApiModelProperty(value = "编号", required = true, example = "1024")
18 18 @NotNull(message = "编号不能为空")
19 19 private Long id;
  20 +
20 21 }
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailTemplateConvert.java
1 1 package cn.iocoder.yudao.module.system.convert.mail;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateBaseVO;
5   -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateRespVO;
  4 +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*;
6 5 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
7 6 import org.mapstruct.Mapper;
8 7 import org.mapstruct.factory.Mappers;
... ... @@ -14,12 +13,14 @@ public interface MailTemplateConvert {
14 13  
15 14 MailTemplateConvert INSTANCE = Mappers.getMapper(MailTemplateConvert.class);
16 15  
17   - MailTemplateDO convert(MailTemplateBaseVO baseVO);
  16 + MailTemplateDO convert(MailTemplateUpdateReqVO bean);
18 17  
19   - MailTemplateRespVO convert(MailTemplateDO mailTemplateDO);
  18 + MailTemplateDO convert(MailTemplateCreateReqVO bean);
  19 +
  20 + MailTemplateRespVO convert(MailTemplateDO bean);
20 21  
21 22 PageResult<MailTemplateRespVO> convertPage(PageResult<MailTemplateDO> pageResult);
22 23  
23   - List<MailTemplateRespVO> convertList02(List<MailTemplateDO> list);
  24 + List<MailTemplateSimpleRespVO> convertList02(List<MailTemplateDO> list);
24 25  
25 26 }
... ...
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 {
36 36 */
37 37 private String password;
38 38 /**
39   - * 主机
  39 + * SMTP 服务器域名
40 40 */
41 41 private String host;
42 42 /**
43   - * 端口
  43 + * SMTP 服务器端口
44 44 */
45 45 private Integer port;
46 46 /**
... ...
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java
... ... @@ -69,12 +69,22 @@ public class MailLogDO extends BaseDO implements Serializable {
69 69 */
70 70 private Long templateId;
71 71 /**
72   - * 末班编码
  72 + * 模版编码
73 73 *
74 74 * 冗余 {@link MailTemplateDO#getCode()}
75 75 */
76 76 private String templateCode;
77 77 /**
  78 + * 模版发送人名称
  79 + *
  80 + * 冗余 {@link MailTemplateDO#getNickname()}
  81 + */
  82 + private String templateNickname;
  83 + /**
  84 + * 模版标题
  85 + */
  86 + private String templateTitle;
  87 + /**
78 88 * 模版内容
79 89 *
80 90 * 基于 {@link MailTemplateDO#getContent()} 格式化后的内容
... ...
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;
11 11 import java.util.List;
12 12  
13 13 /**
14   - * 邮箱模版 DO
  14 + * 邮件模版 DO
15 15 *
16 16 * @author wangjingyi
17 17 * @since 2022-03-21
... ... @@ -41,6 +41,10 @@ public class MailTemplateDO extends BaseDO {
41 41 private Long accountId;
42 42  
43 43 /**
  44 + * 发送人名称
  45 + */
  46 + private String nickname;
  47 + /**
44 48 * 标题
45 49 */
46 50 private String title;
... ...
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;
2 2  
3 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 7 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
7 8 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
... ... @@ -11,36 +12,24 @@ import org.apache.ibatis.annotations.Select;
11 12  
12 13 import java.util.Date;
13 14  
14   -
15 15 @Mapper
16 16 public interface MailTemplateMapper extends BaseMapperX<MailTemplateDO> {
17 17  
18 18 default PageResult<MailTemplateDO> selectPage(MailTemplatePageReqVO pageReqVO){
19   - return selectPage(pageReqVO , new QueryWrapperX<MailTemplateDO>()
20   - .likeIfPresent("name" , pageReqVO.getName())
21   - .likeIfPresent("username" , pageReqVO.getUsername())
22   - .likeIfPresent("title" , pageReqVO.getTitle())
23   - .likeIfPresent("content" , pageReqVO.getContent())
24   - .eqIfPresent("status" , pageReqVO.getStatus())
25   - .likeIfPresent("remark" , pageReqVO.getRemark())
26   - );
27   - }
28   -
29   - default MailTemplateDO selectOneByCode(String code){
30   - return selectOne(new QueryWrapperX<MailTemplateDO>()
31   - .eqIfPresent("code" , code));
32   - };
33   -
34   - @Select("SELECT COUNT(*) FROM system_mail_template WHERE update_time > #{maxUpdateTime} LIMIT 1")
35   - Long selectByMaxUpdateTime(Date maxUpdateTime);
36   -
37   - default MailTemplateDO selectOneByAccountId(Long accountId){
38   - return selectOne(new QueryWrapperX<MailTemplateDO>()
39   - .eqIfPresent("account_id" , accountId));
  19 + return selectPage(pageReqVO , new LambdaQueryWrapperX<MailTemplateDO>()
  20 + .eqIfPresent(MailTemplateDO::getStatus, pageReqVO.getStatus())
  21 + .likeIfPresent(MailTemplateDO::getCode, pageReqVO.getCode())
  22 + .likeIfPresent(MailTemplateDO::getName, pageReqVO.getName())
  23 + .eqIfPresent(MailTemplateDO::getAccountId, pageReqVO.getAccountId())
  24 + .betweenIfPresent(MailTemplateDO::getCreateTime, pageReqVO.getCreateTime()));
40 25 }
41 26  
42 27 default Long selectCountByAccountId(Long accountId) {
43 28 return selectCount(MailTemplateDO::getAccountId, accountId);
44 29 }
45 30  
  31 + default MailTemplateDO selectByCode(String code) {
  32 + return selectOne(MailTemplateDO::getCode, code);
  33 + }
  34 +
46 35 }
... ...
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;
11 11 import java.util.Map;
12 12  
13 13 /**
14   - * 邮箱模版服务类
  14 + * 邮件模版 Service 接口
15 15 *
16 16 * @author wangjingyi
17 17 * @since 2022-03-21
... ... @@ -19,34 +19,34 @@ import java.util.Map;
19 19 public interface MailTemplateService {
20 20  
21 21 /**
22   - * 初始化邮箱模版的本地缓存
  22 + * 初始化邮件模版的本地缓存
23 23 */
24 24 void initLocalCache();
25 25  
26 26 /**
27   - * 邮箱模版创建
  27 + * 邮件模版创建
28 28 *
29   - * @param createReqVO 邮箱信息
  29 + * @param createReqVO 邮件信息
30 30 * @return 编号
31 31 */
32   - Long create(@Valid MailTemplateCreateReqVO createReqVO);
  32 + Long createMailTemplate(@Valid MailTemplateCreateReqVO createReqVO);
33 33  
34 34 /**
35   - * 邮箱模版修改
  35 + * 邮件模版修改
36 36 *
37   - * @param updateReqVO 邮箱信息
  37 + * @param updateReqVO 邮件信息
38 38 */
39   - void update(@Valid MailTemplateUpdateReqVO updateReqVO);
  39 + void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO);
40 40  
41 41 /**
42   - * 邮箱模版删除
  42 + * 邮件模版删除
43 43 *
44 44 * @param id 编号
45 45 */
46   - void delete(Long id);
  46 + void deleteMailTemplate(Long id);
47 47  
48 48 /**
49   - * 获取邮箱模版
  49 + * 获取邮件模版
50 50 *
51 51 * @param id 编号
52 52 * @return 邮件模版
... ... @@ -54,39 +54,39 @@ public interface MailTemplateService {
54 54 MailTemplateDO getMailTemplate(Long id);
55 55  
56 56 /**
57   - * 获取邮箱模版分页
  57 + * 获取邮件模版分页
58 58 *
59 59 * @param pageReqVO 模版信息
60   - * @return 邮箱模版分页信息
  60 + * @return 邮件模版分页信息
61 61 */
62 62 PageResult<MailTemplateDO> getMailTemplatePage(MailTemplatePageReqVO pageReqVO);
63 63  
64 64 /**
65   - * 获取邮箱模板数组
  65 + * 获取邮件模板数组
66 66 *
67 67 * @return 模版数组
68 68 */
69 69 List<MailTemplateDO> getMailTemplateList();
70 70  
71 71 /**
72   - * 从缓存中获取邮箱模版
  72 + * 从缓存中获取邮件模版
73 73 *
74 74 * @param code 模板编码
75   - * @return 邮箱模板
  75 + * @return 邮件模板
76 76 */
77 77 MailTemplateDO getMailTemplateByCodeFromCache(String code);
78 78  
79 79 /**
80 80 * 邮件模版内容合成
81 81 *
82   - * @param content 邮箱模版
  82 + * @param content 邮件模版
83 83 * @param params 合成参数
84 84 * @return 格式化后的内容
85 85 */
86 86 String formatMailTemplateContent(String content, Map<String, String> params);
87 87  
88 88 /**
89   - * 获得指定邮箱账号下的邮件模板数量
  89 + * 获得指定邮件账号下的邮件模板数量
90 90 *
91 91 * @param accountId 账号编号
92 92 * @return 数量
... ...
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;
2 2  
3 3  
4 4 import cn.hutool.core.collection.CollUtil;
  5 +import cn.hutool.core.util.ObjUtil;
5 6 import cn.hutool.core.util.StrUtil;
6 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 8 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  9 +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
8 10 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO;
9 11 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
10 12 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;
13 15 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper;
14 16 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
15 17 import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
  18 +import com.google.common.annotations.VisibleForTesting;
16 19 import lombok.extern.slf4j.Slf4j;
17 20 import org.springframework.stereotype.Service;
18 21 import org.springframework.validation.annotation.Validated;
... ... @@ -25,8 +28,8 @@ import java.util.List;
25 28 import java.util.Map;
26 29  
27 30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28   -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_EXISTS;
29   -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS;
  31 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
  32 +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
30 33  
31 34 /**
32 35 * 邮箱模版 Service 实现类
... ... @@ -47,56 +50,71 @@ public class MailTemplateServiceImpl implements MailTemplateService {
47 50  
48 51 /**
49 52 * 邮件模板缓存
50   - * key:邮箱模板编码 {@link MailTemplateDO#getId()}
  53 + * key:邮件模版标识 {@link MailTemplateDO#getCode()}
51 54 *
52 55 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
53 56 */
54   - private volatile Map<Long, MailTemplateDO> mailTemplateCache;
  57 + private volatile Map<String, MailTemplateDO> mailTemplateCache;
55 58  
56 59 @Override
57 60 @PostConstruct
58 61 public void initLocalCache() {
59   - if (true) {
60   - return;
61   - }
62   - List<MailTemplateDO> mailTemplateDOList = this.loadMailTemplateIfUpdate(null);
63   - if (CollUtil.isEmpty(mailTemplateDOList)) {
64   - return;
65   - }
  62 + // 第一步:查询数据
  63 + List<MailTemplateDO> templates = mailTemplateMapper.selectList();
  64 + log.info("[initLocalCache][缓存邮件模版,数量:{}]", templates.size());
66 65  
67   - // 写入缓存
68   - mailTemplateCache = CollectionUtils.convertMap(mailTemplateDOList, MailTemplateDO::getId);
69   - log.info("[initLocalCache][初始化 mailTemplate 数量为 {}]", mailTemplateDOList.size());
  66 + // 第二步:构建缓存
  67 + mailTemplateCache = convertMap(templates, MailTemplateDO::getCode);
70 68 }
71 69  
72 70 @Override
73   - public Long create(MailTemplateCreateReqVO createReqVO) {
74   - // 要校验存在
75   - validateMailTemplateExists(createReqVO.getId());
76   - MailTemplateDO mailTemplateDO = MailTemplateConvert.INSTANCE.convert(createReqVO);
77   - mailTemplateMapper.insert(mailTemplateDO);
78   - // TODO @wangjingyi:mq 更新 DONE
  71 + public Long createMailTemplate(MailTemplateCreateReqVO createReqVO) {
  72 + // 校验 code 是否唯一
  73 + validateCodeUnique(null, createReqVO.getCode());
  74 +
  75 + // 插入
  76 + MailTemplateDO template = MailTemplateConvert.INSTANCE.convert(createReqVO);
  77 + mailTemplateMapper.insert(template);
  78 + // 发送刷新消息
79 79 mailProducer.sendMailTemplateRefreshMessage();
80   - return mailTemplateDO.getId();
  80 + return template.getId();
81 81 }
82 82  
83 83 @Override
84   - public void update(@Valid MailTemplateUpdateReqVO updateReqVO) {
85   - // 校验是否唯一
86   - // TODO @wangjingyi:参考下我在 account 给的唯一校验的说明。DONE
87   - this.validateMailTemplateOnlyByCode(updateReqVO.getId(),updateReqVO.getCode());
88   - MailTemplateDO mailTemplateDO = MailTemplateConvert.INSTANCE.convert(updateReqVO);
89   - mailTemplateMapper.updateById(mailTemplateDO);
90   - // TODO @wangjingyi:mq 更新 DONE
  84 + public void updateMailTemplate(@Valid MailTemplateUpdateReqVO updateReqVO) {
  85 + // 校验是否存在
  86 + validateMailTemplateExists(updateReqVO.getId());
  87 + // 校验 code 是否唯一
  88 + validateCodeUnique(updateReqVO.getId(),updateReqVO.getCode());
  89 +
  90 + // 更新
  91 + MailTemplateDO updateObj = MailTemplateConvert.INSTANCE.convert(updateReqVO);
  92 + mailTemplateMapper.updateById(updateObj);
  93 + // 发送刷新消息
91 94 mailProducer.sendMailTemplateRefreshMessage();
92 95 }
93 96  
  97 + @VisibleForTesting
  98 + public void validateCodeUnique(Long id, String code) {
  99 + MailTemplateDO template = mailTemplateMapper.selectByCode(code);
  100 + if (template == null) {
  101 + return;
  102 + }
  103 + // 存在 template 记录的情况下
  104 + if (id == null // 新增时,说明重复
  105 + || ObjUtil.notEqual(id, template.getId())) { // 更新时,如果 id 不一致,说明重复
  106 + throw exception(MAIL_TEMPLATE_CODE_EXISTS);
  107 + }
  108 + }
  109 +
94 110 @Override
95   - public void delete(Long id) {
  111 + public void deleteMailTemplate(Long id) {
96 112 // 校验是否存在
97   - this.validateMailTemplateExists(id);
  113 + validateMailTemplateExists(id);
  114 +
  115 + // 删除
98 116 mailTemplateMapper.deleteById(id);
99   - // TODO @wangjingyi:mq 更新 DONE
  117 + // 发送刷新消息
100 118 mailProducer.sendMailTemplateRefreshMessage();
101 119 }
102 120  
... ... @@ -122,41 +140,11 @@ public class MailTemplateServiceImpl implements MailTemplateService {
122 140 }
123 141  
124 142 private void validateMailTemplateExists(Long id) {
125   - if (mailTemplateCache.get(id) == null) {
  143 + if (mailTemplateMapper.selectById(id) == null) {
126 144 throw exception(MAIL_TEMPLATE_NOT_EXISTS);
127 145 }
128 146 }
129 147  
130   - private void validateMailTemplateOnlyByCode(Long id ,String code){
131   - mailTemplateCache.forEach((key,value)->{
132   - if (value.getCode().equals(code)){
133   - if (!key.equals(id)){
134   - throw exception(MAIL_TEMPLATE_EXISTS);
135   - }
136   - }
137   - });
138   - }
139   - /**
140   - * 如果邮件模板发生变化,从数据库中获取最新的全量邮件模板。
141   - * 如果未发生变化,则返回空
142   - *
143   - * @param maxUpdateTime 当前邮件模板的最大更新时间
144   - * @return 邮件模板列表
145   - */
146   - private List<MailTemplateDO> loadMailTemplateIfUpdate(Date maxUpdateTime) {
147   - // 第一步,判断是否要更新。
148   - if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
149   - log.info("[loadMailTemplateIfUpdate][首次加载全量邮件模板]");
150   - } else { // 判断数据库中是否有更新的邮件模板
151   - if (mailTemplateMapper.selectByMaxUpdateTime(maxUpdateTime) == 0) {
152   - return null;
153   - }
154   - log.info("[loadSmsTemplateIfUpdate][增量加载全量邮件模板]");
155   - }
156   - // 第二步,如果有更新,则从数据库加载所有邮件模板
157   - return mailTemplateMapper.selectList();
158   - }
159   -
160 148 @Override
161 149 public long countByAccountId(Long accountId) {
162 150 return mailTemplateMapper.selectCountByAccountId(accountId);
... ...
yudao-server/src/main/resources/application.yaml
... ... @@ -138,6 +138,9 @@ yudao:
138 138 - system_sms_log
139 139 - system_sensitive_word
140 140 - system_oauth2_client
  141 + - system_mail_account
  142 + - system_mail_template
  143 + - system_mail_log
141 144 - infra_codegen_column
142 145 - infra_codegen_table
143 146 - infra_test_demo
... ...
yudao-ui-admin/src/api/system/mail/account.js
... ... @@ -42,3 +42,11 @@ export function getMailAccountPage(query) {
42 42 params: query
43 43 })
44 44 }
  45 +
  46 +// 获取邮箱账号的精简信息列表
  47 +export function getSimpleMailAccountList() {
  48 + return request({
  49 + url: '/system/mail-account/list-all-simple',
  50 + method: 'get',
  51 + })
  52 +}
... ...
yudao-ui-admin/src/api/system/mail/template.js 0 → 100755
  1 +import request from '@/utils/request'
  2 +
  3 +// 创建邮件模版
  4 +export function createMailTemplate(data) {
  5 + return request({
  6 + url: '/system/mail-template/create',
  7 + method: 'post',
  8 + data: data
  9 + })
  10 +}
  11 +
  12 +// 更新邮件模版
  13 +export function updateMailTemplate(data) {
  14 + return request({
  15 + url: '/system/mail-template/update',
  16 + method: 'put',
  17 + data: data
  18 + })
  19 +}
  20 +
  21 +// 删除邮件模版
  22 +export function deleteMailTemplate(id) {
  23 + return request({
  24 + url: '/system/mail-template/delete?id=' + id,
  25 + method: 'delete'
  26 + })
  27 +}
  28 +
  29 +// 获得邮件模版
  30 +export function getMailTemplate(id) {
  31 + return request({
  32 + url: '/system/mail-template/get?id=' + id,
  33 + method: 'get'
  34 + })
  35 +}
  36 +
  37 +// 获得邮件模版分页
  38 +export function getMailTemplatePage(query) {
  39 + return request({
  40 + url: '/system/mail-template/page',
  41 + method: 'get',
  42 + params: query
  43 + })
  44 +}
... ...
yudao-ui-admin/src/views/system/mail/account/index.vue
... ... @@ -29,8 +29,8 @@
29 29 <el-table-column label="主键" align="center" prop="id" />
30 30 <el-table-column label="邮箱" align="center" prop="mail" />
31 31 <el-table-column label="用户名" align="center" prop="username" />
32   - <el-table-column label="主机" align="center" prop="host" />
33   - <el-table-column label="端口" align="center" prop="port" />
  32 + <el-table-column label="SMTP 服务器域名" align="center" prop="host" />
  33 + <el-table-column label="SMTP 服务器端口" align="center" prop="port" />
34 34 <el-table-column label="是否开启 SSL" align="center" prop="sslEnable">
35 35 <template v-slot="scope">
36 36 <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.sslEnable" />
... ... @@ -56,7 +56,7 @@
56 56  
57 57 <!-- 对话框(添加 / 修改) -->
58 58 <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
59   - <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  59 + <el-form ref="form" :model="form" :rules="rules" label-width="140px">
60 60 <el-form-item label="邮箱" prop="mail">
61 61 <el-input v-model="form.mail" placeholder="请输入邮箱" />
62 62 </el-form-item>
... ... @@ -66,11 +66,11 @@
66 66 <el-form-item label="密码" prop="password">
67 67 <el-input v-model="form.password" placeholder="请输入密码" />
68 68 </el-form-item>
69   - <el-form-item label="主机" prop="host">
70   - <el-input v-model="form.host" placeholder="请输入主机" />
  69 + <el-form-item label="SMTP 服务器域名" prop="host">
  70 + <el-input v-model="form.host" placeholder="请输入 SMTP 服务器域名" />
71 71 </el-form-item>
72   - <el-form-item label="端口" prop="port">
73   - <el-input v-model="form.port" placeholder="请输入端口" />
  72 + <el-form-item label="SMTP 服务器端口" prop="port">
  73 + <el-input v-model="form.port" placeholder="请输入 SMTP 服务器端口" />
74 74 </el-form-item>
75 75 <el-form-item label="是否开启 SSL" prop="sslEnable">
76 76 <el-radio-group v-model="form.sslEnable">
... ... @@ -124,10 +124,10 @@ export default {
124 124 mail: [{ required: true, message: "邮箱不能为空", trigger: "blur" }],
125 125 username: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
126 126 password: [{ required: true, message: "密码不能为空", trigger: "blur" }],
127   - host: [{ required: true, message: "主机不能为空", trigger: "blur" }],
128   - port: [{ required: true, message: "端口不能为空", trigger: "blur" }],
  127 + host: [{ required: true, message: "SMTP 服务器域名不能为空", trigger: "blur" }],
  128 + port: [{ required: true, message: "SMTP 服务器端口不能为空", trigger: "blur" }],
129 129 sslEnable: [{ required: true, message: "是否开启 SSL不能为空", trigger: "blur" }],
130   - }
  130 + },
131 131 };
132 132 },
133 133 created() {
... ...
yudao-ui-admin/src/views/system/mail/template/index.vue 0 → 100755
  1 +<template>
  2 + <div class="app-container">
  3 +
  4 + <!-- 搜索工作栏 -->
  5 + <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  6 + <el-form-item label="模板名称" prop="name">
  7 + <el-input v-model="queryParams.name" placeholder="请输入模板名称" clearable @keyup.enter.native="handleQuery"/>
  8 + </el-form-item>
  9 + <el-form-item label="模板编码" prop="code">
  10 + <el-input v-model="queryParams.code" placeholder="请输入模板编码" clearable @keyup.enter.native="handleQuery"/>
  11 + </el-form-item>
  12 + <el-form-item label="邮箱账号" prop="accountId">
  13 + <el-select v-model="queryParams.accountId" placeholder="请输入邮箱账号" clearable>
  14 + <el-option v-for="account in accountOptions" :key="account.id" :value="account.id" :label="account.mail" />
  15 + </el-select>
  16 + </el-form-item>
  17 + <el-form-item label="开启状态" prop="status">
  18 + <el-select v-model="queryParams.status" placeholder="请选择开启状态" clearable size="small">
  19 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
  20 + :key="dict.value" :label="dict.label" :value="dict.value"/>
  21 + </el-select>
  22 + </el-form-item>
  23 + <el-form-item label="创建时间" prop="createTime">
  24 + <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
  25 + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
  26 + </el-form-item>
  27 + <el-form-item>
  28 + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
  29 + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
  30 + </el-form-item>
  31 + </el-form>
  32 +
  33 + <!-- 操作工具栏 -->
  34 + <el-row :gutter="10" class="mb8">
  35 + <el-col :span="1.5">
  36 + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
  37 + v-hasPermi="['system:mail-template:create']">新增</el-button>
  38 + </el-col>
  39 + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  40 + </el-row>
  41 +
  42 + <!-- 列表 -->
  43 + <el-table v-loading="loading" :data="list">
  44 + <el-table-column label="模板编码" align="center" prop="code" />
  45 + <el-table-column label="模板名称" align="center" prop="name" />
  46 + <el-table-column label="模板标题" align="center" prop="title" />
  47 + <el-table-column label="邮箱账号" align="center" prop="accountId">
  48 + <template v-slot="scope">
  49 + {{ accountOptions.find(account => account.id === scope.row.accountId)?.mail }}
  50 + </template>
  51 + </el-table-column>
  52 + <el-table-column label="发送人名称" align="center" prop="nickname" />
  53 + <el-table-column label="开启状态" align="center" prop="status">
  54 + <template v-slot="scope">
  55 + <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>
  56 + </template>
  57 + </el-table-column>
  58 + <el-table-column label="备注" align="center" prop="remark" />
  59 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  60 + <template v-slot="scope">
  61 + <span>{{ parseTime(scope.row.createTime) }}</span>
  62 + </template>
  63 + </el-table-column>
  64 + <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  65 + <template v-slot="scope">
  66 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  67 + v-hasPermi="['system:mail-template:update']">修改</el-button>
  68 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  69 + v-hasPermi="['system:mail-template:delete']">删除</el-button>
  70 + </template>
  71 + </el-table-column>
  72 + </el-table>
  73 + <!-- 分页组件 -->
  74 + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  75 + @pagination="getList"/>
  76 +
  77 + <!-- 对话框(添加 / 修改) -->
  78 + <el-dialog :title="title" :visible.sync="open" width="600px" v-dialogDrag append-to-body>
  79 + <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  80 + <el-form-item label="模板名称" prop="name">
  81 + <el-input v-model="form.name" placeholder="请输入模板名称" />
  82 + </el-form-item>
  83 + <el-form-item label="模板编码" prop="code">
  84 + <el-input v-model="form.code" placeholder="请输入模板编码" />
  85 + </el-form-item>
  86 + <el-form-item label="邮箱账号" prop="accountId">
  87 + <el-select v-model="form.accountId" placeholder="请输入邮箱账号">
  88 + <el-option v-for="account in accountOptions" :key="account.id" :value="account.id" :label="account.mail" />
  89 + </el-select>
  90 + </el-form-item>
  91 + <el-form-item label="发送人名称" prop="nickname">
  92 + <el-input v-model="form.nickname" placeholder="请输入发送人名称" />
  93 + </el-form-item>
  94 + <el-form-item label="模板标题" prop="title">
  95 + <el-input v-model="form.title" placeholder="请输入模板标题" />
  96 + </el-form-item>
  97 + <el-form-item label="模板内容">
  98 + <editor v-model="form.content" :min-height="192"/>
  99 + </el-form-item>
  100 + <el-form-item label="开启状态" prop="status">
  101 + <el-radio-group v-model="form.status">
  102 + <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
  103 + :key="dict.value" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
  104 + </el-radio-group>
  105 + </el-form-item>
  106 + <el-form-item label="备注" prop="remark">
  107 + <el-input v-model="form.remark" placeholder="请输入备注" />
  108 + </el-form-item>
  109 + </el-form>
  110 + <div slot="footer" class="dialog-footer">
  111 + <el-button type="primary" @click="submitForm">确 定</el-button>
  112 + <el-button @click="cancel">取 消</el-button>
  113 + </div>
  114 + </el-dialog>
  115 + </div>
  116 +</template>
  117 +
  118 +<script>
  119 +import { createMailTemplate, updateMailTemplate, deleteMailTemplate, getMailTemplate, getMailTemplatePage } from "@/api/system/mail/template";
  120 +import Editor from '@/components/Editor';
  121 +import { CommonStatusEnum } from "@/utils/constants";
  122 +import { getSimpleMailAccountList } from "@/api/system/mail/account";
  123 +
  124 +export default {
  125 + name: "MailTemplate",
  126 + components: {
  127 + Editor,
  128 + },
  129 + data() {
  130 + return {
  131 + // 遮罩层
  132 + loading: true,
  133 + // 导出遮罩层
  134 + exportLoading: false,
  135 + // 显示搜索条件
  136 + showSearch: true,
  137 + // 总条数
  138 + total: 0,
  139 + // 邮件模版列表
  140 + list: [],
  141 + // 弹出层标题
  142 + title: "",
  143 + // 是否显示弹出层
  144 + open: false,
  145 + // 查询参数
  146 + queryParams: {
  147 + pageNo: 1,
  148 + pageSize: 10,
  149 + name: null,
  150 + code: null,
  151 + accountId: null,
  152 + status: null,
  153 + createTime: [],
  154 + },
  155 + // 表单参数
  156 + form: {},
  157 + // 表单校验
  158 + rules: {
  159 + name: [{ required: true, message: "模板名称不能为空", trigger: "blur" }],
  160 + code: [{ required: true, message: "模板编码不能为空", trigger: "blur" }],
  161 + accountId: [{ required: true, message: "邮箱账号不能为空", trigger: "blur" }],
  162 + title: [{ required: true, message: "模板标题不能为空", trigger: "blur" }],
  163 + content: [{ required: true, message: "模板内容不能为空", trigger: "blur" }],
  164 + status: [{ required: true, message: "开启状态不能为空", trigger: "blur" }],
  165 + },
  166 + // 邮箱账号
  167 + accountOptions: []
  168 + };
  169 + },
  170 + created() {
  171 + this.getList();
  172 + // 获得邮箱账号列表
  173 + getSimpleMailAccountList().then(response => {
  174 + this.accountOptions = response.data
  175 + })
  176 + },
  177 + methods: {
  178 + /** 查询列表 */
  179 + getList() {
  180 + this.loading = true;
  181 + // 执行查询
  182 + getMailTemplatePage(this.queryParams).then(response => {
  183 + this.list = response.data.list;
  184 + this.total = response.data.total;
  185 + this.loading = false;
  186 + });
  187 + },
  188 + /** 取消按钮 */
  189 + cancel() {
  190 + this.open = false;
  191 + this.reset();
  192 + },
  193 + /** 表单重置 */
  194 + reset() {
  195 + this.form = {
  196 + id: undefined,
  197 + name: undefined,
  198 + code: undefined,
  199 + accountId: undefined,
  200 + nickname: undefined,
  201 + title: undefined,
  202 + content: undefined,
  203 + status: CommonStatusEnum.ENABLE,
  204 + remark: undefined,
  205 + };
  206 + this.resetForm("form");
  207 + },
  208 + /** 搜索按钮操作 */
  209 + handleQuery() {
  210 + this.queryParams.pageNo = 1;
  211 + this.getList();
  212 + },
  213 + /** 重置按钮操作 */
  214 + resetQuery() {
  215 + this.resetForm("queryForm");
  216 + this.handleQuery();
  217 + },
  218 + /** 新增按钮操作 */
  219 + handleAdd() {
  220 + this.reset();
  221 + this.open = true;
  222 + this.title = "添加邮件模版";
  223 + },
  224 + /** 修改按钮操作 */
  225 + handleUpdate(row) {
  226 + this.reset();
  227 + const id = row.id;
  228 + getMailTemplate(id).then(response => {
  229 + this.form = response.data;
  230 + this.open = true;
  231 + this.title = "修改邮件模版";
  232 + });
  233 + },
  234 + /** 提交按钮 */
  235 + submitForm() {
  236 + this.$refs["form"].validate(valid => {
  237 + if (!valid) {
  238 + return;
  239 + }
  240 + // 修改的提交
  241 + if (this.form.id != null) {
  242 + updateMailTemplate(this.form).then(response => {
  243 + this.$modal.msgSuccess("修改成功");
  244 + this.open = false;
  245 + this.getList();
  246 + });
  247 + return;
  248 + }
  249 + // 添加的提交
  250 + createMailTemplate(this.form).then(response => {
  251 + this.$modal.msgSuccess("新增成功");
  252 + this.open = false;
  253 + this.getList();
  254 + });
  255 + });
  256 + },
  257 + /** 删除按钮操作 */
  258 + handleDelete(row) {
  259 + const id = row.id;
  260 + this.$modal.confirm('是否确认删除邮件模版编号为"' + id + '"的数据项?').then(function() {
  261 + return deleteMailTemplate(id);
  262 + }).then(() => {
  263 + this.getList();
  264 + this.$modal.msgSuccess("删除成功");
  265 + }).catch(() => {});
  266 + }
  267 + }
  268 +};
  269 +</script>
... ...