Commit c0b029b2447e381436b83a35a2dcdbac680baf62
1 parent
0895ee7d
邮箱模块:完善 template 的单元测试
Showing
9 changed files
with
300 additions
and
22 deletions
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java
| @@ -41,6 +41,11 @@ public class LocalDateTimeUtils { | @@ -41,6 +41,11 @@ public class LocalDateTimeUtils { | ||
| 41 | return LocalDateTime.of(year, mouth, day, 0, 0, 0); | 41 | return LocalDateTime.of(year, mouth, day, 0, 0, 0); |
| 42 | } | 42 | } |
| 43 | 43 | ||
| 44 | + public static LocalDateTime[] buildBetweenTime(int year1, int mouth1, int day1, | ||
| 45 | + int year2, int mouth2, int day2) { | ||
| 46 | + return new LocalDateTime[]{buildTime(year1, mouth1, day1), buildTime(year2, mouth2, day2)}; | ||
| 47 | + } | ||
| 48 | + | ||
| 44 | /** | 49 | /** |
| 45 | * 判断当前时间是否在该时间范围内 | 50 | * 判断当前时间是否在该时间范围内 |
| 46 | * | 51 | * |
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImpl.java
| @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | ||
| 12 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; | 12 | import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; |
| 13 | import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; | 13 | import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; |
| 14 | import com.google.common.annotations.VisibleForTesting; | 14 | import com.google.common.annotations.VisibleForTesting; |
| 15 | +import lombok.Getter; | ||
| 15 | import lombok.extern.slf4j.Slf4j; | 16 | import lombok.extern.slf4j.Slf4j; |
| 16 | import org.springframework.stereotype.Service; | 17 | import org.springframework.stereotype.Service; |
| 17 | import org.springframework.validation.annotation.Validated; | 18 | import org.springframework.validation.annotation.Validated; |
| @@ -55,6 +56,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { | @@ -55,6 +56,7 @@ public class MailTemplateServiceImpl implements MailTemplateService { | ||
| 55 | * | 56 | * |
| 56 | * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 | 57 | * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 |
| 57 | */ | 58 | */ |
| 59 | + @Getter | ||
| 58 | private volatile Map<String, MailTemplateDO> mailTemplateCache; | 60 | private volatile Map<String, MailTemplateDO> mailTemplateCache; |
| 59 | 61 | ||
| 60 | @Override | 62 | @Override |
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/mail/MailTemplateServiceImplTest.java
0 → 100755
| 1 | +package cn.iocoder.yudao.module.system.service.mail; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||
| 4 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 5 | +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; | ||
| 6 | +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateCreateReqVO; | ||
| 7 | +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplatePageReqVO; | ||
| 8 | +import cn.iocoder.yudao.module.system.controller.admin.mail.vo.template.MailTemplateUpdateReqVO; | ||
| 9 | +import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailAccountDO; | ||
| 10 | +import cn.iocoder.yudao.module.system.dal.dataobject.mail.MailTemplateDO; | ||
| 11 | +import cn.iocoder.yudao.module.system.dal.mysql.mail.MailTemplateMapper; | ||
| 12 | +import cn.iocoder.yudao.module.system.mq.producer.mail.MailProducer; | ||
| 13 | +import org.junit.jupiter.api.Test; | ||
| 14 | +import org.springframework.boot.test.mock.mockito.MockBean; | ||
| 15 | +import org.springframework.context.annotation.Import; | ||
| 16 | + | ||
| 17 | +import javax.annotation.Resource; | ||
| 18 | + | ||
| 19 | +import java.util.Map; | ||
| 20 | + | ||
| 21 | +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildBetweenTime; | ||
| 22 | +import static cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils.buildTime; | ||
| 23 | +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId; | ||
| 24 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals; | ||
| 25 | +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException; | ||
| 26 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId; | ||
| 27 | +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; | ||
| 28 | +import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.MAIL_TEMPLATE_NOT_EXISTS; | ||
| 29 | +import static org.junit.jupiter.api.Assertions.*; | ||
| 30 | + | ||
| 31 | +/** | ||
| 32 | +* {@link MailTemplateServiceImpl} 的单元测试类 | ||
| 33 | +* | ||
| 34 | +* @author 芋道源码 | ||
| 35 | +*/ | ||
| 36 | +@Import(MailTemplateServiceImpl.class) | ||
| 37 | +public class MailTemplateServiceImplTest extends BaseDbUnitTest { | ||
| 38 | + | ||
| 39 | + @Resource | ||
| 40 | + private MailTemplateServiceImpl mailTemplateService; | ||
| 41 | + | ||
| 42 | + @Resource | ||
| 43 | + private MailTemplateMapper mailTemplateMapper; | ||
| 44 | + | ||
| 45 | + @MockBean | ||
| 46 | + private MailProducer mailProducer; | ||
| 47 | + | ||
| 48 | + @Test | ||
| 49 | + public void testInitLocalCache() { | ||
| 50 | + MailTemplateDO templateDO01 = randomPojo(MailTemplateDO.class); | ||
| 51 | + mailTemplateMapper.insert(templateDO01); | ||
| 52 | + MailTemplateDO templateDO02 = randomPojo(MailTemplateDO.class); | ||
| 53 | + mailTemplateMapper.insert(templateDO02); | ||
| 54 | + | ||
| 55 | + // 调用 | ||
| 56 | + mailTemplateService.initLocalCache(); | ||
| 57 | + // 断言 mailTemplateCache 缓存 | ||
| 58 | + Map<String, MailTemplateDO> mailTemplateCache = mailTemplateService.getMailTemplateCache(); | ||
| 59 | + assertPojoEquals(templateDO01, mailTemplateCache.get(templateDO01.getCode())); | ||
| 60 | + assertPojoEquals(templateDO02, mailTemplateCache.get(templateDO02.getCode())); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + @Test | ||
| 64 | + public void testCreateMailTemplate_success() { | ||
| 65 | + // 准备参数 | ||
| 66 | + MailTemplateCreateReqVO reqVO = randomPojo(MailTemplateCreateReqVO.class); | ||
| 67 | + | ||
| 68 | + // 调用 | ||
| 69 | + Long mailTemplateId = mailTemplateService.createMailTemplate(reqVO); | ||
| 70 | + // 断言 | ||
| 71 | + assertNotNull(mailTemplateId); | ||
| 72 | + // 校验记录的属性是否正确 | ||
| 73 | + MailTemplateDO mailTemplate = mailTemplateMapper.selectById(mailTemplateId); | ||
| 74 | + assertPojoEquals(reqVO, mailTemplate); | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + @Test | ||
| 78 | + public void testUpdateMailTemplate_success() { | ||
| 79 | + // mock 数据 | ||
| 80 | + MailTemplateDO dbMailTemplate = randomPojo(MailTemplateDO.class); | ||
| 81 | + mailTemplateMapper.insert(dbMailTemplate);// @Sql: 先插入出一条存在的数据 | ||
| 82 | + // 准备参数 | ||
| 83 | + MailTemplateUpdateReqVO reqVO = randomPojo(MailTemplateUpdateReqVO.class, o -> { | ||
| 84 | + o.setId(dbMailTemplate.getId()); // 设置更新的 ID | ||
| 85 | + }); | ||
| 86 | + | ||
| 87 | + // 调用 | ||
| 88 | + mailTemplateService.updateMailTemplate(reqVO); | ||
| 89 | + // 校验是否更新正确 | ||
| 90 | + MailTemplateDO mailTemplate = mailTemplateMapper.selectById(reqVO.getId()); // 获取最新的 | ||
| 91 | + assertPojoEquals(reqVO, mailTemplate); | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + @Test | ||
| 95 | + public void testUpdateMailTemplate_notExists() { | ||
| 96 | + // 准备参数 | ||
| 97 | + MailTemplateUpdateReqVO reqVO = randomPojo(MailTemplateUpdateReqVO.class); | ||
| 98 | + | ||
| 99 | + // 调用, 并断言异常 | ||
| 100 | + assertServiceException(() -> mailTemplateService.updateMailTemplate(reqVO), MAIL_TEMPLATE_NOT_EXISTS); | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + @Test | ||
| 104 | + public void testDeleteMailTemplate_success() { | ||
| 105 | + // mock 数据 | ||
| 106 | + MailTemplateDO dbMailTemplate = randomPojo(MailTemplateDO.class); | ||
| 107 | + mailTemplateMapper.insert(dbMailTemplate);// @Sql: 先插入出一条存在的数据 | ||
| 108 | + // 准备参数 | ||
| 109 | + Long id = dbMailTemplate.getId(); | ||
| 110 | + | ||
| 111 | + // 调用 | ||
| 112 | + mailTemplateService.deleteMailTemplate(id); | ||
| 113 | + // 校验数据不存在了 | ||
| 114 | + assertNull(mailTemplateMapper.selectById(id)); | ||
| 115 | + } | ||
| 116 | + | ||
| 117 | + @Test | ||
| 118 | + public void testDeleteMailTemplate_notExists() { | ||
| 119 | + // 准备参数 | ||
| 120 | + Long id = randomLongId(); | ||
| 121 | + | ||
| 122 | + // 调用, 并断言异常 | ||
| 123 | + assertServiceException(() -> mailTemplateService.deleteMailTemplate(id), MAIL_TEMPLATE_NOT_EXISTS); | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + @Test | ||
| 127 | + public void testGetMailTemplatePage() { | ||
| 128 | + // mock 数据 | ||
| 129 | + MailTemplateDO dbMailTemplate = randomPojo(MailTemplateDO.class, o -> { // 等会查询到 | ||
| 130 | + o.setName("源码"); | ||
| 131 | + o.setCode("test_01"); | ||
| 132 | + o.setAccountId(1L); | ||
| 133 | + o.setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||
| 134 | + o.setCreateTime(buildTime(2023, 2, 3)); | ||
| 135 | + }); | ||
| 136 | + mailTemplateMapper.insert(dbMailTemplate); | ||
| 137 | + // 测试 name 不匹配 | ||
| 138 | + mailTemplateMapper.insert(cloneIgnoreId(dbMailTemplate, o -> o.setName("芋道"))); | ||
| 139 | + // 测试 code 不匹配 | ||
| 140 | + mailTemplateMapper.insert(cloneIgnoreId(dbMailTemplate, o -> o.setCode("test_02"))); | ||
| 141 | + // 测试 accountId 不匹配 | ||
| 142 | + mailTemplateMapper.insert(cloneIgnoreId(dbMailTemplate, o -> o.setAccountId(2L))); | ||
| 143 | + // 测试 status 不匹配 | ||
| 144 | + mailTemplateMapper.insert(cloneIgnoreId(dbMailTemplate, o -> o.setStatus(CommonStatusEnum.DISABLE.getStatus()))); | ||
| 145 | + // 测试 createTime 不匹配 | ||
| 146 | + mailTemplateMapper.insert(cloneIgnoreId(dbMailTemplate, o -> o.setCreateTime(buildTime(2023, 1, 5)))); | ||
| 147 | + // 准备参数 | ||
| 148 | + MailTemplatePageReqVO reqVO = new MailTemplatePageReqVO(); | ||
| 149 | + reqVO.setName("源"); | ||
| 150 | + reqVO.setCode("est_01"); | ||
| 151 | + reqVO.setAccountId(1L); | ||
| 152 | + reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); | ||
| 153 | + reqVO.setCreateTime(buildBetweenTime(2023, 2, 1, 2023, 2, 5)); | ||
| 154 | + | ||
| 155 | + // 调用 | ||
| 156 | + PageResult<MailTemplateDO> pageResult = mailTemplateService.getMailTemplatePage(reqVO); | ||
| 157 | + // 断言 | ||
| 158 | + assertEquals(1, pageResult.getTotal()); | ||
| 159 | + assertEquals(1, pageResult.getList().size()); | ||
| 160 | + assertPojoEquals(dbMailTemplate, pageResult.getList().get(0)); | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | +} |
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/clean.sql
| @@ -26,3 +26,4 @@ DELETE FROM "system_oauth2_access_token"; | @@ -26,3 +26,4 @@ DELETE FROM "system_oauth2_access_token"; | ||
| 26 | DELETE FROM "system_oauth2_refresh_token"; | 26 | DELETE FROM "system_oauth2_refresh_token"; |
| 27 | DELETE FROM "system_oauth2_code"; | 27 | DELETE FROM "system_oauth2_code"; |
| 28 | DELETE FROM "system_mail_account"; | 28 | DELETE FROM "system_mail_account"; |
| 29 | +DELETE FROM "system_mail_template"; |
yudao-module-system/yudao-module-system-biz/src/test/resources/sql/create_tables.sql
| @@ -568,17 +568,36 @@ CREATE TABLE IF NOT EXISTS "system_oauth2_code" ( | @@ -568,17 +568,36 @@ CREATE TABLE IF NOT EXISTS "system_oauth2_code" ( | ||
| 568 | ) COMMENT 'OAuth2 刷新令牌'; | 568 | ) COMMENT 'OAuth2 刷新令牌'; |
| 569 | 569 | ||
| 570 | CREATE TABLE IF NOT EXISTS "system_mail_account" ( | 570 | CREATE TABLE IF NOT EXISTS "system_mail_account" ( |
| 571 | - "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 572 | - "mail" varchar NOT NULL, | ||
| 573 | - "username" varchar NOT NULL, | ||
| 574 | - "password" varchar NOT NULL, | ||
| 575 | - "host" varchar NOT NULL, | ||
| 576 | - "port" int NOT NULL, | ||
| 577 | - "ssl_enable" bit NOT NULL, | ||
| 578 | - "creator" varchar DEFAULT '', | ||
| 579 | - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 580 | - "updater" varchar DEFAULT '', | ||
| 581 | - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
| 582 | - "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 583 | - PRIMARY KEY ("id") | 571 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, |
| 572 | + "mail" varchar NOT NULL, | ||
| 573 | + "username" varchar NOT NULL, | ||
| 574 | + "password" varchar NOT NULL, | ||
| 575 | + "host" varchar NOT NULL, | ||
| 576 | + "port" int NOT NULL, | ||
| 577 | + "ssl_enable" bit NOT NULL, | ||
| 578 | + "creator" varchar DEFAULT '', | ||
| 579 | + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 580 | + "updater" varchar DEFAULT '', | ||
| 581 | + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
| 582 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 583 | + PRIMARY KEY ("id") | ||
| 584 | ) COMMENT '邮箱账号表'; | 584 | ) COMMENT '邮箱账号表'; |
| 585 | + | ||
| 586 | +CREATE TABLE IF NOT EXISTS "system_mail_template" ( | ||
| 587 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | ||
| 588 | + "name" varchar NOT NULL, | ||
| 589 | + "code" varchar NOT NULL, | ||
| 590 | + "account_id" bigint NOT NULL, | ||
| 591 | + "nickname" varchar, | ||
| 592 | + "title" varchar NOT NULL, | ||
| 593 | + "content" varchar NOT NULL, | ||
| 594 | + "params" varchar NOT NULL, | ||
| 595 | + "status" varchar NOT NULL, | ||
| 596 | + "remark" varchar, | ||
| 597 | + "creator" varchar DEFAULT '', | ||
| 598 | + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, | ||
| 599 | + "updater" varchar DEFAULT '', | ||
| 600 | + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, | ||
| 601 | + "deleted" bit NOT NULL DEFAULT FALSE, | ||
| 602 | + PRIMARY KEY ("id") | ||
| 603 | +) COMMENT '邮件模版表'; |
yudao-ui-admin/src/api/system/mail/template.js
| @@ -42,3 +42,12 @@ export function getMailTemplatePage(query) { | @@ -42,3 +42,12 @@ export function getMailTemplatePage(query) { | ||
| 42 | params: query | 42 | params: query |
| 43 | }) | 43 | }) |
| 44 | } | 44 | } |
| 45 | + | ||
| 46 | +// 发送测试邮件 | ||
| 47 | +export function sendMail(data) { | ||
| 48 | + return request({ | ||
| 49 | + url: '/system/mail-template/send-mail', | ||
| 50 | + method: 'post', | ||
| 51 | + data: data | ||
| 52 | + }) | ||
| 53 | +} |
yudao-ui-admin/src/api/system/sms/smsTemplate.js
| @@ -43,7 +43,7 @@ export function getSmsTemplatePage(query) { | @@ -43,7 +43,7 @@ export function getSmsTemplatePage(query) { | ||
| 43 | }) | 43 | }) |
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | -// 创建短信模板 | 46 | +// 发送测试短信 |
| 47 | export function sendSms(data) { | 47 | export function sendSms(data) { |
| 48 | return request({ | 48 | return request({ |
| 49 | url: '/system/sms-template/send-sms', | 49 | url: '/system/sms-template/send-sms', |
yudao-ui-admin/src/views/system/mail/template/index.vue
| @@ -44,6 +44,7 @@ | @@ -44,6 +44,7 @@ | ||
| 44 | <el-table-column label="模板编码" align="center" prop="code" /> | 44 | <el-table-column label="模板编码" align="center" prop="code" /> |
| 45 | <el-table-column label="模板名称" align="center" prop="name" /> | 45 | <el-table-column label="模板名称" align="center" prop="name" /> |
| 46 | <el-table-column label="模板标题" align="center" prop="title" /> | 46 | <el-table-column label="模板标题" align="center" prop="title" /> |
| 47 | + <el-table-column label="模板内容" align="center" prop="content" :show-overflow-tooltip="true" /> | ||
| 47 | <el-table-column label="邮箱账号" align="center" prop="accountId" width="200"> | 48 | <el-table-column label="邮箱账号" align="center" prop="accountId" width="200"> |
| 48 | <template v-slot="scope"> | 49 | <template v-slot="scope"> |
| 49 | {{ accountOptions.find(account => account.id === scope.row.accountId)?.mail }} | 50 | {{ accountOptions.find(account => account.id === scope.row.accountId)?.mail }} |
| @@ -55,14 +56,15 @@ | @@ -55,14 +56,15 @@ | ||
| 55 | <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/> | 56 | <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/> |
| 56 | </template> | 57 | </template> |
| 57 | </el-table-column> | 58 | </el-table-column> |
| 58 | - <el-table-column label="备注" align="center" prop="remark" /> | ||
| 59 | <el-table-column label="创建时间" align="center" prop="createTime" width="180"> | 59 | <el-table-column label="创建时间" align="center" prop="createTime" width="180"> |
| 60 | <template v-slot="scope"> | 60 | <template v-slot="scope"> |
| 61 | <span>{{ parseTime(scope.row.createTime) }}</span> | 61 | <span>{{ parseTime(scope.row.createTime) }}</span> |
| 62 | </template> | 62 | </template> |
| 63 | </el-table-column> | 63 | </el-table-column> |
| 64 | - <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> | 64 | + <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150"> |
| 65 | <template v-slot="scope"> | 65 | <template v-slot="scope"> |
| 66 | + <el-button size="mini" type="text" icon="el-icon-share" @click="handleSend(scope.row)" | ||
| 67 | + v-hasPermi="['system:mail-template:send-mail']">测试</el-button> | ||
| 66 | <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" | 68 | <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" |
| 67 | v-hasPermi="['system:mail-template:update']">修改</el-button> | 69 | v-hasPermi="['system:mail-template:update']">修改</el-button> |
| 68 | <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" | 70 | <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" |
| @@ -112,11 +114,30 @@ | @@ -112,11 +114,30 @@ | ||
| 112 | <el-button @click="cancel">取 消</el-button> | 114 | <el-button @click="cancel">取 消</el-button> |
| 113 | </div> | 115 | </div> |
| 114 | </el-dialog> | 116 | </el-dialog> |
| 117 | + | ||
| 118 | + <!-- 对话框(发送邮件) --> | ||
| 119 | + <el-dialog title="测试发送邮件" :visible.sync="sendOpen" width="500px" append-to-body> | ||
| 120 | + <el-form ref="sendForm" :model="sendForm" :rules="sendRules" label-width="140px"> | ||
| 121 | + <el-form-item label="模板内容" prop="content"> | ||
| 122 | + <el-input v-model="sendForm.content" type="textarea" placeholder="请输入模板内容" readonly /> | ||
| 123 | + </el-form-item> | ||
| 124 | + <el-form-item label="收件邮箱" prop="mail"> | ||
| 125 | + <el-input v-model="sendForm.mail" placeholder="请输入收件邮箱" /> | ||
| 126 | + </el-form-item> | ||
| 127 | + <el-form-item v-for="param in sendForm.params" :key="param" :label="'参数 {' + param + '}'" :prop="'templateParams.' + param"> | ||
| 128 | + <el-input v-model="sendForm.templateParams[param]" :placeholder="'请输入 ' + param + ' 参数'" /> | ||
| 129 | + </el-form-item> | ||
| 130 | + </el-form> | ||
| 131 | + <div slot="footer" class="dialog-footer"> | ||
| 132 | + <el-button type="primary" @click="submitSendForm">确 定</el-button> | ||
| 133 | + <el-button @click="cancelSend">取 消</el-button> | ||
| 134 | + </div> | ||
| 135 | + </el-dialog> | ||
| 115 | </div> | 136 | </div> |
| 116 | </template> | 137 | </template> |
| 117 | 138 | ||
| 118 | <script> | 139 | <script> |
| 119 | -import { createMailTemplate, updateMailTemplate, deleteMailTemplate, getMailTemplate, getMailTemplatePage } from "@/api/system/mail/template"; | 140 | +import { createMailTemplate, updateMailTemplate, deleteMailTemplate, getMailTemplate, getMailTemplatePage, sendMail } from "@/api/system/mail/template"; |
| 120 | import Editor from '@/components/Editor'; | 141 | import Editor from '@/components/Editor'; |
| 121 | import { CommonStatusEnum } from "@/utils/constants"; | 142 | import { CommonStatusEnum } from "@/utils/constants"; |
| 122 | import { getSimpleMailAccountList } from "@/api/system/mail/account"; | 143 | import { getSimpleMailAccountList } from "@/api/system/mail/account"; |
| @@ -130,8 +151,6 @@ export default { | @@ -130,8 +151,6 @@ export default { | ||
| 130 | return { | 151 | return { |
| 131 | // 遮罩层 | 152 | // 遮罩层 |
| 132 | loading: true, | 153 | loading: true, |
| 133 | - // 导出遮罩层 | ||
| 134 | - exportLoading: false, | ||
| 135 | // 显示搜索条件 | 154 | // 显示搜索条件 |
| 136 | showSearch: true, | 155 | showSearch: true, |
| 137 | // 总条数 | 156 | // 总条数 |
| @@ -164,7 +183,18 @@ export default { | @@ -164,7 +183,18 @@ export default { | ||
| 164 | status: [{ required: true, message: "开启状态不能为空", trigger: "blur" }], | 183 | status: [{ required: true, message: "开启状态不能为空", trigger: "blur" }], |
| 165 | }, | 184 | }, |
| 166 | // 邮箱账号 | 185 | // 邮箱账号 |
| 167 | - accountOptions: [] | 186 | + accountOptions: [], |
| 187 | + | ||
| 188 | + // 发送邮箱 | ||
| 189 | + sendOpen: false, | ||
| 190 | + sendForm: { | ||
| 191 | + params: [], // 模板的参数列表 | ||
| 192 | + }, | ||
| 193 | + sendRules: { | ||
| 194 | + mail: [{ required: true, message: "收件邮箱不能为空", trigger: "blur" }], | ||
| 195 | + templateCode: [{ required: true, message: "模版编码不能为空", trigger: "blur" }], | ||
| 196 | + templateParams: { } | ||
| 197 | + } | ||
| 168 | }; | 198 | }; |
| 169 | }, | 199 | }, |
| 170 | created() { | 200 | created() { |
| @@ -263,7 +293,56 @@ export default { | @@ -263,7 +293,56 @@ export default { | ||
| 263 | this.getList(); | 293 | this.getList(); |
| 264 | this.$modal.msgSuccess("删除成功"); | 294 | this.$modal.msgSuccess("删除成功"); |
| 265 | }).catch(() => {}); | 295 | }).catch(() => {}); |
| 266 | - } | 296 | + }, |
| 297 | + /** 发送短息按钮 */ | ||
| 298 | + handleSend(row) { | ||
| 299 | + this.resetSend(row); | ||
| 300 | + // 设置参数 | ||
| 301 | + this.sendForm.content = row.content; | ||
| 302 | + this.sendForm.params = row.params; | ||
| 303 | + this.sendForm.templateCode = row.code; | ||
| 304 | + this.sendForm.templateParams = row.params.reduce(function(obj, item) { | ||
| 305 | + obj[item] = undefined; | ||
| 306 | + return obj; | ||
| 307 | + }, {}); | ||
| 308 | + // 根据 row 重置 rules | ||
| 309 | + this.sendRules.templateParams = row.params.reduce(function(obj, item) { | ||
| 310 | + obj[item] = { required: true, message: '参数 ' + item + " 不能为空", trigger: "change" }; | ||
| 311 | + return obj; | ||
| 312 | + }, {}); | ||
| 313 | + // 设置打开 | ||
| 314 | + this.sendOpen = true; | ||
| 315 | + }, | ||
| 316 | + /** 重置发送邮箱的表单 */ | ||
| 317 | + resetSend() { | ||
| 318 | + // 根据 row 重置表单 | ||
| 319 | + this.sendForm = { | ||
| 320 | + content: undefined, | ||
| 321 | + params: undefined, | ||
| 322 | + mobile: undefined, | ||
| 323 | + templateCode: undefined, | ||
| 324 | + templateParams: {} | ||
| 325 | + }; | ||
| 326 | + this.resetForm("sendForm"); | ||
| 327 | + }, | ||
| 328 | + /** 取消发送邮箱 */ | ||
| 329 | + cancelSend() { | ||
| 330 | + this.sendOpen = false; | ||
| 331 | + this.resetSend(); | ||
| 332 | + }, | ||
| 333 | + /** 提交按钮 */ | ||
| 334 | + submitSendForm() { | ||
| 335 | + this.$refs["sendForm"].validate(valid => { | ||
| 336 | + if (!valid) { | ||
| 337 | + return; | ||
| 338 | + } | ||
| 339 | + // 添加的提交 | ||
| 340 | + sendMail(this.sendForm).then(response => { | ||
| 341 | + this.$modal.msgSuccess("提交发送成功!发送结果,见发送日志编号:" + response.data); | ||
| 342 | + this.sendOpen = false; | ||
| 343 | + }); | ||
| 344 | + }); | ||
| 345 | + }, | ||
| 267 | } | 346 | } |
| 268 | }; | 347 | }; |
| 269 | </script> | 348 | </script> |
yudao-ui-admin/src/views/system/sms/smsTemplate.vue
| @@ -216,7 +216,7 @@ export default { | @@ -216,7 +216,7 @@ export default { | ||
| 216 | }, | 216 | }, |
| 217 | sendSmsRules: { | 217 | sendSmsRules: { |
| 218 | mobile: [{ required: true, message: "手机不能为空", trigger: "blur" }], | 218 | mobile: [{ required: true, message: "手机不能为空", trigger: "blur" }], |
| 219 | - templateCode: [{ required: true, message: "手机不能为空", trigger: "blur" }], | 219 | + templateCode: [{ required: true, message: "模版编码不能为空", trigger: "blur" }], |
| 220 | templateParams: { } | 220 | templateParams: { } |
| 221 | } | 221 | } |
| 222 | }; | 222 | }; |