dengzedong
2024-11-28 5c475d3ac8ee98713e0f0962dd9464daccfb9eb1
提交 | 用户 | 时间
aff5c9 1 <template>
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="80px"
9     >
10       <el-form-item label="图标名称" prop="iconName">
11         <el-input v-model="formData.iconName" placeholder="请输入图标名称" />
12       </el-form-item>
13       <el-form-item label="图标描述" prop="iconDesc">
14         <el-input v-model="formData.iconDesc" placeholder="请输入图标描述" />
15       </el-form-item>
16       <el-form-item label="排序" prop="sort">
1c5af8 17         <el-input-number v-model="formData.sort" :min="0" clearable controls-position="right" />
aff5c9 18       </el-form-item>
19
20     </el-form>
21     <template #footer>
22       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
23       <el-button @click="dialogVisible = false">取 消</el-button>
24     </template>
25   </Dialog>
26 </template>
27 <script lang="ts" setup>
28 import * as MpkIconApi from '@/api/model/mpk/icon'
29 import {deleteIcon} from "@/api/model/mpk/icon";
30
31 defineOptions({ name: 'MpkIconForm' })
32
33 const { t } = useI18n() // 国际化
34 const message = useMessage() // 消息弹窗
35
36 const dialogVisible = ref(false) // 弹窗的是否展示
37 const dialogTitle = ref('') // 弹窗的标题
38 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
39 const formType = ref('') // 表单的类型:create - 新增;update - 修改
40 const formData = ref({
41   id: undefined,
42   iconName: '',
43   iconDesc: '',
44   sort: undefined
45 })
46 const formRules = reactive({
47   iconName: [{ required: true, message: '名称不能为空', trigger: 'blur' }]
48 })
49 const formRef = ref() // 表单 Ref
50
51 /** 打开弹窗 */
52 const open = async (type: string, id?: string) => {
53   dialogVisible.value = true
54   dialogTitle.value = t('action.' + type)
55   formType.value = type
56   resetForm()
57   // 修改时,设置数据
58   if (id) {
59     formLoading.value = true
60     try {
61       formData.value = await MpkIconApi.getIcon(id)
62     } finally {
63       formLoading.value = false
64     }
65   }
66 }
67 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
68
69 /** 提交表单 */
70 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
71 const submitForm = async () => {
72   // 校验表单
73   if (!formRef) return
74   const valid = await formRef.value.validate()
75   if (!valid) return
76   // 提交请求
77   formLoading.value = true
78   try {
79     const data = formData.value as MpkIconApi.MpkIconVO
80     if (formType.value === 'create') {
81       await MpkIconApi.createIcon(data)
82       message.success(t('common.createSuccess'))
83     } else {
84       await MpkIconApi.updateIcon(data)
85       message.success(t('common.updateSuccess'))
86     }
87     dialogVisible.value = false
88     // 发送操作成功的事件
89     emit('success')
90   } finally {
91     formLoading.value = false
92   }
93 }
94
95 /** 重置表单 */
96 const resetForm = () => {
97   formData.value = {
98     id: undefined,
99     iconName: '',
100     iconDesc: '',
101     sort: undefined
102   }
103   formRef.value?.resetFields()
104 }
105 </script>