index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <script setup lang="ts">
  2. /**
  3. * @Name: index.vue
  4. * @Description: 文件上传
  5. * @Author: Cheney
  6. */
  7. import { ButtonProps, genFileId, UploadInstance, UploadRawFile } from 'element-plus';
  8. import { BtnPermissionStore } from '/@/plugin/permission/store.permission';
  9. import { uploadFile } from '/@/views/product-manage/product-list/api';
  10. const { data } = BtnPermissionStore();
  11. const attrs = useAttrs() as any;
  12. const refreshView = inject('refreshView');
  13. const props = defineProps<
  14. {
  15. uploadFunction: (url: 'URL') => Promise<any>;
  16. } & Partial<Omit<ButtonProps, 'disabled' | 'loading' | 'color'>>
  17. >();
  18. function hasPermission(permissions: string | string[]): boolean {
  19. if (typeof permissions === 'string') {
  20. return data.includes(permissions);
  21. } else if (Array.isArray(permissions)) {
  22. return permissions.every((permission) => data.includes(permission));
  23. }
  24. return false;
  25. }
  26. const upload = ref<UploadInstance>();
  27. const upBtnLoading = ref(false);
  28. /**
  29. * @description 替换文件并上传
  30. * @param files 文件列表
  31. */
  32. function handleExceed(files: any) {
  33. upload.value!.clearFiles();
  34. const file = files[0] as UploadRawFile;
  35. file.uid = genFileId();
  36. upload.value!.handleStart(file);
  37. upload.value!.submit();
  38. }
  39. /**
  40. * 上传文件
  41. * @param uploadRequest 上传请求
  42. */
  43. async function handleCustomUpload(uploadRequest: any) {
  44. upBtnLoading.value = true;
  45. try {
  46. const { file } = uploadRequest;
  47. const formData = new FormData();
  48. formData.append('file', file);
  49. const resp = await uploadFile(formData);
  50. const fileUrl = resp.data.url;
  51. const response = await props.uploadFunction({ url: fileUrl });
  52. handleResponse(response);
  53. // processResponseData(response.data);
  54. uploadRequest.onSuccess(response); // 通知 el-upload 上传成功
  55. } catch (error) {
  56. console.log('==Error==', error);
  57. uploadRequest.onError(error);
  58. } finally {
  59. upBtnLoading.value = false;
  60. }
  61. }
  62. /**
  63. * 统一处理响应
  64. * @param response 后端返回的响应
  65. */
  66. function handleResponse(response: any) {
  67. if (response.code === 2000) {
  68. ElMessage.success({ message: response.msg, plain: true });
  69. // 上传成功后调用刷新父组件的方法
  70. if (refreshView) {
  71. refreshView();
  72. }
  73. } else {
  74. ElMessage.error({ message: response.msg, plain: true });
  75. }
  76. }
  77. </script>
  78. <template>
  79. <div>
  80. <el-upload
  81. ref="upload"
  82. action="#"
  83. :limit="1"
  84. :show-file-list="false"
  85. :auto-upload="true"
  86. :on-exceed="handleExceed"
  87. :http-request="handleCustomUpload"
  88. accept=".xls,.xlsx"
  89. >
  90. <template #trigger>
  91. <el-button
  92. v-if="attrs.show ? hasPermission(attrs.show) : true"
  93. :disabled="attrs.permissions ? !hasPermission(attrs.permissions) : false"
  94. :loading="upBtnLoading"
  95. :color="attrs.myColor"
  96. v-bind="props"
  97. >
  98. <!--:loading="upBtnLoading" color="#6366f1" v-bind="props">-->
  99. <slot></slot>
  100. </el-button>
  101. </template>
  102. </el-upload>
  103. </div>
  104. </template>
  105. <style scoped></style>