houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <Dialog v-model="dialogVisible" :title="dialogTitle">
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="name">
11         <el-input v-model="formData.name" placeholder="请输入应用名" />
12       </el-form-item>
13       <el-form-item label="社交平台" prop="socialType">
14         <el-radio-group v-model="formData.socialType">
15           <el-radio
16             v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_TYPE)"
17             :key="dict.value"
18             :label="dict.value"
19           >
20             {{ dict.label }}
21           </el-radio>
22         </el-radio-group>
23       </el-form-item>
24       <el-form-item label="用户类型" prop="userType">
25         <el-radio-group v-model="formData.userType">
26           <el-radio
27             v-for="dict in getIntDictOptions(DICT_TYPE.USER_TYPE)"
28             :key="dict.value"
29             :label="dict.value"
30           >
31             {{ dict.label }}
32           </el-radio>
33         </el-radio-group>
34       </el-form-item>
35       <el-form-item label="客户端编号" prop="clientId">
36         <el-input v-model="formData.clientId" placeholder="请输入客户端编号,对应各平台的appKey" />
37       </el-form-item>
38       <el-form-item label="客户端密钥" prop="clientSecret">
39         <el-input
40           v-model="formData.clientSecret"
41           placeholder="请输入客户端密钥,对应各平台的appSecret"
42         />
43       </el-form-item>
44       <el-form-item label="agentId" prop="agentId" v-if="formData!.socialType === 30">
45         <el-input v-model="formData.agentId" placeholder="授权方的网页应用 ID,有则填" />
46       </el-form-item>
47       <el-form-item label="状态" prop="status">
48         <el-radio-group v-model="formData.status">
49           <el-radio
50             v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
51             :key="dict.value"
52             :label="dict.value"
53           >
54             {{ dict.label }}
55           </el-radio>
56         </el-radio-group>
57       </el-form-item>
58     </el-form>
59     <template #footer>
60       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
61       <el-button @click="dialogVisible = false">取 消</el-button>
62     </template>
63   </Dialog>
64 </template>
65 <script lang="ts" setup>
66 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
67 import * as SocialClientApi from '@/api/system/social/client'
68
69 const { t } = useI18n() // 国际化
70 const message = useMessage() // 消息弹窗
71
72 const dialogVisible = ref(false) // 弹窗的是否展示
73 const dialogTitle = ref('') // 弹窗的标题
74 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
75 const formType = ref('') // 表单的类型:create - 新增;update - 修改
76 const formData = ref({
77   id: undefined,
78   name: undefined,
79   socialType: undefined,
80   userType: undefined,
81   clientId: undefined,
82   clientSecret: undefined,
83   agentId: undefined,
84   status: 0
85 })
86 const formRules = reactive({
87   name: [{ required: true, message: '应用名不能为空', trigger: 'blur' }],
88   socialType: [{ required: true, message: '社交平台不能为空', trigger: 'blur' }],
89   userType: [{ required: true, message: '用户类型不能为空', trigger: 'blur' }],
90   clientId: [{ required: true, message: '客户端编号不能为空', trigger: 'blur' }],
91   clientSecret: [{ required: true, message: '客户端密钥不能为空', trigger: 'blur' }],
92   status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
93 })
94 const formRef = ref() // 表单 Ref
95
96 /** 打开弹窗 */
97 const open = async (type: string, id?: number) => {
98   dialogVisible.value = true
99   dialogTitle.value = t('action.' + type)
100   formType.value = type
101   resetForm()
102   // 修改时,设置数据
103   if (id) {
104     formLoading.value = true
105     try {
106       formData.value = await SocialClientApi.getSocialClient(id)
107     } finally {
108       formLoading.value = false
109     }
110   }
111 }
112 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
113
114 /** 提交表单 */
115 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
116 const submitForm = async () => {
117   // 校验表单
118   if (!formRef) return
119   const valid = await formRef.value.validate()
120   if (!valid) return
121   // 提交请求
122   formLoading.value = true
123   try {
124     const data = formData.value as unknown as SocialClientApi.SocialClientVO
125     if (formType.value === 'create') {
126       await SocialClientApi.createSocialClient(data)
127       message.success(t('common.createSuccess'))
128     } else {
129       await SocialClientApi.updateSocialClient(data)
130       message.success(t('common.updateSuccess'))
131     }
132     dialogVisible.value = false
133     // 发送操作成功的事件
134     emit('success')
135   } finally {
136     formLoading.value = false
137   }
138 }
139
140 /** 重置表单 */
141 const resetForm = () => {
142   formData.value = {
143     id: undefined,
144     name: undefined,
145     socialType: undefined,
146     userType: undefined,
147     clientId: undefined,
148     clientSecret: undefined,
149     agentId: undefined,
150     status: 0
151   }
152   formRef.value?.resetFields()
153 }
154 </script>