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,9 +145,9 @@ public interface ErrorCodeConstants {
145 ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002023000, "邮箱账号不存在"); 145 ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002023000, "邮箱账号不存在");
146 ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002023001, "无法删除,该邮箱账号还有邮件模板"); 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,7 +2,6 @@ package cn.iocoder.yudao.module.system.controller.admin.mail;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.send.MailReqVO;  
6 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*; 5 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.*;
7 import cn.iocoder.yudao.module.system.convert.mail.MailTemplateConvert; 6 import cn.iocoder.yudao.module.system.convert.mail.MailTemplateConvert;
8 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; 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,13 +9,11 @@ import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
10 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
11 import io.swagger.annotations.ApiImplicitParam; 10 import io.swagger.annotations.ApiImplicitParam;
12 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
13 -import org.springframework.beans.factory.annotation.Autowired;  
14 import org.springframework.security.access.prepost.PreAuthorize; 12 import org.springframework.security.access.prepost.PreAuthorize;
15 import org.springframework.web.bind.annotation.*; 13 import org.springframework.web.bind.annotation.*;
16 14
  15 +import javax.annotation.Resource;
17 import javax.validation.Valid; 16 import javax.validation.Valid;
18 -  
19 -import java.util.Comparator;  
20 import java.util.List; 17 import java.util.List;
21 18
22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 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,37 +23,35 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
26 @RequestMapping("/system/mail-template") 23 @RequestMapping("/system/mail-template")
27 public class MailTemplateController { 24 public class MailTemplateController {
28 25
29 - // TODO @wangjingyi:private DONE  
30 - @Autowired 26 + @Resource
31 private MailTemplateService mailTempleService; 27 private MailTemplateService mailTempleService;
32 28
33 @PostMapping("/create") 29 @PostMapping("/create")
34 - @ApiOperation("创建邮箱模版") 30 + @ApiOperation("创建邮件模版")
35 @PreAuthorize("@ss.hasPermission('system:mail-template:create')") 31 @PreAuthorize("@ss.hasPermission('system:mail-template:create')")
36 public CommonResult<Long> createMailTemplate(@Valid @RequestBody MailTemplateCreateReqVO createReqVO){ 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 @PutMapping("/update") 36 @PutMapping("/update")
41 - @ApiOperation("修改邮箱模版") 37 + @ApiOperation("修改邮件模版")
42 @PreAuthorize("@ss.hasPermission('system:mail-template:update')") 38 @PreAuthorize("@ss.hasPermission('system:mail-template:update')")
43 public CommonResult<Boolean> updateMailTemplate(@Valid @RequestBody MailTemplateUpdateReqVO updateReqVO){ 39 public CommonResult<Boolean> updateMailTemplate(@Valid @RequestBody MailTemplateUpdateReqVO updateReqVO){
44 - mailTempleService.update(updateReqVO); 40 + mailTempleService.updateMailTemplate(updateReqVO);
45 return success(true); 41 return success(true);
46 } 42 }
47 43
48 @DeleteMapping("/delete") 44 @DeleteMapping("/delete")
49 - @ApiOperation("删除邮箱模版") 45 + @ApiOperation("删除邮件模版")
  46 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
50 @PreAuthorize("@ss.hasPermission('system:mail-template:delete')") 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 return success(true); 50 return success(true);
54 } 51 }
55 52
56 - // TODO @wangjingyi:下面几个 VO 也参考我在 account 给的建议 DONE RespVO中需要BaseVO 中哪些字段  
57 -  
58 @GetMapping("/get") 53 @GetMapping("/get")
59 - @ApiOperation("获得邮箱模版") 54 + @ApiOperation("获得邮件模版")
60 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 55 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
61 @PreAuthorize("@ss.hasPermission('system:mail-template:get')") 56 @PreAuthorize("@ss.hasPermission('system:mail-template:get')")
62 public CommonResult<MailTemplateRespVO> getMailTemplate(@RequestParam("id") Long id) { 57 public CommonResult<MailTemplateRespVO> getMailTemplate(@RequestParam("id") Long id) {
@@ -65,7 +60,7 @@ public class MailTemplateController { @@ -65,7 +60,7 @@ public class MailTemplateController {
65 } 60 }
66 61
67 @GetMapping("/page") 62 @GetMapping("/page")
68 - @ApiOperation("获得邮箱模版分页") 63 + @ApiOperation("获得邮件模版分页")
69 @PreAuthorize("@ss.hasPermission('system:mail-template:query')") 64 @PreAuthorize("@ss.hasPermission('system:mail-template:query')")
70 public CommonResult<PageResult<MailTemplateRespVO>> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) { 65 public CommonResult<PageResult<MailTemplateRespVO>> getMailTemplatePage(@Valid MailTemplatePageReqVO pageReqVO) {
71 PageResult<MailTemplateDO> pageResult = mailTempleService.getMailTemplatePage(pageReqVO); 66 PageResult<MailTemplateDO> pageResult = mailTempleService.getMailTemplatePage(pageReqVO);
@@ -73,11 +68,9 @@ public class MailTemplateController { @@ -73,11 +68,9 @@ public class MailTemplateController {
73 } 68 }
74 69
75 @GetMapping("/list-all-simple") 70 @GetMapping("/list-all-simple")
76 - @ApiOperation(value = "获得邮箱模版精简列表")  
77 - public CommonResult<List<MailTemplateRespVO>> getSimpleTemplateList() { 71 + @ApiOperation(value = "获得邮件模版精简列表")
  72 + public CommonResult<List<MailTemplateSimpleRespVO>> getSimpleTemplateList() {
78 List<MailTemplateDO> list = mailTempleService.getMailTemplateList(); 73 List<MailTemplateDO> list = mailTempleService.getMailTemplateList();
79 - // 排序后,返回给前端  
80 - list.sort(Comparator.comparing(MailTemplateDO::getId));  
81 return success(MailTemplateConvert.INSTANCE.convertList02(list)); 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,12 +26,12 @@ public class MailAccountBaseVO {
26 @NotNull(message = "密码必填") 26 @NotNull(message = "密码必填")
27 private String password; 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 private String host; 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 private Integer port; 35 private Integer port;
36 36
37 @ApiModelProperty(value = "是否开启 ssl", required = true, example = "true") 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,7 +8,7 @@ import lombok.Data;
8 @Data 8 @Data
9 public class MailAccountSimpleRespVO { 9 public class MailAccountSimpleRespVO {
10 10
11 - @ApiModelProperty(value = "邮箱比那好", required = true, example = "1024") 11 + @ApiModelProperty(value = "邮箱编号", required = true, example = "1024")
12 private Long id; 12 private Long id;
13 13
14 @ApiModelProperty(value = "邮箱", required = true, example = "768541388@qq.com") 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 package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template; 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 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
5 import lombok.Data; 5 import lombok.Data;
6 6
7 -import javax.validation.constraints.Email; 7 +import javax.validation.constraints.NotEmpty;
8 import javax.validation.constraints.NotNull; 8 import javax.validation.constraints.NotNull;
9 9
10 -@ApiModel("管理后台 - 邮箱模版基类 Base VO") 10 +/**
  11 + * 邮件模版 Base VO,提供给添加、修改、详细的子 VO 使用
  12 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  13 + */
11 @Data 14 @Data
12 public class MailTemplateBaseVO { 15 public class MailTemplateBaseVO {
13 - @ApiModelProperty("主键")  
14 - @NotNull(message = "主键不能为空")  
15 - private Long id;  
16 16
17 - @ApiModelProperty("名称") 17 + @ApiModelProperty(value = "模版名称", required = true, example = "测试名字")
18 @NotNull(message = "名称不能为空") 18 @NotNull(message = "名称不能为空")
19 private String name; 19 private String name;
20 20
21 - @ApiModelProperty("标识")  
22 - @NotNull(message = "邮箱模版code不能为空") 21 + @ApiModelProperty(value = "模版编号", required = true, example = "test")
  22 + @NotNull(message = "模版编号不能为空")
23 private String code; 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 private String title; 34 private String title;
33 35
34 - @ApiModelProperty("内容")  
35 - @NotNull(message = "内容不能为空") 36 + @ApiModelProperty(value = "内容", required = true, example = "你好,注册成功啦")
  37 + @NotEmpty(message = "内容不能为空")
36 private String content; 38 private String content;
37 39
38 - @ApiModelProperty("状态") 40 + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 CommonStatusEnum 枚举")
39 @NotNull(message = "状态不能为空") 41 @NotNull(message = "状态不能为空")
40 private Integer status; 42 private Integer status;
41 43
42 - @ApiModelProperty("备注") 44 + @ApiModelProperty(value = "备注", example = "奥特曼")
43 private String remark; 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,11 +5,10 @@ import lombok.Data;
5 import lombok.EqualsAndHashCode; 5 import lombok.EqualsAndHashCode;
6 import lombok.ToString; 6 import lombok.ToString;
7 7
8 -@ApiModel("管理后台 - 邮箱模版创建 Request VO") 8 +@ApiModel("管理后台 - 邮件模版创建 Request VO")
9 @Data 9 @Data
10 @EqualsAndHashCode(callSuper = true) 10 @EqualsAndHashCode(callSuper = true)
11 @ToString(callSuper = true) 11 @ToString(callSuper = true)
12 public class MailTemplateCreateReqVO extends MailTemplateBaseVO { 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,33 +6,32 @@ import io.swagger.annotations.ApiModelProperty;
6 import lombok.Data; 6 import lombok.Data;
7 import lombok.EqualsAndHashCode; 7 import lombok.EqualsAndHashCode;
8 import lombok.ToString; 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 @Data 16 @Data
12 @EqualsAndHashCode(callSuper = true) 17 @EqualsAndHashCode(callSuper = true)
13 @ToString(callSuper = true) 18 @ToString(callSuper = true)
14 public class MailTemplatePageReqVO extends PageParam { 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 private String code; 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 package cn.iocoder.yudao.module.system.controller.admin.mail.vo.template; 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,7 +8,7 @@ import lombok.ToString;
8 8
9 import javax.validation.constraints.NotNull; 9 import javax.validation.constraints.NotNull;
10 10
11 -@ApiModel("管理后台 - 邮箱模版修改 Request VO") 11 +@ApiModel("管理后台 - 邮件模版修改 Request VO")
12 @Data 12 @Data
13 @EqualsAndHashCode(callSuper = true) 13 @EqualsAndHashCode(callSuper = true)
14 @ToString(callSuper = true) 14 @ToString(callSuper = true)
@@ -17,4 +17,5 @@ public class MailTemplateUpdateReqVO extends MailTemplateBaseVO { @@ -17,4 +17,5 @@ public class MailTemplateUpdateReqVO extends MailTemplateBaseVO {
17 @ApiModelProperty(value = "编号", required = true, example = "1024") 17 @ApiModelProperty(value = "编号", required = true, example = "1024")
18 @NotNull(message = "编号不能为空") 18 @NotNull(message = "编号不能为空")
19 private Long id; 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 package cn.iocoder.yudao.module.system.convert.mail; 1 package cn.iocoder.yudao.module.system.convert.mail;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 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 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; 5 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
7 import org.mapstruct.Mapper; 6 import org.mapstruct.Mapper;
8 import org.mapstruct.factory.Mappers; 7 import org.mapstruct.factory.Mappers;
@@ -14,12 +13,14 @@ public interface MailTemplateConvert { @@ -14,12 +13,14 @@ public interface MailTemplateConvert {
14 13
15 MailTemplateConvert INSTANCE = Mappers.getMapper(MailTemplateConvert.class); 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 PageResult<MailTemplateRespVO> convertPage(PageResult<MailTemplateDO> pageResult); 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,11 +36,11 @@ public class MailAccountDO extends BaseDO {
36 */ 36 */
37 private String password; 37 private String password;
38 /** 38 /**
39 - * 主机 39 + * SMTP 服务器域名
40 */ 40 */
41 private String host; 41 private String host;
42 /** 42 /**
43 - * 端口 43 + * SMTP 服务器端口
44 */ 44 */
45 private Integer port; 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,12 +69,22 @@ public class MailLogDO extends BaseDO implements Serializable {
69 */ 69 */
70 private Long templateId; 70 private Long templateId;
71 /** 71 /**
72 - * 末班编码 72 + * 模版编码
73 * 73 *
74 * 冗余 {@link MailTemplateDO#getCode()} 74 * 冗余 {@link MailTemplateDO#getCode()}
75 */ 75 */
76 private String templateCode; 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 * 基于 {@link MailTemplateDO#getContent()} 格式化后的内容 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,7 +11,7 @@ import lombok.EqualsAndHashCode;
11 import java.util.List; 11 import java.util.List;
12 12
13 /** 13 /**
14 - * 邮箱模版 DO 14 + * 邮件模版 DO
15 * 15 *
16 * @author wangjingyi 16 * @author wangjingyi
17 * @since 2022-03-21 17 * @since 2022-03-21
@@ -41,6 +41,10 @@ public class MailTemplateDO extends BaseDO { @@ -41,6 +41,10 @@ public class MailTemplateDO extends BaseDO {
41 private Long accountId; 41 private Long accountId;
42 42
43 /** 43 /**
  44 + * 发送人名称
  45 + */
  46 + private String nickname;
  47 + /**
44 * 标题 48 * 标题
45 */ 49 */
46 private String title; 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,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.mail;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; 6 import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX;
6 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; 7 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
7 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; 8 import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
@@ -11,36 +12,24 @@ import org.apache.ibatis.annotations.Select; @@ -11,36 +12,24 @@ import org.apache.ibatis.annotations.Select;
11 12
12 import java.util.Date; 13 import java.util.Date;
13 14
14 -  
15 @Mapper 15 @Mapper
16 public interface MailTemplateMapper extends BaseMapperX<MailTemplateDO> { 16 public interface MailTemplateMapper extends BaseMapperX<MailTemplateDO> {
17 17
18 default PageResult<MailTemplateDO> selectPage(MailTemplatePageReqVO pageReqVO){ 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 default Long selectCountByAccountId(Long accountId) { 27 default Long selectCountByAccountId(Long accountId) {
43 return selectCount(MailTemplateDO::getAccountId, accountId); 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,7 +11,7 @@ import java.util.List;
11 import java.util.Map; 11 import java.util.Map;
12 12
13 /** 13 /**
14 - * 邮箱模版服务类 14 + * 邮件模版 Service 接口
15 * 15 *
16 * @author wangjingyi 16 * @author wangjingyi
17 * @since 2022-03-21 17 * @since 2022-03-21
@@ -19,34 +19,34 @@ import java.util.Map; @@ -19,34 +19,34 @@ import java.util.Map;
19 public interface MailTemplateService { 19 public interface MailTemplateService {
20 20
21 /** 21 /**
22 - * 初始化邮箱模版的本地缓存 22 + * 初始化邮件模版的本地缓存
23 */ 23 */
24 void initLocalCache(); 24 void initLocalCache();
25 25
26 /** 26 /**
27 - * 邮箱模版创建 27 + * 邮件模版创建
28 * 28 *
29 - * @param createReqVO 邮箱信息 29 + * @param createReqVO 邮件信息
30 * @return 编号 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 * @param id 编号 44 * @param id 编号
45 */ 45 */
46 - void delete(Long id); 46 + void deleteMailTemplate(Long id);
47 47
48 /** 48 /**
49 - * 获取邮箱模版 49 + * 获取邮件模版
50 * 50 *
51 * @param id 编号 51 * @param id 编号
52 * @return 邮件模版 52 * @return 邮件模版
@@ -54,39 +54,39 @@ public interface MailTemplateService { @@ -54,39 +54,39 @@ public interface MailTemplateService {
54 MailTemplateDO getMailTemplate(Long id); 54 MailTemplateDO getMailTemplate(Long id);
55 55
56 /** 56 /**
57 - * 获取邮箱模版分页 57 + * 获取邮件模版分页
58 * 58 *
59 * @param pageReqVO 模版信息 59 * @param pageReqVO 模版信息
60 - * @return 邮箱模版分页信息 60 + * @return 邮件模版分页信息
61 */ 61 */
62 PageResult<MailTemplateDO> getMailTemplatePage(MailTemplatePageReqVO pageReqVO); 62 PageResult<MailTemplateDO> getMailTemplatePage(MailTemplatePageReqVO pageReqVO);
63 63
64 /** 64 /**
65 - * 获取邮箱模板数组 65 + * 获取邮件模板数组
66 * 66 *
67 * @return 模版数组 67 * @return 模版数组
68 */ 68 */
69 List<MailTemplateDO> getMailTemplateList(); 69 List<MailTemplateDO> getMailTemplateList();
70 70
71 /** 71 /**
72 - * 从缓存中获取邮箱模版 72 + * 从缓存中获取邮件模版
73 * 73 *
74 * @param code 模板编码 74 * @param code 模板编码
75 - * @return 邮箱模板 75 + * @return 邮件模板
76 */ 76 */
77 MailTemplateDO getMailTemplateByCodeFromCache(String code); 77 MailTemplateDO getMailTemplateByCodeFromCache(String code);
78 78
79 /** 79 /**
80 * 邮件模版内容合成 80 * 邮件模版内容合成
81 * 81 *
82 - * @param content 邮箱模版 82 + * @param content 邮件模版
83 * @param params 合成参数 83 * @param params 合成参数
84 * @return 格式化后的内容 84 * @return 格式化后的内容
85 */ 85 */
86 String formatMailTemplateContent(String content, Map<String, String> params); 86 String formatMailTemplateContent(String content, Map<String, String> params);
87 87
88 /** 88 /**
89 - * 获得指定邮箱账号下的邮件模板数量 89 + * 获得指定邮件账号下的邮件模板数量
90 * 90 *
91 * @param accountId 账号编号 91 * @param accountId 账号编号
92 * @return 数量 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,9 +2,11 @@ package cn.iocoder.yudao.module.system.service.mail.impl;
2 2
3 3
4 import cn.hutool.core.collection.CollUtil; 4 import cn.hutool.core.collection.CollUtil;
  5 +import cn.hutool.core.util.ObjUtil;
5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 7 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; 8 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
  9 +import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
8 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO; 10 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO;
9 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; 11 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO;
10 import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateUpdateReqVO; 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,6 +15,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO;
13 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; 15 import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper;
14 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; 16 import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer;
15 import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; 17 import cn.iocoder.yudao.module.system.service.mail.MailTemplateService;
  18 +import com.google.common.annotations.VisibleForTesting;
16 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
17 import org.springframework.stereotype.Service; 20 import org.springframework.stereotype.Service;
18 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
@@ -25,8 +28,8 @@ import java.util.List; @@ -25,8 +28,8 @@ import java.util.List;
25 import java.util.Map; 28 import java.util.Map;
26 29
27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 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 * 邮箱模版 Service 实现类 35 * 邮箱模版 Service 实现类
@@ -47,56 +50,71 @@ public class MailTemplateServiceImpl implements MailTemplateService { @@ -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 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 55 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
53 */ 56 */
54 - private volatile Map<Long, MailTemplateDO> mailTemplateCache; 57 + private volatile Map<String, MailTemplateDO> mailTemplateCache;
55 58
56 @Override 59 @Override
57 @PostConstruct 60 @PostConstruct
58 public void initLocalCache() { 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 @Override 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 mailProducer.sendMailTemplateRefreshMessage(); 79 mailProducer.sendMailTemplateRefreshMessage();
80 - return mailTemplateDO.getId(); 80 + return template.getId();
81 } 81 }
82 82
83 @Override 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 mailProducer.sendMailTemplateRefreshMessage(); 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 @Override 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 mailTemplateMapper.deleteById(id); 116 mailTemplateMapper.deleteById(id);
99 - // TODO @wangjingyi:mq 更新 DONE 117 + // 发送刷新消息
100 mailProducer.sendMailTemplateRefreshMessage(); 118 mailProducer.sendMailTemplateRefreshMessage();
101 } 119 }
102 120
@@ -122,41 +140,11 @@ public class MailTemplateServiceImpl implements MailTemplateService { @@ -122,41 +140,11 @@ public class MailTemplateServiceImpl implements MailTemplateService {
122 } 140 }
123 141
124 private void validateMailTemplateExists(Long id) { 142 private void validateMailTemplateExists(Long id) {
125 - if (mailTemplateCache.get(id) == null) { 143 + if (mailTemplateMapper.selectById(id) == null) {
126 throw exception(MAIL_TEMPLATE_NOT_EXISTS); 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 @Override 148 @Override
161 public long countByAccountId(Long accountId) { 149 public long countByAccountId(Long accountId) {
162 return mailTemplateMapper.selectCountByAccountId(accountId); 150 return mailTemplateMapper.selectCountByAccountId(accountId);
yudao-server/src/main/resources/application.yaml
@@ -138,6 +138,9 @@ yudao: @@ -138,6 +138,9 @@ yudao:
138 - system_sms_log 138 - system_sms_log
139 - system_sensitive_word 139 - system_sensitive_word
140 - system_oauth2_client 140 - system_oauth2_client
  141 + - system_mail_account
  142 + - system_mail_template
  143 + - system_mail_log
141 - infra_codegen_column 144 - infra_codegen_column
142 - infra_codegen_table 145 - infra_codegen_table
143 - infra_test_demo 146 - infra_test_demo
yudao-ui-admin/src/api/system/mail/account.js
@@ -42,3 +42,11 @@ export function getMailAccountPage(query) { @@ -42,3 +42,11 @@ export function getMailAccountPage(query) {
42 params: query 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,8 +29,8 @@
29 <el-table-column label="主键" align="center" prop="id" /> 29 <el-table-column label="主键" align="center" prop="id" />
30 <el-table-column label="邮箱" align="center" prop="mail" /> 30 <el-table-column label="邮箱" align="center" prop="mail" />
31 <el-table-column label="用户名" align="center" prop="username" /> 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 <el-table-column label="是否开启 SSL" align="center" prop="sslEnable"> 34 <el-table-column label="是否开启 SSL" align="center" prop="sslEnable">
35 <template v-slot="scope"> 35 <template v-slot="scope">
36 <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.sslEnable" /> 36 <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.sslEnable" />
@@ -56,7 +56,7 @@ @@ -56,7 +56,7 @@
56 56
57 <!-- 对话框(添加 / 修改) --> 57 <!-- 对话框(添加 / 修改) -->
58 <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body> 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 <el-form-item label="邮箱" prop="mail"> 60 <el-form-item label="邮箱" prop="mail">
61 <el-input v-model="form.mail" placeholder="请输入邮箱" /> 61 <el-input v-model="form.mail" placeholder="请输入邮箱" />
62 </el-form-item> 62 </el-form-item>
@@ -66,11 +66,11 @@ @@ -66,11 +66,11 @@
66 <el-form-item label="密码" prop="password"> 66 <el-form-item label="密码" prop="password">
67 <el-input v-model="form.password" placeholder="请输入密码" /> 67 <el-input v-model="form.password" placeholder="请输入密码" />
68 </el-form-item> 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 </el-form-item> 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 </el-form-item> 74 </el-form-item>
75 <el-form-item label="是否开启 SSL" prop="sslEnable"> 75 <el-form-item label="是否开启 SSL" prop="sslEnable">
76 <el-radio-group v-model="form.sslEnable"> 76 <el-radio-group v-model="form.sslEnable">
@@ -124,10 +124,10 @@ export default { @@ -124,10 +124,10 @@ export default {
124 mail: [{ required: true, message: "邮箱不能为空", trigger: "blur" }], 124 mail: [{ required: true, message: "邮箱不能为空", trigger: "blur" }],
125 username: [{ required: true, message: "用户名不能为空", trigger: "blur" }], 125 username: [{ required: true, message: "用户名不能为空", trigger: "blur" }],
126 password: [{ required: true, message: "密码不能为空", trigger: "blur" }], 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 sslEnable: [{ required: true, message: "是否开启 SSL不能为空", trigger: "blur" }], 129 sslEnable: [{ required: true, message: "是否开启 SSL不能为空", trigger: "blur" }],
130 - } 130 + },
131 }; 131 };
132 }, 132 },
133 created() { 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>