houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <Dialog v-model="dialogVisible" title="测试">
3     <el-form
4       ref="formRef"
5       v-loading="formLoading"
6       :model="formData"
7       :rules="formRules"
8       label-width="120px"
9     >
10       <el-form-item label="模板内容" prop="content">
11         <Editor :model-value="formData.content" height="150px" readonly />
12       </el-form-item>
13       <el-form-item label="收件邮箱" prop="mail">
14         <el-input v-model="formData.mail" placeholder="请输入收件邮箱" />
15       </el-form-item>
16       <el-form-item
17         v-for="param in formData.params"
18         :key="param"
19         :label="'参数 {' + param + '}'"
20         :prop="'templateParams.' + param"
21       >
22         <el-input
23           v-model="formData.templateParams[param]"
24           :placeholder="'请输入 ' + param + ' 参数'"
25         />
26       </el-form-item>
27     </el-form>
28     <template #footer>
29       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
30       <el-button @click="dialogVisible = false">取 消</el-button>
31     </template>
32   </Dialog>
33 </template>
34 <script lang="ts" setup>
35 import * as MailTemplateApi from '@/api/system/mail/template'
36
37 defineOptions({ name: 'SystemMailTemplateSendForm' })
38
39 const message = useMessage() // 消息弹窗
40
41 const dialogVisible = ref(false) // 弹窗的是否展示
42 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
43 const formData = ref({
44   content: '',
45   params: {},
46   mail: '',
47   templateCode: '',
48   templateParams: new Map()
49 })
50 const formRules = reactive({
51   mail: [{ required: true, message: '邮箱不能为空', trigger: 'blur' }],
52   templateCode: [{ required: true, message: '模版编号不能为空', trigger: 'blur' }],
53   templateParams: {}
54 })
55 const formRef = ref() // 表单 Ref
56
57 /** 打开弹窗 */
58 const open = async (id: number) => {
59   dialogVisible.value = true
60   resetForm()
61   // 设置数据
62   formLoading.value = true
63   try {
64     const data = await MailTemplateApi.getMailTemplate(id)
65     // 设置动态表单
66     formData.value.content = data.content
67     formData.value.params = data.params
68     formData.value.templateCode = data.code
69     formData.value.templateParams = data.params.reduce((obj, item) => {
70       obj[item] = '' // 给每个动态属性赋值,避免无法读取
71       return obj
72     }, {})
73     formRules.templateParams = data.params.reduce((obj, item) => {
74       obj[item] = { required: true, message: '参数 ' + item + ' 不能为空', trigger: 'blur' }
75       return obj
76     }, {})
77   } finally {
78     formLoading.value = false
79   }
80 }
81 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
82
83 /** 提交表单 */
84 const submitForm = async () => {
85   // 校验表单
86   if (!formRef) return
87   const valid = await formRef.value.validate()
88   if (!valid) return
89   // 提交请求
90   formLoading.value = true
91   try {
92     const data = formData.value as MailTemplateApi.MailSendReqVO
93     const logId = await MailTemplateApi.sendMail(data)
94     if (logId) {
95       message.success('提交发送成功!发送结果,见发送日志编号:' + logId)
96     }
97     dialogVisible.value = false
98   } finally {
99     formLoading.value = false
100   }
101 }
102
103 /** 重置表单 */
104 const resetForm = () => {
105   formData.value = {
106     content: '',
107     params: {},
108     mail: '',
109     templateCode: '',
110     templateParams: new Map()
111   }
112   formRules.templateParams = {}
113   formRef.value?.resetFields()
114 }
115 </script>