index.vue 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. const emits = defineEmits(['handel-error']);
  29. /**
  30. * @description 替换文件并上传
  31. * @param files 文件列表
  32. */
  33. function handleExceed(files: any) {
  34. upload.value!.clearFiles();
  35. const file = files[0] as UploadRawFile;
  36. file.uid = genFileId();
  37. upload.value!.handleStart(file);
  38. upload.value!.submit();
  39. }
  40. /**
  41. * 上传文件
  42. * @param uploadRequest 上传请求
  43. */
  44. async function handleCustomUpload(uploadRequest: any) {
  45. upBtnLoading.value = true;
  46. try {
  47. const { file } = uploadRequest;
  48. const formData = new FormData();
  49. formData.append('file', file);
  50. const resp = await uploadFile(formData);
  51. const fileUrl = resp.data.url;
  52. const response = await props.uploadFunction({ url: fileUrl });
  53. handleResponse(response);
  54. uploadRequest.onSuccess(response);
  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.data.length !== 0){
  68. emits('handel-error', response.data);
  69. return;
  70. }
  71. if (response.code === 2000) {
  72. ElMessage.success({ message: response.msg, plain: true });
  73. if (refreshView) {
  74. refreshView();
  75. }
  76. }
  77. else {
  78. ElMessage.error({ message: '上传失败', plain: true });
  79. }
  80. }
  81. </script>
  82. <template>
  83. <div>
  84. <el-upload
  85. ref="upload"
  86. action="#"
  87. :limit="1"
  88. :show-file-list="false"
  89. :auto-upload="true"
  90. :on-exceed="handleExceed"
  91. :http-request="handleCustomUpload"
  92. accept=".xls,.xlsx"
  93. >
  94. <template #trigger>
  95. <el-button
  96. v-if="attrs.show ? hasPermission(attrs.show) : true"
  97. :disabled="attrs.permissions ? !hasPermission(attrs.permissions) : false"
  98. :loading="upBtnLoading"
  99. :color="attrs.myColor"
  100. v-bind="props"
  101. >
  102. <!--:loading="upBtnLoading" color="#6366f1" v-bind="props">-->
  103. <slot></slot>
  104. </el-button>
  105. </template>
  106. </el-upload>
  107. </div>
  108. </template>
  109. <style scoped></style>