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