MailTemplateSendForm.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <template>
  2. <Dialog v-model="dialogVisible" :title="t('system.test')">
  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="t('system.templateContent')" prop="content">
  11. <Editor :model-value="formData.content" height="150px" readonly />
  12. </el-form-item>
  13. <el-form-item :label="t('system.recipientEmail')" prop="mail">
  14. <el-input v-model="formData.mail" :placeholder="t('system.enterRecipientEmail')" />
  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">{{t('common.confirm')}}</el-button>
  30. <el-button @click="dialogVisible = false">{{t('common.cancel')}}</el-button>
  31. </template>
  32. </Dialog>
  33. </template>
  34. <script lang="ts" setup>
  35. import * as MailTemplateApi from '@/api/system/mail/template'
  36. const { t } = useI18n()
  37. defineOptions({ name: 'SystemMailTemplateSendForm' })
  38. const message = useMessage() // 消息弹窗
  39. const dialogVisible = ref(false) // 弹窗的是否展示
  40. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  41. const formData = ref({
  42. content: '',
  43. params: {},
  44. mail: '',
  45. templateCode: '',
  46. templateParams: new Map()
  47. })
  48. const formRules = reactive({
  49. mail: [{ required: true, message: t('system.emailCannotBeEmpty'), trigger: 'blur' }],
  50. templateCode: [{ required: true, message: t('system.templateNumberCannotBeEmpty'), trigger: 'blur' }],
  51. templateParams: {}
  52. })
  53. const formRef = ref() // 表单 Ref
  54. /** 打开弹窗 */
  55. const open = async (id: number) => {
  56. dialogVisible.value = true
  57. resetForm()
  58. // 设置数据
  59. formLoading.value = true
  60. try {
  61. const data = await MailTemplateApi.getMailTemplate(id)
  62. // 设置动态表单
  63. formData.value.content = data.content
  64. formData.value.params = data.params
  65. formData.value.templateCode = data.code
  66. formData.value.templateParams = data.params.reduce((obj, item) => {
  67. obj[item] = '' // 给每个动态属性赋值,避免无法读取
  68. return obj
  69. }, {})
  70. formRules.templateParams = data.params.reduce((obj, item) => {
  71. obj[item] = { required: true, message: '参数 ' + item + ' 不能为空', trigger: 'blur' }
  72. return obj
  73. }, {})
  74. } finally {
  75. formLoading.value = false
  76. }
  77. }
  78. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  79. /** 提交表单 */
  80. const submitForm = async () => {
  81. // 校验表单
  82. if (!formRef) return
  83. const valid = await formRef.value.validate()
  84. if (!valid) return
  85. // 提交请求
  86. formLoading.value = true
  87. try {
  88. const data = formData.value as MailTemplateApi.MailSendReqVO
  89. const logId = await MailTemplateApi.sendMail(data)
  90. if (logId) {
  91. message.success(t('system.submissionAndSendingWereSuccessfulTheSendingResultPleaseReferToTheSendingLogNumber') + logId)
  92. }
  93. dialogVisible.value = false
  94. } finally {
  95. formLoading.value = false
  96. }
  97. }
  98. /** 重置表单 */
  99. const resetForm = () => {
  100. formData.value = {
  101. content: '',
  102. params: {},
  103. mail: '',
  104. templateCode: '',
  105. templateParams: new Map()
  106. }
  107. formRules.templateParams = {}
  108. formRef.value?.resetFields()
  109. }
  110. </script>