pre
潘志宝
2024-09-25 6e7f226b03fb059971b76d875671e2b662f29f1f
提交 | 用户 | 时间
39248b 1 <template>
H 2   <Dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
3     <el-form
4       ref="formRef"
5       v-loading="formLoading"
6       :model="formData"
7       :rules="formRules"
8       label-width="80px"
9     >
10       <el-row>
11         <el-col :span="12">
12           <el-form-item label="分组编号" prop="appCode">
13             <el-input v-model="formData.code" placeholder="请输入应用分组编号" />
14           </el-form-item>
15         </el-col>
16         <el-col :span="12">
17           <el-form-item label="分组名称" prop="appName">
18             <el-input v-model="formData.name" placeholder="请输入应用分组名称" />
19           </el-form-item>
20         </el-col>
21       </el-row>
22       <el-row>
23         <el-col :span="24">
24           <el-form-item label="分组图标" prop="icon">
25             <UploadImg v-model="formData.icon" :limit="1" />
26           </el-form-item>
27         </el-col>
28       </el-row>
29       <el-row>
30         <el-col :span="12">
31           <el-form-item label="排序" prop="orderNum">
32             <el-input-number v-model="formData.sort" placeholder="请输入排序" />
33           </el-form-item>
34         </el-col>
35       </el-row>
36       <el-row>
37         <el-col :span="24">
38           <el-form-item label="备注" prop="remark">
39             <el-input v-model="formData.remark" clearable type="textarea" />
40           </el-form-item>
41         </el-col>
42       </el-row>
43     </el-form>
44     <template #footer>
45       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
46       <el-button @click="dialogVisible = false">取 消</el-button>
47     </template>
48   </Dialog>
49 </template>
50 <script lang="ts" setup>
51   import * as AppGroupApi from '@/api/system/appgroup'
52
53   defineOptions({ name: 'SystemAppGroupForm' })
54
55   const { t } = useI18n() // 国际化
56   const message = useMessage() // 消息弹窗
57   const dialogVisible = ref(false) // 弹窗的是否展示
58   const dialogTitle = ref('') // 弹窗的标题
59   const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
60   const formType = ref('') // 表单的类型:create - 新增;update - 修改
61   const formData = ref({
62     id: undefined,
63     code: undefined,
64     name: undefined,
65     icon: undefined,
66     sort: undefined,
67     remark: undefined
68   })
69   const formRules = reactive({
70     code: [{ required: true, message: '分组编号不能为空', trigger: 'blur' }],
71     name: [{ required: true, message: '分组名称不能为空', trigger: 'blur' }]
72   })
73   const formRef = ref() // 表单 Ref
74   /** 打开弹窗 */
75   const open = async (type: string, id?: number) => {
76     dialogVisible.value = true
77     dialogTitle.value = t('action.' + type)
78     formType.value = type
79     resetForm()
80     // 修改时,设置数据
81     if (id) {
82       formLoading.value = true
83       try {
84         formData.value = await AppGroupApi.getAppGroup(id)
85       } finally {
86         formLoading.value = false
87       }
88     }
89   }
90   defineExpose({ open }) // 提供 open 方法,用于打开弹窗
91
92   /** 提交表单 */
93   const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
94   const submitForm = async () => {
95     // 校验表单
96     if (!formRef) return
97     const valid = await formRef.value.validate()
98     if (!valid) return
99     // 提交请求
100     formLoading.value = true
101     try {
102       const data = formData.value as unknown as AppGroupApi.AppGroupVO
103       if (formType.value === 'create') {
104         await AppGroupApi.createAppGroup(data)
105         message.success(t('common.createSuccess'))
106       } else {
107         await AppGroupApi.updateAppGroup(data)
108         message.success(t('common.updateSuccess'))
109       }
110       dialogVisible.value = false
111       // 发送操作成功的事件
112       emit('success')
113     } finally {
114       formLoading.value = false
115     }
116   }
117
118   /** 重置表单 */
119   const resetForm = () => {
120     formData.value = {
121       id: undefined,
122       code: undefined,
123       name: undefined,
124       icon: undefined,
125       sort: undefined,
126       remark: undefined,
127     }
128     formRef.value?.resetFields()
129   }
130 </script>