indexImport.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <script setup lang="ts">
  2. defineOptions({
  3. name: "IndexDefineImport"
  4. });
  5. import { ref } from "vue";
  6. import { uploadData } from "@/api/indexData";
  7. import { ElMessage } from "element-plus";
  8. import { useRouter } from "vue-router";
  9. const $router = useRouter();
  10. const emit = defineEmits(["handleImport"]);
  11. const fileDocument = ref<File | null>(null); // 存储文件
  12. const backupUrl =
  13. import.meta.env.VITE_BACKUP_URL + "/download/指标数据模板.xlsx";
  14. // 上传文件函数
  15. // 上传文件函数
  16. const uploadFile = async () => {
  17. if (!fileDocument.value) {
  18. ElMessage.error("请先上传文件");
  19. return;
  20. }
  21. try {
  22. const formData = new FormData();
  23. // 将生成的文件添加到 FormData 中
  24. formData.append("file", fileDocument.value);
  25. // 调用 API 上传文件
  26. const { data } = await uploadData(formData);
  27. if (data.code === 200) {
  28. // 根据后端返回的 code 判断是否成功
  29. ElMessage.success("文件上传并导入成功");
  30. // 重置上传状态
  31. backDefine();
  32. $router.push("/indexData/index");
  33. } else {
  34. ElMessage.error(data.msg);
  35. }
  36. } catch (error) {
  37. ElMessage.error("上传失败,请重试");
  38. }
  39. };
  40. const backDefine = () => {
  41. emit("handleImport");
  42. };
  43. // 处理文件上传并解析 Excel 内容
  44. const handleUploadChange = async (file: File) => {
  45. fileDocument.value = file; // 保存文件
  46. let fileType = file.name.slice(-4);
  47. if (fileType !== "xlsx") {
  48. ElMessage.error("请上传xlsx文件");
  49. }
  50. return false;
  51. };
  52. </script>
  53. <template>
  54. <div>
  55. <div class="w-3/4 m-auto mt-4">
  56. <div class="w-full bg p-3">
  57. <h5>1.下载导入模板</h5>
  58. <p class="text-xs mt-2 text">根据提升信息完善表格内容</p>
  59. <el-button class="mt-2">
  60. <el-icon> <Download /> </el-icon
  61. ><a :href="backupUrl" download="指标导入模板.xlsx"
  62. >下载空的模板表格</a
  63. >
  64. </el-button>
  65. </div>
  66. <div class="w-full mt-4 bg p-3">
  67. <h5>2.上传完善后的模板</h5>
  68. <p class="text-xs mt-2 text mb-2">
  69. 更新信息的模板中,如有空的数据列,则相应字段信息会被清空,请谨慎填写
  70. </p>
  71. <div>
  72. <el-upload
  73. class="upload-demo"
  74. drag
  75. multiple
  76. :before-upload="file => handleUploadChange(file)"
  77. >
  78. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  79. <div class="el-upload__text">
  80. 点击<em>图标选择上传</em>或者将文件拖拽到此区域
  81. </div>
  82. </el-upload>
  83. <div v-if="fileDocument && fileDocument.name">
  84. {{ fileDocument.name }}
  85. </div>
  86. </div>
  87. <div class="float-right">
  88. <el-button @click="backDefine">取消</el-button>
  89. <el-button type="primary" @click="uploadFile">确认</el-button>
  90. </div>
  91. <p class="h-11 no-select">.</p>
  92. </div>
  93. </div>
  94. </div>
  95. </template>
  96. <style lang="scss" scoped>
  97. .bg {
  98. background-color: #f8f9fa;
  99. }
  100. .text {
  101. color: #999;
  102. }
  103. .upoload {
  104. float: right;
  105. }
  106. .no-select {
  107. color: rgb(255 255 255 / 0%);
  108. user-select: none;
  109. }
  110. .float-right {
  111. margin-top: 10px;
  112. }
  113. </style>