execl-upload.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. <script setup lang="ts">
  2. import { ref } from "vue";
  3. import { ElMessage, ElUpload, UploadFile, UploadProps } from "element-plus";
  4. import { httpUpload } from "/@/api/InvoiceSales/capitalClaim";
  5. import { useUserStore } from "/@/store/modules/user";
  6. import { useResponseHandle } from "/@/hooks";
  7. const visible = ref(false);
  8. const loading = ref(false);
  9. const uploadRef = ref<InstanceType<typeof ElUpload>>(null);
  10. const execlFile = ref<UploadFile | null>(null);
  11. const responseHandle = useResponseHandle();
  12. const userStore = useUserStore();
  13. //上传成功关闭dialog
  14. const handleUploadSccess = async () => (visible.value = false);
  15. //上传文件改变
  16. const handleChange: UploadProps["onChange"] = uploadFile =>
  17. (execlFile.value = uploadFile);
  18. //删除穿文件
  19. const handleRemove: UploadProps["onRemove"] = () => (execlFile.value = null);
  20. //上传方法
  21. const handleRequeset: UploadProps["httpRequest"] = async ({ file }) => {
  22. const formData = new FormData();
  23. formData.append("excel", file);
  24. formData.append("token", userStore.token);
  25. const { message, code } = await httpUpload(formData);
  26. responseHandle({
  27. message,
  28. code,
  29. handler: () => ElMessage.success("导入文件成功")
  30. });
  31. };
  32. const handleClose = () => {
  33. execlFile.value = null;
  34. uploadRef.value.clearFiles();
  35. };
  36. //提交
  37. const handleSubmit = () => {
  38. if (!execlFile.value) return ElMessage.error("请选择上传文件");
  39. uploadRef.value.submit();
  40. };
  41. defineExpose({
  42. onDisplay: () => (visible.value = true)
  43. });
  44. </script>
  45. <template>
  46. <el-dialog v-model="visible" title="导入表格数据" center @close="handleClose">
  47. <el-upload
  48. ref="uploadRef"
  49. action="#"
  50. class="execl-uploader"
  51. accept=".xls,.xlsx"
  52. :auto-upload="false"
  53. :http-request="handleRequeset"
  54. @change="handleChange"
  55. @remove="handleRemove"
  56. @success="handleUploadSccess"
  57. >
  58. <div class="el-upload__text" v-if="!execlFile">点击此处,上传文件</div>
  59. </el-upload>
  60. <div flex justify-end mt-2 gap-2>
  61. <el-button type="primary" :loading="loading" @click="handleSubmit"
  62. >保存</el-button
  63. >
  64. <el-button>取消</el-button>
  65. </div>
  66. </el-dialog>
  67. </template>
  68. <style lang="scss" scoped>
  69. .execl-uploader {
  70. border: 1px dashed var(--el-border-color);
  71. border-radius: 6px;
  72. cursor: pointer;
  73. position: relative;
  74. overflow: hidden;
  75. transition: var(--el-transition-duration-fast);
  76. display: flex;
  77. flex-direction: column;
  78. justify-content: center;
  79. &:hover {
  80. border-color: var(--el-color-primary);
  81. }
  82. .el-upload__text {
  83. line-height: 200px;
  84. font-size: 22px;
  85. }
  86. }
  87. </style>