index.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <template>
  2. <el-dialog v-model="dialogVisible" :width="parameter.width" :top="parameter.top" :title="`${parameter.title}`" :destroy-on-close="true" draggable>
  3. <el-form class="drawer-multiColumn-form" label-width="100px">
  4. <el-form-item label="图片数据集压缩文件上传">
  5. <el-upload
  6. action="#"
  7. class="upload"
  8. :drag="true"
  9. :show-file-list="true"
  10. :http-request="uploadZip"
  11. :before-upload="beforeZipUpload"
  12. :on-exceed="handleExceed"
  13. :accept="parameter.ZipFileType!.join(',')"
  14. >
  15. <slot name="empty">
  16. <el-icon class="el-icon--upload">
  17. <upload-filled />
  18. </el-icon>
  19. <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  20. </slot>
  21. <template #tip>
  22. <slot name="tip">
  23. <div class="el-upload__tip text-center">请上传 .zip 标准格式文件,文件最大为 {{ parameter.fileSize }}M。</div>
  24. </slot>
  25. </template>
  26. </el-upload>
  27. </el-form-item>
  28. <!-- 新增的表单字段 -->
  29. <el-form-item label="批次号" prop="batchNum">
  30. <el-input v-model="formModel.batchNum" placeholder="请输入批次号" />
  31. </el-form-item>
  32. <el-form-item label="目标类型" prop="objectType">
  33. <el-input v-model="formModel.objectType" placeholder="请输入目标类型" />
  34. </el-form-item>
  35. <el-form-item label="目标子类型" prop="objectSubtype">
  36. <el-input v-model="formModel.objectSubtype" placeholder="请输入目标子类型" />
  37. </el-form-item>
  38. <el-form-item label="场景" prop="scene">
  39. <el-input v-model="formModel.scene" placeholder="请输入场景" />
  40. </el-form-item>
  41. <el-form-item label="数据源" prop="dataSource">
  42. <el-input v-model="formModel.dataSource" placeholder="请输入数据源" />
  43. </el-form-item>
  44. <el-form-item label="采集地点" prop="gatherSpot">
  45. <el-input v-model="formModel.gatherSpot" placeholder="请输入采集地点" />
  46. </el-form-item>
  47. <el-form-item label="采集时间" prop="gatherTime">
  48. <el-date-picker v-model="formModel.gatherTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择采集时间" />
  49. </el-form-item>
  50. <el-form-item label="数据类型" prop="dataType">
  51. <el-select v-model="formModel.dataType" placeholder="请选择数据类型">
  52. <el-option v-for="item in dataTypes" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
  53. </el-select>
  54. </el-form-item>
  55. <el-form-item label="是否已标注">
  56. <el-radio-group v-model="formModel.labeled">
  57. <el-radio :label="true">是</el-radio>
  58. <el-radio :label="false">否</el-radio>
  59. </el-radio-group>
  60. </el-form-item>
  61. </el-form>
  62. <template #footer>
  63. <span class="dialog-footer">
  64. <el-button type="primary" @click="handleSubmit">确认</el-button>
  65. <el-button @click="dialogVisible = false">取消</el-button>
  66. </span>
  67. </template>
  68. </el-dialog>
  69. </template>
  70. <script setup lang="ts" name="ImportPicDataset">
  71. import { ref } from 'vue'
  72. import { ElNotification, UploadRequestOptions, UploadRawFile } from 'element-plus'
  73. export interface ParameterProps {
  74. title: string
  75. fileSize?: number
  76. limit?: number
  77. top?: string
  78. width?: number
  79. multiple?: boolean
  80. fileType?: File.ExcelMimeType[]
  81. ZipFileType?: File.ZipMimeType[]
  82. tempApi?: (params: any) => Promise<any>
  83. importApi?: (params: any) => Promise<any>
  84. getTableList?: () => void
  85. }
  86. const formModel = ref({
  87. batchNum: '',
  88. name: '',
  89. objectType: '',
  90. objectSubtype: '',
  91. scene: '',
  92. dataSource: '',
  93. gatherSpot: '',
  94. gatherTime: '',
  95. dataType: '',
  96. labeled: false
  97. })
  98. const dataTypes = ref([
  99. { dictValue: '1', dictLabel: '训练' },
  100. { dictValue: '2', dictLabel: '测试' }
  101. // 添加更多数据类型
  102. ])
  103. const dialogVisible = ref(false)
  104. const parameter = ref<ParameterProps>({
  105. title: '',
  106. limit: 1,
  107. width: 500,
  108. top: '20vh',
  109. multiple: false,
  110. fileSize: 4096,
  111. fileType: ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'],
  112. ZipFileType: ['application/zip', 'application/x-zip-compressed', 'application/x-rar-compressed']
  113. })
  114. const acceptParams = (params: ParameterProps) => {
  115. parameter.value = { ...parameter.value, ...params }
  116. dialogVisible.value = true
  117. formModel.value = {
  118. batchNum: '',
  119. name: '',
  120. objectType: '',
  121. objectSubtype: '',
  122. scene: '',
  123. dataSource: '',
  124. gatherSpot: '',
  125. gatherTime: '',
  126. dataType: '',
  127. labeled: false
  128. }
  129. }
  130. const formData = new FormData()
  131. const handleSubmit = async () => {
  132. const zipFile = formData.get('file')
  133. console.log(zipFile)
  134. if (!zipFile) {
  135. ElNotification({
  136. title: '温馨提示',
  137. message: '请上传一个压缩文件!',
  138. type: 'warning'
  139. })
  140. return
  141. }
  142. const formDataInfo = new FormData()
  143. formDataInfo.append('file', zipFile)
  144. for (const key in formModel.value) {
  145. if (Object.prototype.hasOwnProperty.call(formModel.value, key)) {
  146. formDataInfo.append(key, formModel.value[key])
  147. }
  148. }
  149. try {
  150. await parameter.value.importApi!(formDataInfo)
  151. ElNotification({
  152. title: '温馨提示',
  153. message: `文件上传成功`,
  154. type: 'success'
  155. })
  156. parameter.value.getTableList && parameter.value.getTableList()
  157. dialogVisible.value = false
  158. } catch (error) {
  159. // ElNotification({
  160. // // title: '温馨提示',
  161. // // message: `文件上传失败,请重新上传`,
  162. // // type: 'error'
  163. // })
  164. }
  165. }
  166. const uploadZip = (param: UploadRequestOptions) => {
  167. formData.append('file', param.file)
  168. }
  169. const beforeZipUpload = (file: UploadRawFile) => {
  170. const isZip = parameter.value.ZipFileType!.includes(file.type as File.ZipMimeType)
  171. const fileSize = file.size / 1024 / 1024 < parameter.value.fileSize!
  172. if (!isZip)
  173. ElNotification({
  174. title: '温馨提示',
  175. message: '上传文件只能是 zip 格式!',
  176. type: 'warning'
  177. })
  178. if (!fileSize)
  179. setTimeout(() => {
  180. ElNotification({
  181. title: '温馨提示',
  182. message: `上传文件大小不能超过 ${parameter.value.fileSize}MB!`,
  183. type: 'warning'
  184. })
  185. }, 0)
  186. return isZip && fileSize
  187. }
  188. const handleExceed = () => {
  189. ElNotification({
  190. title: '温馨提示',
  191. message: '最多只能上传一个文件!',
  192. type: 'warning'
  193. })
  194. }
  195. defineExpose({
  196. acceptParams
  197. })
  198. </script>
  199. <style lang="scss" scoped>
  200. @import './index.scss';
  201. </style>