Commit c0b029b2447e381436b83a35a2dcdbac680baf62

Authored by YunaiV
1 parent 0895ee7d

邮箱模块:完善 template 的单元测试

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 &quot;system_oauth2_access_token&quot;; @@ -26,3 +26,4 @@ DELETE FROM &quot;system_oauth2_access_token&quot;;
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 &quot;system_oauth2_code&quot; ( @@ -568,17 +568,36 @@ CREATE TABLE IF NOT EXISTS &quot;system_oauth2_code&quot; (
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 };