form.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <Dialog :title="modelTitle" v-model="modelVisible" :loading="modelLoading">
  3. <el-form ref="ruleFormRef" :model="formData" :rules="formRules" label-width="80px">
  4. <el-form-item label="参数分类" prop="category">
  5. <el-input v-model="formData.category" placeholder="请输入参数分类" />
  6. </el-form-item>
  7. <el-form-item label="参数名称" prop="name">
  8. <el-input v-model="formData.name" placeholder="请输入参数名称" />
  9. </el-form-item>
  10. <el-form-item label="参数键名" prop="key">
  11. <el-input v-model="formData.key" placeholder="请输入参数键名" />
  12. </el-form-item>
  13. <el-form-item label="参数键值" prop="value">
  14. <el-input v-model="formData.value" placeholder="请输入参数键值" />
  15. </el-form-item>
  16. <el-form-item label="是否可见" prop="visible">
  17. <!-- TODO 芋艿:改成组件 -->
  18. <el-radio-group v-model="formData.visible">
  19. <el-radio :key="true" :label="true">是</el-radio>
  20. <el-radio :key="false" :label="false">否</el-radio>
  21. </el-radio-group>
  22. </el-form-item>
  23. <el-form-item label="备注" prop="remark">
  24. <el-input v-model="formData.remark" type="textarea" placeholder="请输入内容" />
  25. </el-form-item>
  26. </el-form>
  27. <template #footer>
  28. <div class="dialog-footer">
  29. <el-button type="primary" @click="submitForm">确 定</el-button>
  30. <el-button @click="colseForm(ruleFormRef)">取 消</el-button>
  31. </div>
  32. </template>
  33. </Dialog>
  34. </template>
  35. <script setup lang="ts">
  36. import * as ConfigApi from '@/api/infra/config'
  37. // import type { FormExpose } from '@/components/Form'
  38. import type { FormInstance } from 'element-plus'
  39. const { t } = useI18n() // 国际化
  40. const message = useMessage() // 消息弹窗
  41. // const { proxy } = getCurrentInstance()
  42. const modelVisible = ref(false) // 弹窗的是否展示
  43. const modelTitle = ref('') // 弹窗的标题
  44. const modelLoading = ref(false) // 弹窗的 Loading 加载
  45. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  46. const formLoading = ref(false) // 操作按钮的 Loading 加载
  47. // let formRef = ref() // 表单的 Ref
  48. const formData = reactive({
  49. id: undefined,
  50. category: '',
  51. name: '',
  52. key: '',
  53. value: '',
  54. visible: true,
  55. remark: ''
  56. })
  57. const formRules = reactive({
  58. category: [{ required: true, message: '参数分类不能为空', trigger: 'blur' }],
  59. name: [{ required: true, message: '参数名称不能为空', trigger: 'blur' }],
  60. key: [{ required: true, message: '参数键名不能为空', trigger: 'blur' }],
  61. value: [{ required: true, message: '参数键值不能为空', trigger: 'blur' }],
  62. visible: [{ required: true, message: '是否可见不能为空', trigger: 'blur' }]
  63. })
  64. const ruleFormRef = ref<FormInstance>() // 表单 Ref
  65. const { proxy } = getCurrentInstance() as any
  66. /** 打开弹窗 */
  67. const openModal = async (type: string, id?: number) => {
  68. modelVisible.value = true
  69. modelTitle.value = t('action.' + type)
  70. formType.value = type
  71. resetForm()
  72. // 修改时,设置数据
  73. if (id) {
  74. modelLoading.value = true
  75. try {
  76. const data = await ConfigApi.getConfig(id)
  77. // TODO 规范纠结点:因为用 reactive,所以需要使用 Object;可以替换的方案,1)把 reactive 改成 ref;
  78. Object.assign(formData, data)
  79. } finally {
  80. modelLoading.value = false
  81. }
  82. }
  83. }
  84. defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
  85. /** 提交表单 */
  86. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  87. const submitForm = async () => {
  88. const formRef = proxy.$refs['formRef']
  89. // 校验表单
  90. if (!formRef) return
  91. const valid = await formRef.validate()
  92. if (!valid) return
  93. // 提交请求
  94. formLoading.value = true
  95. try {
  96. const data = formData as ConfigApi.ConfigVO
  97. if (formType.value === 'create') {
  98. await ConfigApi.createConfig(data)
  99. message.success(t('common.createSuccess'))
  100. } else {
  101. await ConfigApi.updateConfig(data)
  102. message.success(t('common.updateSuccess'))
  103. }
  104. modelVisible.value = false
  105. emit('success')
  106. } finally {
  107. formLoading.value = false
  108. }
  109. }
  110. /** 重置表单 */
  111. const resetForm = () => {
  112. formData.id = undefined
  113. formData.category = ''
  114. formData.name = ''
  115. formData.key = ''
  116. formData.value = ''
  117. formData.visible = true
  118. formData.remark = ''
  119. // proxy.$refs['ruleFormRef'].resetFields()
  120. // setTimeout(() => {
  121. // console.log(ruleFormRef.value, 'formRef.value')
  122. // formRef.value.resetFields() // TODO 芋艿:为什么拿不到 formRef 呢? 表单还没加载出来
  123. // ruleFormRef.value?.resetFields()
  124. // }, 100)
  125. }
  126. /** 取消添加 */
  127. const colseForm = (formEl: FormInstance | undefined) => {
  128. if (!formEl) return
  129. formEl.resetFields()
  130. modelVisible.value = false
  131. }
  132. </script>