index.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <el-dialog
  3. v-model="dialogVisible"
  4. :close-on-click-modal="false"
  5. :title="parameter.title"
  6. :destroy-on-close="true"
  7. :width="parameter.width"
  8. :top="parameter.top"
  9. draggable
  10. >
  11. <ProFrom ref="proFormRef" :items-options="parameter.itemsOptions" :form-options="_options" :model="parameter.model">
  12. <template #modelAddress="{}">
  13. <FileUpload :file-size="4096" :file-type="['pt']" v-on:update:modelValue="setModelAddr"/>
  14. </template>
  15. </ProFrom>
  16. <template #footer>
  17. <span class="dialog-footer">
  18. <el-button type="primary" v-if="parameter.isEdit" :loading="butLoading" @click="handleSubmit">确认</el-button>
  19. <el-button @click="handleCancel">取消</el-button>
  20. </span>
  21. </template>
  22. </el-dialog>
  23. </template>
  24. <script setup lang="ts" name="FormDialog">
  25. import {ref, ComputedRef, computed, reactive} from 'vue'
  26. import ProFrom from '@/components/ProForm/index.vue'
  27. import { ElMessage } from 'element-plus'
  28. import FileUpload from '@/components/Upload/File.vue'
  29. interface EmitEvent {
  30. (e: 'update'): void
  31. }
  32. const emits = defineEmits<EmitEvent>()
  33. const videoUploadRef = ref<InstanceType<typeof FileUpload> | null>(null)
  34. export interface FormParameterProps {
  35. title: string // 标题
  36. width?: number // 弹框宽度
  37. labelWidth?: number // label宽度
  38. api?: (params: any) => Promise<any> // 表单提交api
  39. isEdit?: boolean // 是否编辑
  40. top?: string // 离顶部距离
  41. formOptions?: ProForm.FormOptions // 表单配置
  42. itemsOptions: ProForm.ItemsOptions[] // 动态表单字段配置
  43. model?: Record<ProForm.FormItem['prop'], ProForm.FormItem['value']> // 表单数据对象
  44. getTableList?: () => void // 获取表格数据的Api
  45. }
  46. // dialog状态
  47. const dialogVisible = ref(false)
  48. const butLoading = ref(false)
  49. // 父组件传过来的参数
  50. const parameter = ref<FormParameterProps>({
  51. title: '',
  52. width: 500,
  53. top: '10vh',
  54. itemsOptions: [],
  55. formOptions: {},
  56. isEdit: true
  57. })
  58. const _options: ComputedRef<ProForm.FormOptions> = computed(() => {
  59. const form = {
  60. labelWidth: 120,
  61. hasFooter: false,
  62. disabled: false
  63. }
  64. return Object.assign(form, parameter.value.formOptions)
  65. })
  66. const modelAddr = ref('')
  67. const setModelAddr = res => {
  68. console.log('modelAddr', res)
  69. modelAddr.value = res
  70. }
  71. const proFormRef = ref<InstanceType<typeof ProFrom> | null>(null)
  72. // 表单提交校验
  73. const handleSubmit = () => {
  74. const formEl = proFormRef.value?.proFormRef
  75. const formModel = proFormRef.value?.formModel
  76. formModel.modelAddress = modelAddr.value
  77. console.log('formModel', formModel)
  78. butLoading.value = true
  79. if (!formEl) return
  80. formEl.validate(valid => {
  81. if (valid) {
  82. parameter.value.api!({ ...formModel, ...parameter.value.model }).then(res => {
  83. if (res.code == 200) {
  84. proFormRef.value?.resetForm(formEl)
  85. ElMessage.success('操作成功')
  86. emits('update')
  87. dialogVisible.value = false
  88. parameter.value.getTableList && parameter.value.getTableList()
  89. } else {
  90. console.log('message', res.message)
  91. }
  92. })
  93. butLoading.value = false
  94. }
  95. butLoading.value = false
  96. })
  97. }
  98. // 取消按钮,重置表单,关闭弹框
  99. const handleCancel = () => {
  100. console.log(parameter.value.model)
  101. const formEl = proFormRef.value?.proFormRef
  102. if (!formEl) return
  103. if (parameter.value.model?.url) {
  104. ElMessage.info('请先删除已经上传的图片')
  105. return
  106. }
  107. proFormRef.value?.resetForm(formEl)
  108. butLoading.value = false
  109. dialogVisible.value = false
  110. }
  111. // 接收父组件参数
  112. const openDialog = (params: FormParameterProps) => {
  113. parameter.value = { ...parameter.value, ...params }
  114. _options.value.disabled = !parameter.value.isEdit
  115. butLoading.value = false
  116. dialogVisible.value = true
  117. }
  118. defineExpose({
  119. openDialog
  120. })
  121. </script>
  122. <style scoped>
  123. .upload-video-box {
  124. display: flex;
  125. align-items: center;
  126. justify-content: center;
  127. width: 100%;
  128. height: 200px;
  129. margin-top: 20px;
  130. border: 1px dashed #cccccc;
  131. :deep(.upload-file-uploader) {
  132. display: flex;
  133. align-items: center;
  134. justify-content: center;
  135. width: 100%;
  136. height: 100%;
  137. font-size: 18px;
  138. text-align: center;
  139. cursor: pointer;
  140. }
  141. }
  142. </style>