houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <Dialog :title="dialogTitle" v-model="dialogVisible">
3     <el-form
4       ref="formRef"
5       :model="formData"
6       :rules="formRules"
7       label-width="100px"
8       v-loading="formLoading"
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="parentId">
14         <el-tree-select
15           v-model="formData.parentId"
16           :data="demo02CategoryTree"
17           :props="defaultProps"
18           check-strictly
19           default-expand-all
20           placeholder="请选择父级编号"
21         />
22       </el-form-item>
23     </el-form>
24     <template #footer>
25       <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
26       <el-button @click="dialogVisible = false">取 消</el-button>
27     </template>
28   </Dialog>
29 </template>
30 <script setup lang="ts">
31 import * as Demo02CategoryApi from '@/api/infra/demo/demo02'
32 import { defaultProps, handleTree } from '@/utils/tree'
33
34 const { t } = useI18n() // 国际化
35 const message = useMessage() // 消息弹窗
36
37 const dialogVisible = ref(false) // 弹窗的是否展示
38 const dialogTitle = ref('') // 弹窗的标题
39 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
40 const formType = ref('') // 表单的类型:create - 新增;update - 修改
41 const formData = ref({
42   id: undefined,
43   name: undefined,
44   parentId: undefined
45 })
46 const formRules = reactive({
47   name: [{ required: true, message: '名字不能为空', trigger: 'blur' }],
48   parentId: [{ required: true, message: '父级编号不能为空', trigger: 'blur' }]
49 })
50 const formRef = ref() // 表单 Ref
51 const demo02CategoryTree = ref() // 树形结构
52
53 /** 打开弹窗 */
54 const open = async (type: string, id?: number) => {
55   dialogVisible.value = true
56   dialogTitle.value = t('action.' + type)
57   formType.value = type
58   resetForm()
59   // 修改时,设置数据
60   if (id) {
61     formLoading.value = true
62     try {
63       formData.value = await Demo02CategoryApi.getDemo02Category(id)
64     } finally {
65       formLoading.value = false
66     }
67   }
68   await getDemo02CategoryTree()
69 }
70 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
71
72 /** 提交表单 */
73 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
74 const submitForm = async () => {
75   // 校验表单
76   await formRef.value.validate()
77   // 提交请求
78   formLoading.value = true
79   try {
80     const data = formData.value as unknown as Demo02CategoryApi.Demo02CategoryVO
81     if (formType.value === 'create') {
82       await Demo02CategoryApi.createDemo02Category(data)
83       message.success(t('common.createSuccess'))
84     } else {
85       await Demo02CategoryApi.updateDemo02Category(data)
86       message.success(t('common.updateSuccess'))
87     }
88     dialogVisible.value = false
89     // 发送操作成功的事件
90     emit('success')
91   } finally {
92     formLoading.value = false
93   }
94 }
95
96 /** 重置表单 */
97 const resetForm = () => {
98   formData.value = {
99     id: undefined,
100     name: undefined,
101     parentId: undefined
102   }
103   formRef.value?.resetFields()
104 }
105
106 /** 获得示例分类树 */
107 const getDemo02CategoryTree = async () => {
108   demo02CategoryTree.value = []
109   const data = await Demo02CategoryApi.getDemo02CategoryList()
110   const root: Tree = { id: 0, name: '顶级示例分类', children: [] }
111   root.children = handleTree(data, 'id', 'parentId')
112   demo02CategoryTree.value.push(root)
113 }
114 </script>