Commit ea39dcc5c803ffd0a569243cb2a678ebc0d04b1b
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> |