index.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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']" @update:model-value="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. // import mittBus from '@/utils/mittBus'
  30. interface EmitEvent {
  31. (e: 'update'): void
  32. }
  33. const emits = defineEmits<EmitEvent>()
  34. const videoUploadRef = ref<InstanceType<typeof FileUpload> | null>(null)
  35. export interface FormParameterProps {
  36. title: string // 标题
  37. width?: number // 弹框宽度
  38. labelWidth?: number // label宽度
  39. api?: (params: any) => Promise<any> // 表单提交api
  40. isEdit?: boolean // 是否编辑
  41. top?: string // 离顶部距离
  42. formOptions?: ProForm.FormOptions // 表单配置
  43. itemsOptions: ProForm.ItemsOptions[] // 动态表单字段配置
  44. model?: Record<ProForm.FormItem['prop'], ProForm.FormItem['value']> // 表单数据对象
  45. getTableList?: () => void // 获取表格数据的Api
  46. }
  47. // dialog状态
  48. const dialogVisible = ref(false)
  49. const butLoading = ref(false)
  50. // 父组件传过来的参数
  51. const parameter = ref<FormParameterProps>({
  52. title: '',
  53. width: 500,
  54. top: '10vh',
  55. itemsOptions: [],
  56. formOptions: {},
  57. isEdit: true
  58. })
  59. const _options: ComputedRef<ProForm.FormOptions> = computed(() => {
  60. const form = {
  61. labelWidth: 120,
  62. hasFooter: false,
  63. disabled: false
  64. }
  65. return Object.assign(form, parameter.value.formOptions)
  66. })
  67. const modelAddr = ref(null)
  68. const setModelAddr = res => {
  69. console.log('modelAddr', res)
  70. modelAddr.value = res
  71. }
  72. const proFormRef = ref<InstanceType<typeof ProFrom> | null>(null)
  73. // 表单提交校验
  74. const handleSubmit = () => {
  75. const formEl = proFormRef.value?.proFormRef
  76. const formModel = proFormRef.value?.formModel
  77. formModel.modelAddress = modelAddr.value
  78. console.log('formModel', formModel)
  79. butLoading.value = true
  80. if (!formEl) return
  81. formEl.validate(valid => {
  82. if (valid) {
  83. let data = {}
  84. if (algorithmModelId.value) {
  85. data = { ...formModel, ...parameter.value.model, algorithmId: algorithmModelId.value }
  86. } else {
  87. data = { ...formModel, ...parameter.value.model }
  88. }
  89. parameter.value.api!(data).then(res => {
  90. if (res.code == 200) {
  91. proFormRef.value?.resetForm(formEl)
  92. ElMessage.success('操作成功')
  93. emits('update')
  94. dialogVisible.value = false
  95. parameter.value.getTableList && parameter.value.getTableList()
  96. } else {
  97. console.log('message', res.message)
  98. }
  99. })
  100. butLoading.value = false
  101. }
  102. butLoading.value = false
  103. })
  104. }
  105. // mittBus.on('data:fileName', (fileName: string) => {
  106. // if (fileName !== undefined && fileName !== null) {
  107. // console.log(proFormRef.value?.formModel)
  108. // if(proFormRef.value?.formModel){
  109. // proFormRef.value.formModel.name = fileName.split('.')[0]
  110. // }
  111. // }
  112. // })
  113. // 取消按钮,重置表单,关闭弹框
  114. const handleCancel = () => {
  115. console.log(parameter.value.model)
  116. const formEl = proFormRef.value?.proFormRef
  117. if (!formEl) return
  118. if (parameter.value.model?.url) {
  119. ElMessage.info('请先删除已经上传的图片')
  120. return
  121. }
  122. proFormRef.value?.resetForm(formEl)
  123. butLoading.value = false
  124. dialogVisible.value = false
  125. }
  126. let algorithmModelId = ref(0)
  127. // 接收父组件参数
  128. const openDialog = (params: FormParameterProps, algoModelId = null) => {
  129. algorithmModelId.value = algoModelId
  130. parameter.value = { ...parameter.value, ...params }
  131. _options.value.disabled = !parameter.value.isEdit
  132. butLoading.value = false
  133. dialogVisible.value = true
  134. }
  135. defineExpose({
  136. openDialog
  137. })
  138. </script>
  139. <style scoped>
  140. .upload-video-box {
  141. display: flex;
  142. align-items: center;
  143. justify-content: center;
  144. width: 100%;
  145. height: 200px;
  146. margin-top: 20px;
  147. border: 1px dashed #cccccc;
  148. :deep(.upload-file-uploader) {
  149. display: flex;
  150. align-items: center;
  151. justify-content: center;
  152. width: 100%;
  153. height: 100%;
  154. font-size: 18px;
  155. text-align: center;
  156. cursor: pointer;
  157. }
  158. }
  159. </style>