潘志宝
2024-11-22 df90c0c5cfa4de114798015b92120ad8ba8b4826
提交 | 用户 | 时间
b1d33f 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="name">
11         <el-input v-model="formData.name" placeholder="请输入名称" />
12       </el-form-item>
13       <el-form-item label="数据源" prop="dataSource">
14         <el-select v-model="formData.dataSource" clearable placeholder="请选择数据源">
15           <el-option
16             v-for="item in dataSourceList"
17             :key="item.id"
18             :label="item.name"
19             :value="item.id + ''"
20           />
21         </el-select>
22       </el-form-item>
23       <el-form-item label="查询语句" prop="querySql">
24         <el-input v-model="formData.querySql" placeholder="请输入内容" type="textarea" maxlength="300"
25                   show-word-limit :rows="6" spellcheck="false"/>
26       </el-form-item>
27       <el-form-item label="备注" prop="remark">
28         <el-input v-model="formData.remark" placeholder="请输入内容" type="textarea" maxlength="100"
29                   show-word-limit/>
30       </el-form-item>
31     </el-form>
32     <template #footer>
33       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
34       <el-button @click="dialogVisible = false">取 消</el-button>
35     </template>
36   </Dialog>
37 </template>
38 <script lang="ts" setup>
39 import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
40 import * as DataSetApi from '@/api/data/plan/data'
41 import { CommonStatusEnum } from '@/utils/constants'
42 import * as DataSourceConfigApi from "@/api/infra/dataSourceConfig";
43
44 defineOptions({ name: 'PlanDataSetForm' })
45
46 const { t } = useI18n() // 国际化
47 const message = useMessage() // 消息弹窗
48
49 const dialogVisible = ref(false) // 弹窗的是否展示
50 const dialogTitle = ref('') // 弹窗的标题
51 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
52 const formType = ref('') // 表单的类型:create - 新增;update - 修改
53 const formData = ref({
54   id: undefined,
55   name: '',
56   dataSource: '',
57   querySql: '',
58   remark: ''
59 })
60 const formRules = reactive({
61   name: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
62   dataSource: [{ required: true, message: '数据源不能为空', trigger: 'blur' }],
63   querySql: [{ required: true, message: '查询语句不能为空', trigger: 'change' }]
64 })
65 const formRef = ref() // 表单 Ref
66 const dataSourceList = ref([] as DataSourceConfigApi.DataSourceConfigVO[])
67
68 /** 打开弹窗 */
69 const open = async (type: string, id?: number) => {
70   dialogVisible.value = true
71   dialogTitle.value = t('action.' + type)
72   formType.value = type
73   resetForm()
74
75   // 加载数据源列表
76   dataSourceList.value = await DataSourceConfigApi.getDataSourceConfigList()
77
78   // 修改时,设置数据
79   if (id) {
80     formLoading.value = true
81     try {
82       formData.value = await DataSetApi.getDataSet(id)
83     } finally {
84       formLoading.value = false
85     }
86   }
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 DataSetApi.DataSetVO
103     if (formType.value === 'create') {
104       await DataSetApi.createDataSet(data)
105       message.success(t('common.createSuccess'))
106     } else {
107       await DataSetApi.updateDataSet(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     name: '',
123     dataSource: '',
124     querySql: '',
125     remark: ''
126   }
127   formRef.value?.resetFields()
128 }
129 </script>