Commit 0262fa5c153628e63c6c266026c7bb7a06d49f1a
1 parent
c9c5a818
邮箱模块:完善 account 账号的增删改查功能
Showing
28 changed files
with
555 additions
and
272 deletions
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/mail/MailSendApi.java
| 1 | package cn.iocoder.yudao.module.system.api.mail; | 1 | package cn.iocoder.yudao.module.system.api.mail; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.module.system.api.mail.dto.MailSendSingleToUserReqDTO; | ||
| 4 | + | ||
| 5 | +import javax.validation.Valid; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * 邮箱发送 API 接口 | ||
| 9 | + * | ||
| 10 | + * @author 芋道源码 | ||
| 11 | + */ | ||
| 3 | public interface MailSendApi { | 12 | public interface MailSendApi { |
| 13 | + | ||
| 14 | + /** | ||
| 15 | + * 发送单条邮箱给 Admin 用户 | ||
| 16 | + * | ||
| 17 | + * 在 mail 为空时,使用 userId 加载对应 Admin 的邮箱 | ||
| 18 | + * | ||
| 19 | + * @param reqDTO 发送请求 | ||
| 20 | + * @return 发送日志编号 | ||
| 21 | + */ | ||
| 22 | + Long sendSingleSmsToAdmin(@Valid MailSendSingleToUserReqDTO reqDTO); | ||
| 23 | + | ||
| 24 | + /** | ||
| 25 | + * 发送单条邮箱给 Member 用户 | ||
| 26 | + * | ||
| 27 | + * 在 mail 为空时,使用 userId 加载对应 Member 的邮箱 | ||
| 28 | + * | ||
| 29 | + * @param reqDTO 发送请求 | ||
| 30 | + * @return 发送日志编号 | ||
| 31 | + */ | ||
| 32 | + Long sendSingleSmsToMember(@Valid MailSendSingleToUserReqDTO reqDTO); | ||
| 33 | + | ||
| 4 | } | 34 | } |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/mail/dto/MailSendReqDTO.java deleted
| 1 | -package cn.iocoder.yudao.module.system.api.mail.dto; | ||
| 2 | - | ||
| 3 | -import io.swagger.annotations.ApiModel; | ||
| 4 | -import io.swagger.annotations.ApiModelProperty; | ||
| 5 | -import lombok.Data; | ||
| 6 | - | ||
| 7 | -import javax.validation.constraints.Email; | ||
| 8 | -import javax.validation.constraints.NotNull; | ||
| 9 | -import java.util.List; | ||
| 10 | -import java.util.Map; | ||
| 11 | - | ||
| 12 | -@ApiModel("管理后台 - 邮件发送 Req VO") | ||
| 13 | -@Data | ||
| 14 | -public class MailSendReqDTO { // TODO @wangjingqi:1), 不用空格;2)应该只要传递 templateCode、参数就好,title、from、content、附件应该都是参数里的 | ||
| 15 | - | ||
| 16 | - @ApiModelProperty(value = "用户编码",required = true) | ||
| 17 | - @NotNull(message = "用户编码不能为空") | ||
| 18 | - private String userId; | ||
| 19 | - | ||
| 20 | - @ApiModelProperty(value = "用户类型",required = true) | ||
| 21 | - @NotNull(message = "用户类型不能为空") | ||
| 22 | - private String userType; | ||
| 23 | - | ||
| 24 | - @ApiModelProperty(value = "邮箱模版id",example = "1024") | ||
| 25 | - @NotNull(message = "邮箱模版编码不能为空") | ||
| 26 | - private Integer templateCode; | ||
| 27 | - | ||
| 28 | - @ApiModelProperty(value = "邮箱参数") | ||
| 29 | - @NotNull(message = "模版参数不能为空") | ||
| 30 | - private Map<String,Object> templateParams; | ||
| 31 | - | ||
| 32 | - @ApiModelProperty(value = "收件人",required = true,example = "yudaoyuanma@123.com") | ||
| 33 | - @NotNull(message = "收件人不能为空") | ||
| 34 | - private List<String> tos; | ||
| 35 | - | ||
| 36 | - | ||
| 37 | - | ||
| 38 | -} |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.api.mail.dto; | ||
| 2 | + | ||
| 3 | +import lombok.Data; | ||
| 4 | + | ||
| 5 | +import javax.validation.constraints.Email; | ||
| 6 | +import javax.validation.constraints.NotNull; | ||
| 7 | +import java.util.Map; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * 邮件发送 Request DTO | ||
| 11 | + * | ||
| 12 | + * @author wangjingqi | ||
| 13 | + */ | ||
| 14 | +@Data | ||
| 15 | +public class MailSendSingleToUserReqDTO { | ||
| 16 | + | ||
| 17 | + /** | ||
| 18 | + * 用户编号 | ||
| 19 | + */ | ||
| 20 | + @NotNull(message = "用户编号不能为空") | ||
| 21 | + private String userId; | ||
| 22 | + /** | ||
| 23 | + * 邮箱 | ||
| 24 | + */ | ||
| 25 | |||
| 26 | + private String mail; | ||
| 27 | + | ||
| 28 | + /** | ||
| 29 | + * 邮件模板编号 | ||
| 30 | + */ | ||
| 31 | + @NotNull(message = "邮件模板编号不能为空") | ||
| 32 | + private String templateCode; | ||
| 33 | + /** | ||
| 34 | + * 邮件模板参数 | ||
| 35 | + */ | ||
| 36 | + @NotNull(message = "邮件模板参数不能为空") | ||
| 37 | + private Map<String, Object> templateParams; | ||
| 38 | + | ||
| 39 | +} |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java
| @@ -141,16 +141,13 @@ public interface ErrorCodeConstants { | @@ -141,16 +141,13 @@ public interface ErrorCodeConstants { | ||
| 141 | ErrorCode OAUTH2_CODE_NOT_EXISTS = new ErrorCode(1002022000, "code 不存在"); | 141 | ErrorCode OAUTH2_CODE_NOT_EXISTS = new ErrorCode(1002022000, "code 不存在"); |
| 142 | ErrorCode OAUTH2_CODE_EXPIRE = new ErrorCode(1002022001, "code 已过期"); | 142 | ErrorCode OAUTH2_CODE_EXPIRE = new ErrorCode(1002022001, "code 已过期"); |
| 143 | 143 | ||
| 144 | - // TODO @芋艿:需要重新搞下 mail 错误码 | ||
| 145 | - | ||
| 146 | - // ========== 邮箱账号 1002020000 ========== | ||
| 147 | - ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002020000, "邮箱账号不存在"); | ||
| 148 | - ErrorCode MAIL_ACCOUNT_EXISTS = new ErrorCode(1002020001, "邮箱账号存在"); | 144 | + // ========== 邮箱账号 1002023000 ========== |
| 145 | + ErrorCode MAIL_ACCOUNT_NOT_EXISTS = new ErrorCode(1002023000, "邮箱账号不存在"); | ||
| 146 | + ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002023001, "无法删除,该邮箱账号还有邮件模板"); | ||
| 149 | 147 | ||
| 150 | // ========== 邮箱模版 1002021000 ========== | 148 | // ========== 邮箱模版 1002021000 ========== |
| 151 | ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002021000, "邮箱模版不存在"); | 149 | ErrorCode MAIL_TEMPLATE_NOT_EXISTS = new ErrorCode(1002021000, "邮箱模版不存在"); |
| 152 | ErrorCode MAIL_TEMPLATE_EXISTS = new ErrorCode(1002021001, "邮箱模版存在"); | 150 | ErrorCode MAIL_TEMPLATE_EXISTS = new ErrorCode(1002021001, "邮箱模版存在"); |
| 153 | - ErrorCode MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS = new ErrorCode(1002021002, "存在关联邮箱模版"); | ||
| 154 | ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); | 151 | ErrorCode MAIL_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1002021003, "模板参数({})缺失"); |
| 155 | 152 | ||
| 156 | } | 153 | } |
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/mail/MailLogUserTypeEnum.java deleted
| 1 | -package cn.iocoder.yudao.module.system.enums.mail; | ||
| 2 | - | ||
| 3 | -import lombok.AllArgsConstructor; | ||
| 4 | -import lombok.Getter; | ||
| 5 | - | ||
| 6 | -/** | ||
| 7 | - * 邮件日志用户类型 | ||
| 8 | - * | ||
| 9 | - * @author wangjingyi | ||
| 10 | - */ | ||
| 11 | -@Getter | ||
| 12 | -@AllArgsConstructor | ||
| 13 | -public enum MailLogUserTypeEnum { | ||
| 14 | - | ||
| 15 | - COMMON (10), | ||
| 16 | - VIP (20); | ||
| 17 | - | ||
| 18 | - /** | ||
| 19 | - * 类型 | ||
| 20 | - */ | ||
| 21 | - private final int userType; | ||
| 22 | -} |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/mail/MailSendApiImpl.java
| 1 | package cn.iocoder.yudao.module.system.api.mail; | 1 | package cn.iocoder.yudao.module.system.api.mail; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.module.system.api.mail.dto.MailSendSingleToUserReqDTO; | ||
| 3 | import org.springframework.stereotype.Service; | 4 | import org.springframework.stereotype.Service; |
| 4 | import org.springframework.validation.annotation.Validated; | 5 | import org.springframework.validation.annotation.Validated; |
| 5 | 6 | ||
| @@ -10,5 +11,16 @@ import org.springframework.validation.annotation.Validated; | @@ -10,5 +11,16 @@ import org.springframework.validation.annotation.Validated; | ||
| 10 | */ | 11 | */ |
| 11 | @Service | 12 | @Service |
| 12 | @Validated | 13 | @Validated |
| 13 | -public class MailSendApiImpl implements MailSendApi{ | 14 | +public class MailSendApiImpl implements MailSendApi { |
| 15 | + | ||
| 16 | + @Override | ||
| 17 | + public Long sendSingleSmsToAdmin(MailSendSingleToUserReqDTO reqDTO) { | ||
| 18 | + return null; | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + @Override | ||
| 22 | + public Long sendSingleSmsToMember(MailSendSingleToUserReqDTO reqDTO) { | ||
| 23 | + return null; | ||
| 24 | + } | ||
| 25 | + | ||
| 14 | } | 26 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/MailAccountController.java
| @@ -3,11 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.mail; | @@ -3,11 +3,7 @@ package cn.iocoder.yudao.module.system.controller.admin.mail; | ||
| 3 | 3 | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountBaseVO; | ||
| 7 | -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountCreateReqVO; | ||
| 8 | -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; | ||
| 9 | -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountUpdateReqVO; | ||
| 10 | -import cn.iocoder.yudao.module.system.controller.admin.mail.vo.send.MailReqVO; | 6 | +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.*; |
| 11 | import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert; | 7 | import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert; |
| 12 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; | 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; |
| 13 | import cn.iocoder.yudao.module.system.service.mail.MailAccountService; | 9 | import cn.iocoder.yudao.module.system.service.mail.MailAccountService; |
| @@ -36,14 +32,14 @@ public class MailAccountController { | @@ -36,14 +32,14 @@ public class MailAccountController { | ||
| 36 | @ApiOperation("创建邮箱账号") | 32 | @ApiOperation("创建邮箱账号") |
| 37 | @PreAuthorize("@ss.hasPermission('system:mail-account:create')") | 33 | @PreAuthorize("@ss.hasPermission('system:mail-account:create')") |
| 38 | public CommonResult<Long> createMailAccount(@Valid @RequestBody MailAccountCreateReqVO createReqVO) { | 34 | public CommonResult<Long> createMailAccount(@Valid @RequestBody MailAccountCreateReqVO createReqVO) { |
| 39 | - return success(mailAccountService.create(createReqVO)); | 35 | + return success(mailAccountService.createMailAccount(createReqVO)); |
| 40 | } | 36 | } |
| 41 | 37 | ||
| 42 | @PutMapping("/update") | 38 | @PutMapping("/update") |
| 43 | @ApiOperation("修改邮箱账号") | 39 | @ApiOperation("修改邮箱账号") |
| 44 | @PreAuthorize("@ss.hasPermission('system:mail-account:update')") | 40 | @PreAuthorize("@ss.hasPermission('system:mail-account:update')") |
| 45 | public CommonResult<Boolean> updateMailAccount(@Valid @RequestBody MailAccountUpdateReqVO updateReqVO) { | 41 | public CommonResult<Boolean> updateMailAccount(@Valid @RequestBody MailAccountUpdateReqVO updateReqVO) { |
| 46 | - mailAccountService.update(updateReqVO); | 42 | + mailAccountService.updateMailAccount(updateReqVO); |
| 47 | return success(true); | 43 | return success(true); |
| 48 | } | 44 | } |
| 49 | 45 | ||
| @@ -52,18 +48,15 @@ public class MailAccountController { | @@ -52,18 +48,15 @@ public class MailAccountController { | ||
| 52 | @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) | 48 | @ApiImplicitParam(name = "id", value = "编号", required = true, dataTypeClass = Long.class) |
| 53 | @PreAuthorize("@ss.hasPermission('system:mail-account:delete')") | 49 | @PreAuthorize("@ss.hasPermission('system:mail-account:delete')") |
| 54 | public CommonResult<Boolean> deleteMailAccount(@RequestParam Long id) { | 50 | public CommonResult<Boolean> deleteMailAccount(@RequestParam Long id) { |
| 55 | - mailAccountService.delete(id); | 51 | + mailAccountService.deleteMailAccount(id); |
| 56 | return success(true); | 52 | return success(true); |
| 57 | } | 53 | } |
| 58 | 54 | ||
| 59 | - // TODO @wangjingyi:getMailAccount 和 getMailAccountPage 这两个接口,定义一个对应的 Resp 类哈,参考别的模块。主要不要返回 password 字段。 | ||
| 60 | - // 一个可以的做法,是 MailAccountBaseVO 不返回 password,然后 MailAccountCreateReqVO、MailAccountUpdateReqVO 添加这个字段 DONE | ||
| 61 | - | ||
| 62 | @GetMapping("/get") | 55 | @GetMapping("/get") |
| 63 | @ApiOperation("获得邮箱账号") | 56 | @ApiOperation("获得邮箱账号") |
| 64 | @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) | 57 | @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) |
| 65 | @PreAuthorize("@ss.hasPermission('system:mail-account:get')") | 58 | @PreAuthorize("@ss.hasPermission('system:mail-account:get')") |
| 66 | - public CommonResult<MailAccountBaseVO> getMailAccount(@RequestParam("id") Long id) { | 59 | + public CommonResult<MailAccountRespVO> getMailAccount(@RequestParam("id") Long id) { |
| 67 | MailAccountDO mailAccountDO = mailAccountService.getMailAccount(id); | 60 | MailAccountDO mailAccountDO = mailAccountService.getMailAccount(id); |
| 68 | return success(MailAccountConvert.INSTANCE.convert(mailAccountDO)); | 61 | return success(MailAccountConvert.INSTANCE.convert(mailAccountDO)); |
| 69 | } | 62 | } |
| @@ -76,14 +69,10 @@ public class MailAccountController { | @@ -76,14 +69,10 @@ public class MailAccountController { | ||
| 76 | return success(MailAccountConvert.INSTANCE.convertPage(pageResult)); | 69 | return success(MailAccountConvert.INSTANCE.convertPage(pageResult)); |
| 77 | } | 70 | } |
| 78 | 71 | ||
| 79 | - // TODO @wangjingyi:getSimpleMailAccountList 单独定义一个类,只返回精简的信息,id,from 即可。像密码之类都是敏感信息,不应该返回 DONE | ||
| 80 | - | ||
| 81 | @GetMapping("/list-all-simple") | 72 | @GetMapping("/list-all-simple") |
| 82 | @ApiOperation(value = "获得邮箱账号精简列表") | 73 | @ApiOperation(value = "获得邮箱账号精简列表") |
| 83 | - public CommonResult<List<MailAccountBaseVO>> getSimpleMailAccountList() { | 74 | + public CommonResult<List<MailAccountSimpleRespVO>> getSimpleMailAccountList() { |
| 84 | List<MailAccountDO> list = mailAccountService.getMailAccountList(); | 75 | List<MailAccountDO> list = mailAccountService.getMailAccountList(); |
| 85 | - // 排序后,返回给前端 | ||
| 86 | - list.sort(Comparator.comparing(MailAccountDO::getId)); | ||
| 87 | return success(MailAccountConvert.INSTANCE.convertList02(list)); | 76 | return success(MailAccountConvert.INSTANCE.convertList02(list)); |
| 88 | } | 77 | } |
| 89 | 78 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountBaseVO.java
| 1 | package cn.iocoder.yudao.module.system.controller.admin.mail.vo.account; | 1 | package cn.iocoder.yudao.module.system.controller.admin.mail.vo.account; |
| 2 | 2 | ||
| 3 | -import io.swagger.annotations.ApiModel; | ||
| 4 | import io.swagger.annotations.ApiModelProperty; | 3 | import io.swagger.annotations.ApiModelProperty; |
| 5 | import lombok.Data; | 4 | import lombok.Data; |
| 6 | 5 | ||
| 7 | import javax.validation.constraints.Email; | 6 | import javax.validation.constraints.Email; |
| 8 | import javax.validation.constraints.NotNull; | 7 | import javax.validation.constraints.NotNull; |
| 9 | 8 | ||
| 10 | -@ApiModel("管理后台 - 邮箱账号基类 Base VO") | 9 | +/** |
| 10 | + * 邮箱账号 Base VO,提供给添加、修改、详细的子 VO 使用 | ||
| 11 | + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 | ||
| 12 | + */ | ||
| 11 | @Data | 13 | @Data |
| 12 | public class MailAccountBaseVO { | 14 | public class MailAccountBaseVO { |
| 13 | 15 | ||
| 14 | - @ApiModelProperty(value = "邮箱",required = true,example = "yudaoyuanma@123.com") | ||
| 15 | - @NotNull(message = "邮箱必填") | ||
| 16 | - @Email(message = "必须是Email格式") | ||
| 17 | - private String fromAddress; | 16 | + @ApiModelProperty(value = "邮箱", required = true, example = "yudaoyuanma@123.com") |
| 17 | + @NotNull(message = "邮箱不能为空") | ||
| 18 | + @Email(message = "必须是 Email 格式") | ||
| 19 | + private String mail; | ||
| 18 | 20 | ||
| 19 | - @ApiModelProperty(value = "用户名",required = true,example = "yudao") | ||
| 20 | - @NotNull(message = "用户名必填") | 21 | + @ApiModelProperty(value = "用户名", required = true, example = "yudao") |
| 22 | + @NotNull(message = "用户名不能为空") | ||
| 21 | private String username; | 23 | private String username; |
| 22 | 24 | ||
| 23 | - @ApiModelProperty(value = "网站",required = true,example = "www.iocoder.cn") | ||
| 24 | - @NotNull(message = "网站必填") | 25 | + @ApiModelProperty(value = "密码", required = true, example = "123456") |
| 26 | + @NotNull(message = "密码必填") | ||
| 27 | + private String password; | ||
| 28 | + | ||
| 29 | + @ApiModelProperty(value = "网站", required = true, example = "www.iocoder.cn") | ||
| 30 | + @NotNull(message = "网站不能为空") | ||
| 25 | private String host; | 31 | private String host; |
| 26 | 32 | ||
| 27 | - @ApiModelProperty(value = "端口",required = true,example = "80") | 33 | + @ApiModelProperty(value = "端口", required = true, example = "80") |
| 34 | + @NotNull(message = "端口不能为空") | ||
| 28 | private Integer port; | 35 | private Integer port; |
| 29 | 36 | ||
| 30 | - @ApiModelProperty(value = "是否开启ssl",required = true,example = "2") | ||
| 31 | - @NotNull(message = "是否开启ssl必填") | 37 | + @ApiModelProperty(value = "是否开启 ssl", required = true, example = "true") |
| 38 | + @NotNull(message = "是否开启 ssl 必填") | ||
| 32 | private Boolean sslEnable; | 39 | private Boolean sslEnable; |
| 40 | + | ||
| 33 | } | 41 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountCreateReqVO.java
| @@ -14,7 +14,4 @@ import javax.validation.constraints.NotNull; | @@ -14,7 +14,4 @@ import javax.validation.constraints.NotNull; | ||
| 14 | @ToString(callSuper = true) | 14 | @ToString(callSuper = true) |
| 15 | public class MailAccountCreateReqVO extends MailAccountBaseVO { | 15 | public class MailAccountCreateReqVO extends MailAccountBaseVO { |
| 16 | 16 | ||
| 17 | - @ApiModelProperty(value = "密码",required = true,example = "123456") | ||
| 18 | - @NotNull(message = "密码必填") | ||
| 19 | - private String password; | ||
| 20 | } | 17 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountPageReqVO.java
| @@ -13,21 +13,10 @@ import lombok.ToString; | @@ -13,21 +13,10 @@ import lombok.ToString; | ||
| 13 | @ToString(callSuper = true) | 13 | @ToString(callSuper = true) |
| 14 | public class MailAccountPageReqVO extends PageParam { | 14 | public class MailAccountPageReqVO extends PageParam { |
| 15 | 15 | ||
| 16 | - @ApiModelProperty(value = "邮箱" , required = true , example = "yudaoyuanma@123.com") | ||
| 17 | - private String fromAddress; | 16 | + @ApiModelProperty(value = "邮箱", required = true, example = "yudaoyuanma@123.com") |
| 17 | + private String mail; | ||
| 18 | 18 | ||
| 19 | @ApiModelProperty(value = "用户名" , required = true , example = "yudao") | 19 | @ApiModelProperty(value = "用户名" , required = true , example = "yudao") |
| 20 | private String username; | 20 | private String username; |
| 21 | 21 | ||
| 22 | - @ApiModelProperty(value = "密码" , required = true , example = "123456") | ||
| 23 | - private String password; | ||
| 24 | - | ||
| 25 | - @ApiModelProperty(value = "网站" , required = true , example = "www.iocoder.cn") | ||
| 26 | - private String host; | ||
| 27 | - | ||
| 28 | - @ApiModelProperty(value = "端口" , required = true , example = "80") | ||
| 29 | - private String port; | ||
| 30 | - | ||
| 31 | - @ApiModelProperty(value = "是否开启ssl" , required = true , example = "2") | ||
| 32 | - private Boolean sslEnable; | ||
| 33 | } | 22 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.mail.vo.account; | ||
| 2 | + | ||
| 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 javax.validation.constraints.NotNull; | ||
| 10 | +import java.time.LocalDateTime; | ||
| 11 | + | ||
| 12 | +@ApiModel("管理后台 - 邮箱账号 Response VO") | ||
| 13 | +@Data | ||
| 14 | +@EqualsAndHashCode(callSuper = true) | ||
| 15 | +@ToString(callSuper = true) | ||
| 16 | +public class MailAccountRespVO extends MailAccountBaseVO { | ||
| 17 | + | ||
| 18 | + @ApiModelProperty(value = "编号", required = true, example = "1024") | ||
| 19 | + @NotNull(message = "编号不能为空") | ||
| 20 | + private Long id; | ||
| 21 | + | ||
| 22 | + @ApiModelProperty(value = "创建时间", required = true) | ||
| 23 | + private LocalDateTime createTime; | ||
| 24 | + | ||
| 25 | +} |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountSimpleRespVO.java
0 → 100644
| 1 | +package cn.iocoder.yudao.module.system.controller.admin.mail.vo.account; | ||
| 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 MailAccountSimpleRespVO { | ||
| 10 | + | ||
| 11 | + @ApiModelProperty(value = "邮箱比那好", required = true, example = "1024") | ||
| 12 | + private Long id; | ||
| 13 | + | ||
| 14 | + @ApiModelProperty(value = "邮箱", required = true, example = "768541388@qq.com") | ||
| 15 | + private String mail; | ||
| 16 | + | ||
| 17 | +} |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/mail/vo/account/MailAccountUpdateReqVO.java
| @@ -18,7 +18,4 @@ public class MailAccountUpdateReqVO extends MailAccountBaseVO { | @@ -18,7 +18,4 @@ public class MailAccountUpdateReqVO extends MailAccountBaseVO { | ||
| 18 | @NotNull(message = "编号不能为空") | 18 | @NotNull(message = "编号不能为空") |
| 19 | private Long id; | 19 | private Long id; |
| 20 | 20 | ||
| 21 | - @ApiModelProperty(value = "密码",required = true,example = "123456") | ||
| 22 | - @NotNull(message = "密码必填") | ||
| 23 | - private String password; | ||
| 24 | } | 21 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/mail/MailAccountConvert.java
| @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.convert.mail; | @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.system.convert.mail; | ||
| 3 | import cn.hutool.extra.mail.MailAccount; | 3 | import cn.hutool.extra.mail.MailAccount; |
| 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.account.MailAccountBaseVO; | 5 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountBaseVO; |
| 6 | +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountRespVO; | ||
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountSimpleRespVO; | ||
| 6 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; | 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; |
| 7 | import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; | 9 | import cn.iocoder.yudao.module.system.mq.message.mail.MailSendMessage; |
| 8 | import org.mapstruct.Mapper; | 10 | import org.mapstruct.Mapper; |
| @@ -14,30 +16,33 @@ import java.util.Map; | @@ -14,30 +16,33 @@ import java.util.Map; | ||
| 14 | 16 | ||
| 15 | @Mapper | 17 | @Mapper |
| 16 | public interface MailAccountConvert { | 18 | public interface MailAccountConvert { |
| 19 | + | ||
| 17 | MailAccountConvert INSTANCE = Mappers.getMapper(MailAccountConvert.class); | 20 | MailAccountConvert INSTANCE = Mappers.getMapper(MailAccountConvert.class); |
| 18 | 21 | ||
| 19 | - MailAccountDO convert (MailAccountBaseVO mailAccountBaseVO); | 22 | + MailAccountDO convert(MailAccountBaseVO bean); |
| 20 | 23 | ||
| 21 | - MailAccountBaseVO convert (MailAccountDO mailAccountDO); | 24 | + MailAccountRespVO convert(MailAccountDO bean); |
| 22 | 25 | ||
| 23 | - PageResult<MailAccountBaseVO> convertPage(PageResult<MailAccountDO> pageResult); | 26 | + PageResult<MailAccountBaseVO> convertPage(PageResult<MailAccountDO> pageResult); |
| 24 | 27 | ||
| 25 | - List<MailAccountBaseVO> convertList02(List<MailAccountDO> list); | 28 | + List<MailAccountSimpleRespVO> convertList02(List<MailAccountDO> list); |
| 26 | 29 | ||
| 27 | - default MailAccount convertAccount(MailSendMessage mailAccountDO){ | 30 | + // TODO 芋艿:改下 |
| 31 | + default MailAccount convertAccount(MailSendMessage bean) { | ||
| 28 | return new MailAccount() | 32 | return new MailAccount() |
| 29 | - .setHost(mailAccountDO.getHost()) | ||
| 30 | - .setPort(mailAccountDO.getPort()) | 33 | + .setHost(bean.getHost()) |
| 34 | + .setPort(bean.getPort()) | ||
| 31 | .setAuth(true) | 35 | .setAuth(true) |
| 32 | - .setFrom(mailAccountDO.getFromAddress()) | ||
| 33 | - .setUser(mailAccountDO.getUsername()) | ||
| 34 | - .setPass(mailAccountDO.getPassword()) | ||
| 35 | - .setSslEnable(mailAccountDO.getSslEnable()); | 36 | + .setFrom(bean.getFromAddress()) |
| 37 | + .setUser(bean.getUsername()) | ||
| 38 | + .setPass(bean.getPassword()) | ||
| 39 | + .setSslEnable(bean.getSslEnable()); | ||
| 36 | } | 40 | } |
| 37 | 41 | ||
| 42 | + // TODO 芋艿:改下 | ||
| 38 | default Map<String, String> convertToMap(MailAccountDO mailAccountDO , String content) { | 43 | default Map<String, String> convertToMap(MailAccountDO mailAccountDO , String content) { |
| 39 | Map<String , String> map = new HashMap<>(); | 44 | Map<String , String> map = new HashMap<>(); |
| 40 | - map.put("from_address" , mailAccountDO.getFromAddress()); | 45 | + map.put("from_address" , mailAccountDO.getMail()); |
| 41 | map.put("username" , mailAccountDO.getUsername()); | 46 | map.put("username" , mailAccountDO.getUsername()); |
| 42 | map.put("content" , content); | 47 | map.put("content" , content); |
| 43 | return map; | 48 | return map; |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailAccountDO.java
| 1 | package cn.iocoder.yudao.module.system.dal.dataobject.mail; | 1 | package cn.iocoder.yudao.module.system.dal.dataobject.mail; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import com.baomidou.mybatisplus.annotation.TableField; | ||
| 5 | import com.baomidou.mybatisplus.annotation.TableName; | 4 | import com.baomidou.mybatisplus.annotation.TableName; |
| 6 | import lombok.Data; | 5 | import lombok.Data; |
| 7 | import lombok.EqualsAndHashCode; | 6 | import lombok.EqualsAndHashCode; |
| 8 | 7 | ||
| 9 | /** | 8 | /** |
| 10 | - * 邮箱账号 | ||
| 11 | - * 配置发送邮箱的账号 | 9 | + * 邮箱账号 DO |
| 10 | + * | ||
| 11 | + * 用途:配置发送邮箱的账号 | ||
| 12 | * | 12 | * |
| 13 | * @author wangjingyi | 13 | * @author wangjingyi |
| 14 | * @since 2022-03-21 | 14 | * @since 2022-03-21 |
| @@ -25,7 +25,8 @@ public class MailAccountDO extends BaseDO { | @@ -25,7 +25,8 @@ public class MailAccountDO extends BaseDO { | ||
| 25 | /** | 25 | /** |
| 26 | * 邮箱 | 26 | * 邮箱 |
| 27 | */ | 27 | */ |
| 28 | - private String fromAddress; | 28 | + private String mail; |
| 29 | + | ||
| 29 | /** | 30 | /** |
| 30 | * 用户名 | 31 | * 用户名 |
| 31 | */ | 32 | */ |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/mail/MailLogDO.java
| 1 | package cn.iocoder.yudao.module.system.dal.dataobject.mail; | 1 | package cn.iocoder.yudao.module.system.dal.dataobject.mail; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||
| 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; | 4 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | -import cn.iocoder.yudao.module.system.enums.mail.MailLogUserTypeEnum; | ||
| 5 | import cn.iocoder.yudao.module.system.enums.mail.MailSendStatusEnum; | 5 | import cn.iocoder.yudao.module.system.enums.mail.MailSendStatusEnum; |
| 6 | import com.baomidou.mybatisplus.annotation.TableField; | 6 | import com.baomidou.mybatisplus.annotation.TableField; |
| 7 | import com.baomidou.mybatisplus.annotation.TableName; | 7 | import com.baomidou.mybatisplus.annotation.TableName; |
| @@ -13,7 +13,7 @@ import java.util.Date; | @@ -13,7 +13,7 @@ import java.util.Date; | ||
| 13 | import java.util.Map; | 13 | import java.util.Map; |
| 14 | 14 | ||
| 15 | /** | 15 | /** |
| 16 | - * 邮箱日志 | 16 | + * 邮箱日志 DO |
| 17 | * 记录每一次邮件的发送 | 17 | * 记录每一次邮件的发送 |
| 18 | * | 18 | * |
| 19 | * @author wangjingyi | 19 | * @author wangjingyi |
| @@ -29,7 +29,7 @@ import java.util.Map; | @@ -29,7 +29,7 @@ import java.util.Map; | ||
| 29 | public class MailLogDO extends BaseDO implements Serializable { | 29 | public class MailLogDO extends BaseDO implements Serializable { |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
| 32 | - * 主键 | 32 | + * 日志编号,自增 |
| 33 | */ | 33 | */ |
| 34 | private Long id; | 34 | private Long id; |
| 35 | 35 | ||
| @@ -37,62 +37,74 @@ public class MailLogDO extends BaseDO implements Serializable { | @@ -37,62 +37,74 @@ public class MailLogDO extends BaseDO implements Serializable { | ||
| 37 | * 用户编码 | 37 | * 用户编码 |
| 38 | */ | 38 | */ |
| 39 | private Long userId; | 39 | private Long userId; |
| 40 | - | ||
| 41 | /** | 40 | /** |
| 42 | * 用户类型 | 41 | * 用户类型 |
| 43 | * | 42 | * |
| 44 | - * 冗余 {@link MailLogUserTypeEnum#getUserType} | 43 | + * 枚举 {@link UserTypeEnum} |
| 45 | */ | 44 | */ |
| 46 | private Integer userType; | 45 | private Integer userType; |
| 46 | + /** | ||
| 47 | + * 接收邮箱地址 | ||
| 48 | + */ | ||
| 49 | + private String toMail; | ||
| 47 | 50 | ||
| 48 | - // TODO @wangjingyi:accountId | ||
| 49 | /** | 51 | /** |
| 50 | * 邮箱账号编号 | 52 | * 邮箱账号编号 |
| 53 | + * | ||
| 54 | + * 关联 {@link MailAccountDO#getId()} | ||
| 51 | */ | 55 | */ |
| 52 | private Long accountId; | 56 | private Long accountId; |
| 53 | - | ||
| 54 | - // TODO @wangjingyi:如果是冗余字段,记得 @ 下;DONE | ||
| 55 | /** | 57 | /** |
| 56 | - * 邮箱账号 | 58 | + * 发送邮箱地址 |
| 57 | * | 59 | * |
| 58 | - * 冗余 {@link MailAccountDO} | 60 | + * 冗余 {@link MailAccountDO#getMail()} |
| 59 | */ | 61 | */ |
| 60 | - private String fromAddress; | 62 | + private String fromMail; |
| 61 | 63 | ||
| 64 | + // ========= 模板相关字段 ========= | ||
| 62 | /** | 65 | /** |
| 63 | - * 模版主键 | 66 | + * 模版编号 |
| 67 | + * | ||
| 68 | + * 关联 {@link MailTemplateDO#getId()} | ||
| 64 | */ | 69 | */ |
| 65 | private Long templateId; | 70 | private Long templateId; |
| 66 | - | 71 | + /** |
| 72 | + * 末班编码 | ||
| 73 | + * | ||
| 74 | + * 冗余 {@link MailTemplateDO#getCode()} | ||
| 75 | + */ | ||
| 76 | + private String templateCode; | ||
| 67 | /** | 77 | /** |
| 68 | * 模版内容 | 78 | * 模版内容 |
| 79 | + * | ||
| 80 | + * 基于 {@link MailTemplateDO#getContent()} 格式化后的内容 | ||
| 69 | */ | 81 | */ |
| 70 | private String templateContent; | 82 | private String templateContent; |
| 71 | - | ||
| 72 | /** | 83 | /** |
| 84 | + * 模版参数 | ||
| 85 | + * | ||
| 73 | * 基于 {@link MailTemplateDO#getParams()} 输入后的参数 | 86 | * 基于 {@link MailTemplateDO#getParams()} 输入后的参数 |
| 74 | */ | 87 | */ |
| 75 | @TableField(typeHandler = JacksonTypeHandler.class) | 88 | @TableField(typeHandler = JacksonTypeHandler.class) |
| 76 | private Map<String,Object> templateParams; | 89 | private Map<String,Object> templateParams; |
| 77 | 90 | ||
| 78 | - /** | ||
| 79 | - * 发送时间 | ||
| 80 | - */ | ||
| 81 | - private Date sendTime; | ||
| 82 | - | ||
| 83 | - //=========接收相关字段========= | 91 | + // ========= 发送相关字段 ========= |
| 84 | /** | 92 | /** |
| 85 | * 发送状态 | 93 | * 发送状态 |
| 86 | * | 94 | * |
| 87 | * 枚举 {@link MailSendStatusEnum} | 95 | * 枚举 {@link MailSendStatusEnum} |
| 88 | */ | 96 | */ |
| 89 | private Integer sendStatus; | 97 | private Integer sendStatus; |
| 98 | + /** | ||
| 99 | + * 发送时间 | ||
| 100 | + */ | ||
| 101 | + private Date sendTime; | ||
| 90 | 102 | ||
| 103 | + // ========= 接收相关字段 ========= | ||
| 91 | /** | 104 | /** |
| 92 | * 发送结果 | 105 | * 发送结果 |
| 93 | */ | 106 | */ |
| 94 | private String sendResult; | 107 | private String sendResult; |
| 95 | - | ||
| 96 | /** | 108 | /** |
| 97 | * 消息ID | 109 | * 消息ID |
| 98 | */ | 110 | */ |
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 | - * 邮箱模版 | 14 | + * 邮箱模版 DO |
| 15 | * | 15 | * |
| 16 | * @author wangjingyi | 16 | * @author wangjingyi |
| 17 | * @since 2022-03-21 | 17 | * @since 2022-03-21 |
| @@ -34,9 +34,12 @@ public class MailTemplateDO extends BaseDO { | @@ -34,9 +34,12 @@ public class MailTemplateDO extends BaseDO { | ||
| 34 | */ | 34 | */ |
| 35 | private String code; | 35 | private String code; |
| 36 | /** | 36 | /** |
| 37 | - * 邮箱账号主键 | 37 | + * 发送的邮箱账号编号 |
| 38 | + * | ||
| 39 | + * 关联 {@link MailAccountDO#getId()} | ||
| 38 | */ | 40 | */ |
| 39 | private Long accountId; | 41 | private Long accountId; |
| 42 | + | ||
| 40 | /** | 43 | /** |
| 41 | * 标题 | 44 | * 标题 |
| 42 | */ | 45 | */ |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailAccountMapper.java
| @@ -2,37 +2,19 @@ package cn.iocoder.yudao.module.system.dal.mysql.mail; | @@ -2,37 +2,19 @@ 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.account.MailAccountPageReqVO; | 7 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; |
| 7 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; | 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; |
| 8 | -import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | ||
| 9 | import org.apache.ibatis.annotations.Mapper; | 9 | import org.apache.ibatis.annotations.Mapper; |
| 10 | -import org.apache.ibatis.annotations.Select; | ||
| 11 | - | ||
| 12 | -import java.util.Date; | ||
| 13 | 10 | ||
| 14 | @Mapper | 11 | @Mapper |
| 15 | public interface MailAccountMapper extends BaseMapperX<MailAccountDO> { | 12 | public interface MailAccountMapper extends BaseMapperX<MailAccountDO> { |
| 16 | 13 | ||
| 17 | default PageResult<MailAccountDO> selectPage(MailAccountPageReqVO pageReqVO) { | 14 | default PageResult<MailAccountDO> selectPage(MailAccountPageReqVO pageReqVO) { |
| 18 | - return selectPage(pageReqVO, new QueryWrapperX<MailAccountDO>() | ||
| 19 | - .likeIfPresent("from_address" , pageReqVO.getFromAddress()) | ||
| 20 | - .likeIfPresent("host" , pageReqVO.getHost()) | ||
| 21 | - .likeIfPresent("username" , pageReqVO.getUsername()) | ||
| 22 | - .eqIfPresent("password" , pageReqVO.getPassword()) | ||
| 23 | - .eqIfPresent("port" , pageReqVO.getPort()) | ||
| 24 | - ); | ||
| 25 | - } | ||
| 26 | - | ||
| 27 | - default MailAccountDO selectByUserName(String userName){ | ||
| 28 | - return selectOne(new QueryWrapperX<MailAccountDO>() | ||
| 29 | - .eqIfPresent("username" , userName)); | ||
| 30 | - } | ||
| 31 | - | ||
| 32 | - default MailAccountDO selectByUserNameAndId(String userName,Long id){ | ||
| 33 | - return selectOne(new QueryWrapperX<MailAccountDO>() | ||
| 34 | - .eqIfPresent("username" , userName) | ||
| 35 | - .neIfPresent("id" , id)); | 15 | + return selectPage(pageReqVO, new LambdaQueryWrapperX<MailAccountDO>() |
| 16 | + .likeIfPresent(MailAccountDO::getMail, pageReqVO.getMail()) | ||
| 17 | + .likeIfPresent(MailAccountDO::getUsername , pageReqVO.getUsername())); | ||
| 36 | } | 18 | } |
| 37 | 19 | ||
| 38 | default MailAccountDO selectOneByFrom(String from){ | 20 | default MailAccountDO selectOneByFrom(String from){ |
| @@ -40,6 +22,4 @@ public interface MailAccountMapper extends BaseMapperX<MailAccountDO> { | @@ -40,6 +22,4 @@ public interface MailAccountMapper extends BaseMapperX<MailAccountDO> { | ||
| 40 | .eqIfPresent("from_address" , from)); | 22 | .eqIfPresent("from_address" , from)); |
| 41 | } | 23 | } |
| 42 | 24 | ||
| 43 | - @Select("SELECT COUNT(*) FROM system_mail_account WHERE update_time > #{maxUpdateTime}") | ||
| 44 | - Long selectCountByUpdateTimeGt(Date maxUpdateTime); | ||
| 45 | } | 25 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/mail/MailTemplateMapper.java
| @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; | ||
| 5 | import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; |
| 6 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; | 6 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; |
| 7 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | 7 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; |
| 8 | +import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; | ||
| 8 | import org.apache.ibatis.annotations.Mapper; | 9 | import org.apache.ibatis.annotations.Mapper; |
| 9 | import org.apache.ibatis.annotations.Select; | 10 | import org.apache.ibatis.annotations.Select; |
| 10 | 11 | ||
| @@ -36,5 +37,10 @@ public interface MailTemplateMapper extends BaseMapperX<MailTemplateDO> { | @@ -36,5 +37,10 @@ public interface MailTemplateMapper extends BaseMapperX<MailTemplateDO> { | ||
| 36 | default MailTemplateDO selectOneByAccountId(Long accountId){ | 37 | default MailTemplateDO selectOneByAccountId(Long accountId){ |
| 37 | return selectOne(new QueryWrapperX<MailTemplateDO>() | 38 | return selectOne(new QueryWrapperX<MailTemplateDO>() |
| 38 | .eqIfPresent("account_id" , accountId)); | 39 | .eqIfPresent("account_id" , accountId)); |
| 39 | - }; | 40 | + } |
| 41 | + | ||
| 42 | + default Long selectCountByAccountId(Long accountId) { | ||
| 43 | + return selectCount(MailTemplateDO::getAccountId, accountId); | ||
| 44 | + } | ||
| 45 | + | ||
| 40 | } | 46 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/mq/producer/mail/MailProducer.java
| @@ -55,7 +55,7 @@ public class MailProducer { | @@ -55,7 +55,7 @@ public class MailProducer { | ||
| 55 | public void sendMailSendMessage(Long sendLogId,MailAccountDO mailAccountDO, MailTemplateDO mailTemplateDO, String content,List<KeyValue<String, Object>> templateParams,String to) { | 55 | public void sendMailSendMessage(Long sendLogId,MailAccountDO mailAccountDO, MailTemplateDO mailTemplateDO, String content,List<KeyValue<String, Object>> templateParams,String to) { |
| 56 | MailSendMessage message = new MailSendMessage(); | 56 | MailSendMessage message = new MailSendMessage(); |
| 57 | message.setContent(content) | 57 | message.setContent(content) |
| 58 | - .setFromAddress(mailAccountDO.getFromAddress()) | 58 | + .setFromAddress(mailAccountDO.getMail()) |
| 59 | .setHost(mailAccountDO.getHost()) | 59 | .setHost(mailAccountDO.getHost()) |
| 60 | .setPort(mailAccountDO.getPort()) | 60 | .setPort(mailAccountDO.getPort()) |
| 61 | .setPassword(mailAccountDO.getPassword()) | 61 | .setPassword(mailAccountDO.getPassword()) |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailAccountService.java
| @@ -28,21 +28,21 @@ public interface MailAccountService { | @@ -28,21 +28,21 @@ public interface MailAccountService { | ||
| 28 | * @param createReqVO 邮箱账号信息 | 28 | * @param createReqVO 邮箱账号信息 |
| 29 | * @return 编号 | 29 | * @return 编号 |
| 30 | */ | 30 | */ |
| 31 | - Long create(@Valid MailAccountCreateReqVO createReqVO); | 31 | + Long createMailAccount(@Valid MailAccountCreateReqVO createReqVO); |
| 32 | 32 | ||
| 33 | /** | 33 | /** |
| 34 | * 修改邮箱账号 | 34 | * 修改邮箱账号 |
| 35 | * | 35 | * |
| 36 | * @param updateReqVO 邮箱账号信息 | 36 | * @param updateReqVO 邮箱账号信息 |
| 37 | */ | 37 | */ |
| 38 | - void update(@Valid MailAccountUpdateReqVO updateReqVO); | 38 | + void updateMailAccount(@Valid MailAccountUpdateReqVO updateReqVO); |
| 39 | 39 | ||
| 40 | /** | 40 | /** |
| 41 | * 删除邮箱账号 | 41 | * 删除邮箱账号 |
| 42 | * | 42 | * |
| 43 | * @param id 编号 | 43 | * @param id 编号 |
| 44 | */ | 44 | */ |
| 45 | - void delete(Long id); | 45 | + void deleteMailAccount(Long id); |
| 46 | 46 | ||
| 47 | /** | 47 | /** |
| 48 | * 获取邮箱账号信息 | 48 | * 获取邮箱账号信息 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateService.java
| @@ -85,4 +85,12 @@ public interface MailTemplateService { | @@ -85,4 +85,12 @@ public interface MailTemplateService { | ||
| 85 | */ | 85 | */ |
| 86 | String formatMailTemplateContent(String content, Map<String, String> params); | 86 | String formatMailTemplateContent(String content, Map<String, String> params); |
| 87 | 87 | ||
| 88 | + /** | ||
| 89 | + * 获得指定邮箱账号下的邮件模板数量 | ||
| 90 | + * | ||
| 91 | + * @param accountId 账号编号 | ||
| 92 | + * @return 数量 | ||
| 93 | + */ | ||
| 94 | + long countByAccountId(Long accountId); | ||
| 95 | + | ||
| 88 | } | 96 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailAccountServiceImpl.java
| 1 | package cn.iocoder.yudao.module.system.service.mail.impl; | 1 | package cn.iocoder.yudao.module.system.service.mail.impl; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.collection.CollUtil; | ||
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 6 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountCreateReqVO; | 4 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountCreateReqVO; |
| 7 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; | 5 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountPageReqVO; |
| 8 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountUpdateReqVO; | 6 | import cn.iocoder.yudao.module.system.controller.admin.mail.vo.account.MailAccountUpdateReqVO; |
| 9 | import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert; | 7 | import cn.iocoder.yudao.module.system.convert.mail.MailAccountConvert; |
| 10 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; | 8 | import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; |
| 11 | -import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | ||
| 12 | -import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO; | ||
| 13 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper; | 9 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailAccountMapper; |
| 14 | -import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; | ||
| 15 | import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; | 10 | import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; |
| 16 | import cn.iocoder.yudao.module.system.service.mail.MailAccountService; | 11 | import cn.iocoder.yudao.module.system.service.mail.MailAccountService; |
| 12 | +import cn.iocoder.yudao.module.system.service.mail.MailTemplateService; | ||
| 17 | import lombok.extern.slf4j.Slf4j; | 13 | import lombok.extern.slf4j.Slf4j; |
| 18 | import org.springframework.stereotype.Service; | 14 | import org.springframework.stereotype.Service; |
| 19 | import org.springframework.validation.annotation.Validated; | 15 | import org.springframework.validation.annotation.Validated; |
| 20 | 16 | ||
| 21 | import javax.annotation.PostConstruct; | 17 | import javax.annotation.PostConstruct; |
| 22 | import javax.annotation.Resource; | 18 | import javax.annotation.Resource; |
| 23 | -import java.util.Date; | ||
| 24 | import java.util.List; | 19 | import java.util.List; |
| 25 | import java.util.Map; | 20 | import java.util.Map; |
| 26 | 21 | ||
| 27 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 22 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 28 | -import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; | ||
| 29 | - | 23 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; |
| 24 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_NOT_EXISTS; | ||
| 25 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS; | ||
| 30 | 26 | ||
| 31 | /** | 27 | /** |
| 32 | * 邮箱账号 Service 实现类 | 28 | * 邮箱账号 Service 实现类 |
| @@ -43,7 +39,7 @@ public class MailAccountServiceImpl implements MailAccountService { | @@ -43,7 +39,7 @@ public class MailAccountServiceImpl implements MailAccountService { | ||
| 43 | private MailAccountMapper mailAccountMapper; | 39 | private MailAccountMapper mailAccountMapper; |
| 44 | 40 | ||
| 45 | @Resource | 41 | @Resource |
| 46 | - private MailTemplateMapper mailTemplateMapper; | 42 | + private MailTemplateService mailTemplateService; |
| 47 | 43 | ||
| 48 | @Resource | 44 | @Resource |
| 49 | private MailProducer mailProducer; | 45 | private MailProducer mailProducer; |
| @@ -56,75 +52,61 @@ public class MailAccountServiceImpl implements MailAccountService { | @@ -56,75 +52,61 @@ public class MailAccountServiceImpl implements MailAccountService { | ||
| 56 | */ | 52 | */ |
| 57 | private volatile Map<Long, MailAccountDO> mailAccountCache; | 53 | private volatile Map<Long, MailAccountDO> mailAccountCache; |
| 58 | 54 | ||
| 59 | - /** | ||
| 60 | - * 缓存菜单的最大更新时间,用于后续的增量轮询,判断是否有更新 | ||
| 61 | - */ | ||
| 62 | - private volatile Date maxUpdateTime; | ||
| 63 | - | ||
| 64 | @Override | 55 | @Override |
| 65 | @PostConstruct | 56 | @PostConstruct |
| 66 | public void initLocalCache() { | 57 | public void initLocalCache() { |
| 67 | - List<MailAccountDO> mailAccountDOList = this.loadMailAccountIfUpdate(maxUpdateTime); | ||
| 68 | - if (CollUtil.isEmpty(mailAccountDOList)) { | ||
| 69 | - return; | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - // 写入缓存 | ||
| 73 | - mailAccountCache = CollectionUtils.convertMap(mailAccountDOList, MailAccountDO::getId); | ||
| 74 | - maxUpdateTime = CollectionUtils.getMaxValue(mailAccountDOList, MailAccountDO::getUpdateTime); | ||
| 75 | - log.info("[initLocalCache][初始化 MailAccount 数量为 {}]", mailAccountDOList.size()); | ||
| 76 | - } | 58 | + // 第一步:查询数据 |
| 59 | + List<MailAccountDO> accounts = mailAccountMapper.selectList(); | ||
| 60 | + log.info("[initLocalCache][缓存邮箱账号,数量:{}]", accounts.size()); | ||
| 77 | 61 | ||
| 78 | - private List<MailAccountDO> loadMailAccountIfUpdate(Date maxUpdateTime) { | ||
| 79 | - //第一步 判断是否需要更新 | ||
| 80 | - if(null == maxUpdateTime){ // 如果更新时间为空,说明 DB 一定有新数据 | ||
| 81 | - log.info("[loadMailAccountIfUpdate][首次加载全量账号信息]"); | ||
| 82 | - }else{ // 判断数据库中是否有更新的账号信息 | ||
| 83 | - if (mailAccountMapper.selectCountByUpdateTimeGt(maxUpdateTime) == 0) { | ||
| 84 | - return null; | ||
| 85 | - } | ||
| 86 | - log.info("[loadMailAccountIfUpdate][增量加载全量账号信息]"); | ||
| 87 | - } | ||
| 88 | - return mailAccountMapper.selectList(); | 62 | + // 第二步:构建缓存 |
| 63 | + mailAccountCache = convertMap(accounts, MailAccountDO::getId); | ||
| 89 | } | 64 | } |
| 90 | 65 | ||
| 91 | @Override | 66 | @Override |
| 92 | - public Long create(MailAccountCreateReqVO createReqVO) { | ||
| 93 | - // username 要校验唯一 | ||
| 94 | - this.validateMailAccountOnlyByUserName(createReqVO.getUsername()); | ||
| 95 | - MailAccountDO mailAccountDO = MailAccountConvert.INSTANCE.convert(createReqVO); | ||
| 96 | - mailAccountMapper.insert(mailAccountDO); | 67 | + public Long createMailAccount(MailAccountCreateReqVO createReqVO) { |
| 68 | + // 插入 | ||
| 69 | + MailAccountDO account = MailAccountConvert.INSTANCE.convert(createReqVO); | ||
| 70 | + mailAccountMapper.insert(account); | ||
| 97 | 71 | ||
| 98 | - // 更新 | 72 | + // 发送刷新消息 |
| 99 | mailProducer.sendMailAccountRefreshMessage(); | 73 | mailProducer.sendMailAccountRefreshMessage(); |
| 100 | - return mailAccountDO.getId(); | 74 | + return account.getId(); |
| 101 | } | 75 | } |
| 102 | 76 | ||
| 103 | @Override | 77 | @Override |
| 104 | - public void update(MailAccountUpdateReqVO updateReqVO) { | ||
| 105 | - // username 要校验唯一 TODO @wangjingyi:校验唯一的时候,需要排除掉自己 DONE | ||
| 106 | - this.validateMailAccountOnlyByUserNameAndId(updateReqVO.getUsername(),updateReqVO.getId()); | ||
| 107 | - MailAccountDO mailAccountDO = MailAccountConvert.INSTANCE.convert(updateReqVO); | 78 | + public void updateMailAccount(MailAccountUpdateReqVO updateReqVO) { |
| 108 | // 校验是否存在 | 79 | // 校验是否存在 |
| 109 | - validateMailAccountExists(mailAccountDO.getId()); | 80 | + validateMailAccountExists(updateReqVO.getId()); |
| 110 | 81 | ||
| 111 | // 更新 | 82 | // 更新 |
| 83 | + MailAccountDO updateObj = MailAccountConvert.INSTANCE.convert(updateReqVO); | ||
| 84 | + mailAccountMapper.updateById(updateObj); | ||
| 85 | + // 发送刷新消息 | ||
| 112 | mailProducer.sendMailAccountRefreshMessage(); | 86 | mailProducer.sendMailAccountRefreshMessage(); |
| 113 | - mailAccountMapper.updateById(mailAccountDO); | ||
| 114 | } | 87 | } |
| 115 | 88 | ||
| 116 | @Override | 89 | @Override |
| 117 | - public void delete(Long id) { | 90 | + public void deleteMailAccount(Long id) { |
| 118 | // 校验是否存在账号 | 91 | // 校验是否存在账号 |
| 119 | validateMailAccountExists(id); | 92 | validateMailAccountExists(id); |
| 120 | // 校验是否存在关联模版 | 93 | // 校验是否存在关联模版 |
| 121 | - validateMailTemplateByAccountId(id); | 94 | + if (mailTemplateService.countByAccountId(id) > 0) { |
| 95 | + throw exception(MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS); | ||
| 96 | + } | ||
| 97 | + | ||
| 122 | // 删除 | 98 | // 删除 |
| 123 | mailAccountMapper.deleteById(id); | 99 | mailAccountMapper.deleteById(id); |
| 124 | - // 更新 | 100 | + // 发送刷新消息 |
| 125 | mailProducer.sendMailAccountRefreshMessage(); | 101 | mailProducer.sendMailAccountRefreshMessage(); |
| 126 | } | 102 | } |
| 127 | 103 | ||
| 104 | + private void validateMailAccountExists(Long id) { | ||
| 105 | + if (mailAccountMapper.selectById(id) == null) { | ||
| 106 | + throw exception(MAIL_ACCOUNT_NOT_EXISTS); | ||
| 107 | + } | ||
| 108 | + } | ||
| 109 | + | ||
| 128 | @Override | 110 | @Override |
| 129 | public MailAccountDO getMailAccount(Long id) { | 111 | public MailAccountDO getMailAccount(Long id) { |
| 130 | return mailAccountMapper.selectById(id); | 112 | return mailAccountMapper.selectById(id); |
| @@ -140,33 +122,4 @@ public class MailAccountServiceImpl implements MailAccountService { | @@ -140,33 +122,4 @@ public class MailAccountServiceImpl implements MailAccountService { | ||
| 140 | return mailAccountMapper.selectList(); | 122 | return mailAccountMapper.selectList(); |
| 141 | } | 123 | } |
| 142 | 124 | ||
| 143 | - private void validateMailAccountExists(Long id) { | ||
| 144 | - if (mailAccountMapper.selectById(id) == null) { | ||
| 145 | - throw exception(MAIL_ACCOUNT_NOT_EXISTS); | ||
| 146 | - } | ||
| 147 | - } | ||
| 148 | - | ||
| 149 | - private void validateMailAccountOnlyByUserName(String userName){ | ||
| 150 | - mailAccountCache.forEach((key,value)->{ | ||
| 151 | - if(value.getUsername().equals(userName)){ | ||
| 152 | - throw exception(MAIL_ACCOUNT_EXISTS); | ||
| 153 | - } | ||
| 154 | - }); | ||
| 155 | - } | ||
| 156 | - private void validateMailAccountOnlyByUserNameAndId(String userName,Long id){ | ||
| 157 | - mailAccountCache.forEach((key , value)->{ | ||
| 158 | - if (value.getUsername().equals(userName)){ | ||
| 159 | - if (!key.equals(id)){ | ||
| 160 | - throw exception(MAIL_ACCOUNT_EXISTS); | ||
| 161 | - } | ||
| 162 | - } | ||
| 163 | - }); | ||
| 164 | - } | ||
| 165 | - private void validateMailTemplateByAccountId(Long accountId){ | ||
| 166 | - MailTemplateDO mailTemplateDO = mailTemplateMapper.selectOneByAccountId(accountId); | ||
| 167 | - if (mailTemplateDO != null) { | ||
| 168 | - // TODO wangjingyi:MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS DONE | ||
| 169 | - throw exception(MAIL_ACCOUNT_RELATE_TEMPLATE_EXISTS); | ||
| 170 | - } | ||
| 171 | - } | ||
| 172 | } | 125 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailLogServiceImpl.java
| @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | @@ -9,7 +9,6 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | ||
| 9 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailLogMapper; | 9 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailLogMapper; |
| 10 | import cn.iocoder.yudao.module.system.enums.mail.MailSendStatusEnum; | 10 | import cn.iocoder.yudao.module.system.enums.mail.MailSendStatusEnum; |
| 11 | import cn.iocoder.yudao.module.system.service.mail.MailLogService; | 11 | import cn.iocoder.yudao.module.system.service.mail.MailLogService; |
| 12 | -import org.springframework.beans.factory.annotation.Autowired; | ||
| 13 | import org.springframework.stereotype.Service; | 12 | import org.springframework.stereotype.Service; |
| 14 | import org.springframework.validation.annotation.Validated; | 13 | import org.springframework.validation.annotation.Validated; |
| 15 | 14 | ||
| @@ -51,7 +50,7 @@ public class MailLogServiceImpl implements MailLogService { | @@ -51,7 +50,7 @@ public class MailLogServiceImpl implements MailLogService { | ||
| 51 | logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() | 50 | logDOBuilder.sendStatus(Objects.equals(isSend, true) ? MailSendStatusEnum.INIT.getStatus() |
| 52 | : MailSendStatusEnum.IGNORE.getStatus()) | 51 | : MailSendStatusEnum.IGNORE.getStatus()) |
| 53 | // 设置邮箱相关字段 | 52 | // 设置邮箱相关字段 |
| 54 | - .fromAddress(mailAccountDO.getFromAddress()) | 53 | + .fromMail(mailAccountDO.getMail()) |
| 55 | .accountId(mailAccountDO.getId()) | 54 | .accountId(mailAccountDO.getId()) |
| 56 | // TODO @wangjingyi:userId、userType | 55 | // TODO @wangjingyi:userId、userType |
| 57 | //用户信息 | 56 | //用户信息 |
| @@ -60,7 +59,7 @@ public class MailLogServiceImpl implements MailLogService { | @@ -60,7 +59,7 @@ public class MailLogServiceImpl implements MailLogService { | ||
| 60 | .templateId(template.getId()).templateParams(templateParams).templateContent(templateContent); | 59 | .templateId(template.getId()).templateParams(templateParams).templateContent(templateContent); |
| 61 | 60 | ||
| 62 | 61 | ||
| 63 | - logDOBuilder.fromAddress(mailAccountDO.getFromAddress()); | 62 | + logDOBuilder.fromMail(mailAccountDO.getMail()); |
| 64 | logDOBuilder.accountId(mailAccountDO.getId()); | 63 | logDOBuilder.accountId(mailAccountDO.getId()); |
| 65 | // TODO @wangjingyi:每个接收人一条日志。发送多个人,就调用多次,业务方。因为某个邮箱有问题,会导致所有都发送失败。 DONE | 64 | // TODO @wangjingyi:每个接收人一条日志。发送多个人,就调用多次,业务方。因为某个邮箱有问题,会导致所有都发送失败。 DONE |
| 66 | // 设置模板相关字段 | 65 | // 设置模板相关字段 |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/impl/MailTemplateServiceImpl.java
| @@ -53,19 +53,19 @@ public class MailTemplateServiceImpl implements MailTemplateService { | @@ -53,19 +53,19 @@ public class MailTemplateServiceImpl implements MailTemplateService { | ||
| 53 | */ | 53 | */ |
| 54 | private volatile Map<Long, MailTemplateDO> mailTemplateCache; | 54 | private volatile Map<Long, MailTemplateDO> mailTemplateCache; |
| 55 | 55 | ||
| 56 | - private volatile Date maxUpdateTime; | ||
| 57 | - | ||
| 58 | @Override | 56 | @Override |
| 59 | @PostConstruct | 57 | @PostConstruct |
| 60 | public void initLocalCache() { | 58 | public void initLocalCache() { |
| 61 | - List<MailTemplateDO> mailTemplateDOList = this.loadMailTemplateIfUpdate(maxUpdateTime); | 59 | + if (true) { |
| 60 | + return; | ||
| 61 | + } | ||
| 62 | + List<MailTemplateDO> mailTemplateDOList = this.loadMailTemplateIfUpdate(null); | ||
| 62 | if (CollUtil.isEmpty(mailTemplateDOList)) { | 63 | if (CollUtil.isEmpty(mailTemplateDOList)) { |
| 63 | return; | 64 | return; |
| 64 | } | 65 | } |
| 65 | 66 | ||
| 66 | // 写入缓存 | 67 | // 写入缓存 |
| 67 | mailTemplateCache = CollectionUtils.convertMap(mailTemplateDOList, MailTemplateDO::getId); | 68 | mailTemplateCache = CollectionUtils.convertMap(mailTemplateDOList, MailTemplateDO::getId); |
| 68 | - maxUpdateTime = CollectionUtils.getMaxValue(mailTemplateDOList, MailTemplateDO::getUpdateTime); | ||
| 69 | log.info("[initLocalCache][初始化 mailTemplate 数量为 {}]", mailTemplateDOList.size()); | 69 | log.info("[initLocalCache][初始化 mailTemplate 数量为 {}]", mailTemplateDOList.size()); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| @@ -156,4 +156,10 @@ public class MailTemplateServiceImpl implements MailTemplateService { | @@ -156,4 +156,10 @@ public class MailTemplateServiceImpl implements MailTemplateService { | ||
| 156 | // 第二步,如果有更新,则从数据库加载所有邮件模板 | 156 | // 第二步,如果有更新,则从数据库加载所有邮件模板 |
| 157 | return mailTemplateMapper.selectList(); | 157 | return mailTemplateMapper.selectList(); |
| 158 | } | 158 | } |
| 159 | + | ||
| 160 | + @Override | ||
| 161 | + public long countByAccountId(Long accountId) { | ||
| 162 | + return mailTemplateMapper.selectCountByAccountId(accountId); | ||
| 163 | + } | ||
| 164 | + | ||
| 159 | } | 165 | } |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsChannelServiceImpl.java
| @@ -81,7 +81,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { | @@ -81,7 +81,7 @@ public class SmsChannelServiceImpl implements SmsChannelService { | ||
| 81 | public void deleteSmsChannel(Long id) { | 81 | public void deleteSmsChannel(Long id) { |
| 82 | // 校验存在 | 82 | // 校验存在 |
| 83 | this.validateSmsChannelExists(id); | 83 | this.validateSmsChannelExists(id); |
| 84 | - // 校验是否有字典数据 | 84 | + // 校验是否有在使用该账号的模版 |
| 85 | if (smsTemplateService.countByChannelId(id) > 0) { | 85 | if (smsTemplateService.countByChannelId(id) > 0) { |
| 86 | throw exception(SMS_CHANNEL_HAS_CHILDREN); | 86 | throw exception(SMS_CHANNEL_HAS_CHILDREN); |
| 87 | } | 87 | } |
yudao-ui-admin/src/api/system/mail/account.js
0 → 100755
| 1 | +import request from '@/utils/request' | ||
| 2 | + | ||
| 3 | +// 创建邮箱账号 | ||
| 4 | +export function createMailAccount(data) { | ||
| 5 | + return request({ | ||
| 6 | + url: '/system/mail-account/create', | ||
| 7 | + method: 'post', | ||
| 8 | + data: data | ||
| 9 | + }) | ||
| 10 | +} | ||
| 11 | + | ||
| 12 | +// 更新邮箱账号 | ||
| 13 | +export function updateMailAccount(data) { | ||
| 14 | + return request({ | ||
| 15 | + url: '/system/mail-account/update', | ||
| 16 | + method: 'put', | ||
| 17 | + data: data | ||
| 18 | + }) | ||
| 19 | +} | ||
| 20 | + | ||
| 21 | +// 删除邮箱账号 | ||
| 22 | +export function deleteMailAccount(id) { | ||
| 23 | + return request({ | ||
| 24 | + url: '/system/mail-account/delete?id=' + id, | ||
| 25 | + method: 'delete' | ||
| 26 | + }) | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +// 获得邮箱账号 | ||
| 30 | +export function getMailAccount(id) { | ||
| 31 | + return request({ | ||
| 32 | + url: '/system/mail-account/get?id=' + id, | ||
| 33 | + method: 'get' | ||
| 34 | + }) | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | +// 获得邮箱账号分页 | ||
| 38 | +export function getMailAccountPage(query) { | ||
| 39 | + return request({ | ||
| 40 | + url: '/system/mail-account/page', | ||
| 41 | + method: 'get', | ||
| 42 | + params: query | ||
| 43 | + }) | ||
| 44 | +} |
yudao-ui-admin/src/views/system/mail/account/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="mail"> | ||
| 7 | + <el-input v-model="queryParams.mail" placeholder="请输入邮箱" clearable @keyup.enter.native="handleQuery"/> | ||
| 8 | + </el-form-item> | ||
| 9 | + <el-form-item label="用户名" prop="username"> | ||
| 10 | + <el-input v-model="queryParams.username" placeholder="请输入用户名" clearable @keyup.enter.native="handleQuery"/> | ||
| 11 | + </el-form-item> | ||
| 12 | + <el-form-item> | ||
| 13 | + <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button> | ||
| 14 | + <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button> | ||
| 15 | + </el-form-item> | ||
| 16 | + </el-form> | ||
| 17 | + | ||
| 18 | + <!-- 操作工具栏 --> | ||
| 19 | + <el-row :gutter="10" class="mb8"> | ||
| 20 | + <el-col :span="1.5"> | ||
| 21 | + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" | ||
| 22 | + v-hasPermi="['system:mail-account:create']">新增</el-button> | ||
| 23 | + </el-col> | ||
| 24 | + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> | ||
| 25 | + </el-row> | ||
| 26 | + | ||
| 27 | + <!-- 列表 --> | ||
| 28 | + <el-table v-loading="loading" :data="list"> | ||
| 29 | + <el-table-column label="主键" align="center" prop="id" /> | ||
| 30 | + <el-table-column label="邮箱" align="center" prop="mail" /> | ||
| 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" /> | ||
| 34 | + <el-table-column label="是否开启 SSL" align="center" prop="sslEnable"> | ||
| 35 | + <template v-slot="scope"> | ||
| 36 | + <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.sslEnable" /> | ||
| 37 | + </template> | ||
| 38 | + </el-table-column> | ||
| 39 | + <el-table-column label="创建时间" align="center" prop="createTime" width="180"> | ||
| 40 | + <template v-slot="scope"> | ||
| 41 | + <span>{{ parseTime(scope.row.createTime) }}</span> | ||
| 42 | + </template> | ||
| 43 | + </el-table-column> | ||
| 44 | + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | ||
| 45 | + <template v-slot="scope"> | ||
| 46 | + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" | ||
| 47 | + v-hasPermi="['system:mail-account:update']">修改</el-button> | ||
| 48 | + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" | ||
| 49 | + v-hasPermi="['system:mail-account:delete']">删除</el-button> | ||
| 50 | + </template> | ||
| 51 | + </el-table-column> | ||
| 52 | + </el-table> | ||
| 53 | + <!-- 分页组件 --> | ||
| 54 | + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" | ||
| 55 | + @pagination="getList"/> | ||
| 56 | + | ||
| 57 | + <!-- 对话框(添加 / 修改) --> | ||
| 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"> | ||
| 60 | + <el-form-item label="邮箱" prop="mail"> | ||
| 61 | + <el-input v-model="form.mail" placeholder="请输入邮箱" /> | ||
| 62 | + </el-form-item> | ||
| 63 | + <el-form-item label="用户名" prop="username"> | ||
| 64 | + <el-input v-model="form.username" placeholder="请输入用户名" /> | ||
| 65 | + </el-form-item> | ||
| 66 | + <el-form-item label="密码" prop="password"> | ||
| 67 | + <el-input v-model="form.password" placeholder="请输入密码" /> | ||
| 68 | + </el-form-item> | ||
| 69 | + <el-form-item label="主机" prop="host"> | ||
| 70 | + <el-input v-model="form.host" placeholder="请输入主机" /> | ||
| 71 | + </el-form-item> | ||
| 72 | + <el-form-item label="端口" prop="port"> | ||
| 73 | + <el-input v-model="form.port" placeholder="请输入端口" /> | ||
| 74 | + </el-form-item> | ||
| 75 | + <el-form-item label="是否开启 SSL" prop="sslEnable"> | ||
| 76 | + <el-radio-group v-model="form.sslEnable"> | ||
| 77 | + <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.INFRA_BOOLEAN_STRING)" | ||
| 78 | + :key="dict.value" :label="dict.value === 'true'">{{dict.label}}</el-radio> | ||
| 79 | + </el-radio-group> | ||
| 80 | + </el-form-item> | ||
| 81 | + </el-form> | ||
| 82 | + <div slot="footer" class="dialog-footer"> | ||
| 83 | + <el-button type="primary" @click="submitForm">确 定</el-button> | ||
| 84 | + <el-button @click="cancel">取 消</el-button> | ||
| 85 | + </div> | ||
| 86 | + </el-dialog> | ||
| 87 | + </div> | ||
| 88 | +</template> | ||
| 89 | + | ||
| 90 | +<script> | ||
| 91 | +import { createMailAccount, updateMailAccount, deleteMailAccount, getMailAccount, getMailAccountPage } from "@/api/system/mail/account"; | ||
| 92 | + | ||
| 93 | +export default { | ||
| 94 | + name: "MailAccount", | ||
| 95 | + components: { | ||
| 96 | + }, | ||
| 97 | + data() { | ||
| 98 | + return { | ||
| 99 | + // 遮罩层 | ||
| 100 | + loading: true, | ||
| 101 | + // 导出遮罩层 | ||
| 102 | + exportLoading: false, | ||
| 103 | + // 显示搜索条件 | ||
| 104 | + showSearch: true, | ||
| 105 | + // 总条数 | ||
| 106 | + total: 0, | ||
| 107 | + // 邮箱账号列表 | ||
| 108 | + list: [], | ||
| 109 | + // 弹出层标题 | ||
| 110 | + title: "", | ||
| 111 | + // 是否显示弹出层 | ||
| 112 | + open: false, | ||
| 113 | + // 查询参数 | ||
| 114 | + queryParams: { | ||
| 115 | + pageNo: 1, | ||
| 116 | + pageSize: 10, | ||
| 117 | + mail: null, | ||
| 118 | + username: null | ||
| 119 | + }, | ||
| 120 | + // 表单参数 | ||
| 121 | + form: {}, | ||
| 122 | + // 表单校验 | ||
| 123 | + rules: { | ||
| 124 | + mail: [{ required: true, message: "邮箱不能为空", trigger: "blur" }], | ||
| 125 | + username: [{ 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" }], | ||
| 129 | + sslEnable: [{ required: true, message: "是否开启 SSL不能为空", trigger: "blur" }], | ||
| 130 | + } | ||
| 131 | + }; | ||
| 132 | + }, | ||
| 133 | + created() { | ||
| 134 | + this.getList(); | ||
| 135 | + }, | ||
| 136 | + methods: { | ||
| 137 | + /** 查询列表 */ | ||
| 138 | + getList() { | ||
| 139 | + this.loading = true; | ||
| 140 | + // 执行查询 | ||
| 141 | + getMailAccountPage(this.queryParams).then(response => { | ||
| 142 | + this.list = response.data.list; | ||
| 143 | + this.total = response.data.total; | ||
| 144 | + this.loading = false; | ||
| 145 | + }); | ||
| 146 | + }, | ||
| 147 | + /** 取消按钮 */ | ||
| 148 | + cancel() { | ||
| 149 | + this.open = false; | ||
| 150 | + this.reset(); | ||
| 151 | + }, | ||
| 152 | + /** 表单重置 */ | ||
| 153 | + reset() { | ||
| 154 | + this.form = { | ||
| 155 | + id: undefined, | ||
| 156 | + mail: undefined, | ||
| 157 | + username: undefined, | ||
| 158 | + password: undefined, | ||
| 159 | + host: undefined, | ||
| 160 | + port: undefined, | ||
| 161 | + sslEnable: true, | ||
| 162 | + }; | ||
| 163 | + this.resetForm("form"); | ||
| 164 | + }, | ||
| 165 | + /** 搜索按钮操作 */ | ||
| 166 | + handleQuery() { | ||
| 167 | + this.queryParams.pageNo = 1; | ||
| 168 | + this.getList(); | ||
| 169 | + }, | ||
| 170 | + /** 重置按钮操作 */ | ||
| 171 | + resetQuery() { | ||
| 172 | + this.resetForm("queryForm"); | ||
| 173 | + this.handleQuery(); | ||
| 174 | + }, | ||
| 175 | + /** 新增按钮操作 */ | ||
| 176 | + handleAdd() { | ||
| 177 | + this.reset(); | ||
| 178 | + this.open = true; | ||
| 179 | + this.title = "添加邮箱账号"; | ||
| 180 | + }, | ||
| 181 | + /** 修改按钮操作 */ | ||
| 182 | + handleUpdate(row) { | ||
| 183 | + this.reset(); | ||
| 184 | + const id = row.id; | ||
| 185 | + getMailAccount(id).then(response => { | ||
| 186 | + this.form = response.data; | ||
| 187 | + this.open = true; | ||
| 188 | + this.title = "修改邮箱账号"; | ||
| 189 | + }); | ||
| 190 | + }, | ||
| 191 | + /** 提交按钮 */ | ||
| 192 | + submitForm() { | ||
| 193 | + this.$refs["form"].validate(valid => { | ||
| 194 | + if (!valid) { | ||
| 195 | + return; | ||
| 196 | + } | ||
| 197 | + // 修改的提交 | ||
| 198 | + if (this.form.id != null) { | ||
| 199 | + updateMailAccount(this.form).then(response => { | ||
| 200 | + this.$modal.msgSuccess("修改成功"); | ||
| 201 | + this.open = false; | ||
| 202 | + this.getList(); | ||
| 203 | + }); | ||
| 204 | + return; | ||
| 205 | + } | ||
| 206 | + // 添加的提交 | ||
| 207 | + createMailAccount(this.form).then(response => { | ||
| 208 | + this.$modal.msgSuccess("新增成功"); | ||
| 209 | + this.open = false; | ||
| 210 | + this.getList(); | ||
| 211 | + }); | ||
| 212 | + }); | ||
| 213 | + }, | ||
| 214 | + /** 删除按钮操作 */ | ||
| 215 | + handleDelete(row) { | ||
| 216 | + const id = row.id; | ||
| 217 | + this.$modal.confirm('是否确认删除邮箱账号编号为"' + id + '"的数据项?').then(function() { | ||
| 218 | + return deleteMailAccount(id); | ||
| 219 | + }).then(() => { | ||
| 220 | + this.getList(); | ||
| 221 | + this.$modal.msgSuccess("删除成功"); | ||
| 222 | + }).catch(() => {}); | ||
| 223 | + } | ||
| 224 | + } | ||
| 225 | +}; | ||
| 226 | +</script> |