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