data.form.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <Dialog :title="modelTitle" v-model="modelVisible">
  3. <el-form
  4. ref="formRef"
  5. :model="formData"
  6. :rules="formRules"
  7. label-width="80px"
  8. v-loading="formLoading"
  9. >
  10. <el-form-item label="字典类型" prop="type">
  11. <el-input
  12. :disabled="typeof formData.id !== 'undefined'"
  13. v-model="formData.dictType"
  14. placeholder="请输入参数名称"
  15. />
  16. </el-form-item>
  17. <el-form-item label="数据标签" prop="label">
  18. <el-input v-model="formData.label" placeholder="请输入数据标签" />
  19. </el-form-item>
  20. <el-form-item label="数据键值" prop="value">
  21. <el-input v-model="formData.value" placeholder="请输入数据键值" />
  22. </el-form-item>
  23. <el-form-item label="显示排序" prop="sort">
  24. <el-input-number v-model="formData.sort" controls-position="right" :min="0" />
  25. </el-form-item>
  26. <el-form-item label="状态" prop="status">
  27. <el-radio-group v-model="formData.status">
  28. <el-radio
  29. v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)"
  30. :key="parseInt(dict.value)"
  31. :label="parseInt(dict.value)"
  32. >{{ dict.label }}</el-radio
  33. >
  34. </el-radio-group>
  35. </el-form-item>
  36. <el-form-item label="颜色类型" prop="colorType">
  37. <el-select v-model="formData.colorType">
  38. <el-option
  39. v-for="item in colorTypeOptions"
  40. :key="item.value"
  41. :label="item.label + '(' + item.value + ')'"
  42. :value="item.value"
  43. />
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item label="CSS Class" prop="cssClass">
  47. <el-input v-model="formData.cssClass" placeholder="请输入 CSS Class" />
  48. </el-form-item>
  49. <el-form-item label="备注" prop="remark">
  50. <el-input v-model="formData.remark" type="textarea" placeholder="请输入内容" />
  51. </el-form-item>
  52. </el-form>
  53. <template #footer>
  54. <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
  55. <el-button @click="modelVisible = false">取 消</el-button>
  56. </template>
  57. </Dialog>
  58. </template>
  59. <script setup lang="ts">
  60. import { DICT_TYPE, getDictOptions } from '@/utils/dict'
  61. import * as DictDataApi from '@/api/system/dict/dict.data'
  62. import { CommonStatusEnum } from '@/utils/constants'
  63. const { t } = useI18n() // 国际化
  64. const message = useMessage() // 消息弹窗
  65. const modelVisible = ref(false) // 弹窗的是否展示
  66. const modelTitle = ref('') // 弹窗的标题
  67. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  68. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  69. const formData = ref({
  70. id: undefined,
  71. sort: undefined,
  72. label: '',
  73. value: '',
  74. dictType: '',
  75. status: CommonStatusEnum.ENABLE,
  76. colorType: '',
  77. cssClass: '',
  78. remark: ''
  79. })
  80. const formRules = reactive({
  81. label: [{ required: true, message: '数据标签不能为空', trigger: 'blur' }],
  82. value: [{ required: true, message: '数据键值不能为空', trigger: 'blur' }],
  83. sort: [{ required: true, message: '数据顺序不能为空', trigger: 'blur' }]
  84. })
  85. const formRef = ref() // 表单 Ref
  86. // 数据标签回显样式
  87. const colorTypeOptions = readonly([
  88. {
  89. value: 'default',
  90. label: '默认'
  91. },
  92. {
  93. value: 'primary',
  94. label: '主要'
  95. },
  96. {
  97. value: 'success',
  98. label: '成功'
  99. },
  100. {
  101. value: 'info',
  102. label: '信息'
  103. },
  104. {
  105. value: 'warning',
  106. label: '警告'
  107. },
  108. {
  109. value: 'danger',
  110. label: '危险'
  111. }
  112. ])
  113. /** 打开弹窗 */
  114. const openModal = async (type: string, id?: number) => {
  115. modelVisible.value = true
  116. modelTitle.value = t('action.' + type)
  117. formType.value = type
  118. resetForm()
  119. // 修改时,设置数据
  120. if (id) {
  121. formLoading.value = true
  122. try {
  123. formData.value = await DictDataApi.getDictData(id)
  124. } finally {
  125. formLoading.value = false
  126. }
  127. }
  128. }
  129. defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
  130. /** 提交表单 */
  131. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  132. const submitForm = async () => {
  133. // 校验表单
  134. if (!formRef) return
  135. const valid = await formRef.value.validate()
  136. if (!valid) return
  137. // 提交请求
  138. formLoading.value = true
  139. try {
  140. const data = formData.value as DictDataApi.DictDataVO
  141. if (formType.value === 'create') {
  142. await DictDataApi.createDictData(data)
  143. message.success(t('common.createSuccess'))
  144. } else {
  145. await DictDataApi.updateDictData(data)
  146. message.success(t('common.updateSuccess'))
  147. }
  148. modelVisible.value = false
  149. // 发送操作成功的事件
  150. emit('success')
  151. } finally {
  152. formLoading.value = false
  153. }
  154. }
  155. /** 重置表单 */
  156. const resetForm = () => {
  157. formData.value = {
  158. id: undefined,
  159. sort: undefined,
  160. label: '',
  161. value: '',
  162. dictType: '',
  163. status: CommonStatusEnum.ENABLE,
  164. colorType: '',
  165. cssClass: '',
  166. remark: ''
  167. }
  168. formRef.value?.resetFields()
  169. }
  170. </script>