255 lines
6.0 KiB
Vue
255 lines
6.0 KiB
Vue
<template>
|
||
<el-dialog
|
||
v-loading='loadingStatus'
|
||
element-loading-text="处理中,请耐心等待..."
|
||
element-loading-background="rgba(0,0,0,0.1)"
|
||
class="dialog-just-form"
|
||
:visible="visible"
|
||
@close="handleClose"
|
||
width="30%"
|
||
:title="title"
|
||
:destroy-on-close="false"
|
||
:close-on-click-modal="configs.clickModalToClose ?? false">
|
||
<el-upload
|
||
style="margin-top: 24px; text-align: center"
|
||
drag
|
||
:action="actionUrl"
|
||
:headers="uploadHeaders"
|
||
:show-file-list="false"
|
||
:on-error="handleError"
|
||
:on-success="handleSuccess"
|
||
:on-progress="handleUploading"
|
||
:before-upload="handleBeforeUploadCheck">
|
||
<i class="el-icon-upload"></i>
|
||
<div class="el-upload__text">
|
||
将文件拖到此处,或
|
||
<em>点击上传</em>
|
||
</div>
|
||
<div class="el-upload__tip" slot="tip">{{ hint }}</div>
|
||
</el-upload>
|
||
|
||
<div slot="footer">
|
||
<el-button
|
||
type="success"
|
||
@click="
|
||
handleBtnClick({
|
||
name: 'download-template',
|
||
filename: savedFilename,
|
||
url: templateUrl,
|
||
})
|
||
">
|
||
下载模板
|
||
</el-button>
|
||
<el-button @click="handleBtnClick({ name: 'cancel' })">取消</el-button>
|
||
</div>
|
||
</el-dialog>
|
||
</template>
|
||
|
||
<script>
|
||
import { pick as __pick } from "@/utils/filters";
|
||
import Cookies from "js-cookie";
|
||
// import moment from "moment";
|
||
|
||
export default {
|
||
name: "DialogUpload",
|
||
props: {
|
||
title: {
|
||
type: String,
|
||
default: "导入",
|
||
},
|
||
hint: {
|
||
hint: String,
|
||
default: "只能上传 Excel 文件",
|
||
},
|
||
filename: {
|
||
hint: String,
|
||
default: "default_file.xlsx",
|
||
},
|
||
url: {
|
||
// 下载地址
|
||
hint: String,
|
||
default: "/importTemplates/orderImport.xlsx",
|
||
},
|
||
configs: {
|
||
type: Object,
|
||
default: () => ({
|
||
clickModalToClose: false,
|
||
forms: null,
|
||
}),
|
||
},
|
||
},
|
||
inject: ["urls"],
|
||
data() {
|
||
return {
|
||
loadingStatus: false,
|
||
visible: false,
|
||
};
|
||
},
|
||
computed: {
|
||
uploadHeaders() {
|
||
return {
|
||
token: Cookies.get("token") || "",
|
||
};
|
||
},
|
||
actionUrl() {
|
||
return window.SITE_CONFIG["apiURL"] + this.urls.importUrl;
|
||
},
|
||
savedFilename() {
|
||
return "templateUrl" in this.urls ? this.urls.templateUrl.split("/").pop() : this.filename;
|
||
},
|
||
templateUrl() {
|
||
return "templateUrl" in this.urls ? this.urls.templateUrl : this.url ?? "#";
|
||
},
|
||
},
|
||
methods: {
|
||
init(data) {
|
||
this.visible = true;
|
||
},
|
||
|
||
fileTypeCheck() {
|
||
// 上传前检查文件类型: Boolean
|
||
},
|
||
|
||
fileSizeCheck() {
|
||
// 上传前检查文件大小: Boolean
|
||
},
|
||
|
||
handleUploading() {
|
||
this.loadingStatus = true
|
||
},
|
||
|
||
handleBeforeUploadCheck(file) {
|
||
if (typeof file !== "object") return false;
|
||
if (!("name" in file) || !("type" in file)) return false;
|
||
const isXlsx =
|
||
file.name.split(".").pop() === "xlsx" &&
|
||
file.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
||
const isXls = file.name.split(".").pop() === "xls" && file.type === "application/vnd.ms-excel";
|
||
if (isXls || isXlsx) return true;
|
||
// false
|
||
this.$message({
|
||
message: "仅支持上传 Excel(.xls, .xlsx) 文件",
|
||
type: "error",
|
||
duration: 1500,
|
||
});
|
||
return false;
|
||
},
|
||
|
||
handleSuccess(response, file, fileList) {
|
||
console.log("success response", response);
|
||
this.loadingStatus = false
|
||
try {
|
||
if ("code" in response && response.code === 500) {
|
||
this.$message({
|
||
message: response.msg,
|
||
type: "error",
|
||
duration: 1500,
|
||
});
|
||
return;
|
||
}
|
||
|
||
let message = "";
|
||
let isError = false;
|
||
|
||
if (typeof response === "object" && "msg" in response) message = response.msg;
|
||
if (typeof response === "object" && "data" in response) message = response.data.toString();
|
||
if (typeof response === "string") {
|
||
message = response;
|
||
isError = true;
|
||
}
|
||
|
||
this.handleClose();
|
||
this.$emit("uploadSuccess");
|
||
this.$message({
|
||
message,
|
||
type: isError ? "error" : "info",
|
||
duration: 2000,
|
||
});
|
||
} catch (err) {
|
||
this.$message({
|
||
message: response,
|
||
type: "error",
|
||
duration: 2500,
|
||
});
|
||
return;
|
||
}
|
||
},
|
||
|
||
handleError(err, file, fileList) {
|
||
this.loadingStatus = false
|
||
console.log("err", err);
|
||
},
|
||
|
||
handleBtnClick(payload) {
|
||
if ("name" in payload) {
|
||
switch (payload.name) {
|
||
case "cancel":
|
||
this.handleClose();
|
||
break;
|
||
case "download-template":
|
||
this.handleDownloadTemplate(payload.filename, payload.url);
|
||
break;
|
||
}
|
||
}
|
||
},
|
||
|
||
handleDownloadTemplate(filename, href) {
|
||
this.$notify({
|
||
title: "提示",
|
||
message: "开始下载,请稍后检查浏览器的下载选项或者下载目录",
|
||
type: "success",
|
||
});
|
||
|
||
// 下载模板
|
||
let a = document.createElement("a");
|
||
a.href = href;
|
||
a.download = filename ?? "orderTemplate.xlsx";
|
||
document.body.appendChild(a);
|
||
a.click();
|
||
document.body.removeChild(a);
|
||
},
|
||
|
||
handleUploadChange(file, fileList) {
|
||
// console.log("[Upload] handleUploadChange...", file, fileList);
|
||
},
|
||
|
||
handleClose() {
|
||
this.visible = false;
|
||
|
||
setTimeout(() => {
|
||
this.$emit("destroy-dialog");
|
||
}, 200);
|
||
},
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style scoped>
|
||
.dialog-just-form >>> .el-dialog__body {
|
||
/* padding-top: 16px !important;
|
||
padding-bottom: 16px !important; */
|
||
padding-top: 0 !important;
|
||
padding-bottom: 0 !important;
|
||
}
|
||
|
||
.el-select,
|
||
.el-cascader,
|
||
.el-date-editor {
|
||
width: 100% !important;
|
||
}
|
||
|
||
.dialog-just-form >>> .el-dialog__header {
|
||
padding: 10px 20px 10px;
|
||
/* background: linear-gradient(to bottom, rgba(0, 0, 0, 0.25), white); */
|
||
}
|
||
|
||
.h0 {
|
||
height: 0;
|
||
width: 0;
|
||
}
|
||
|
||
.dialog-just-form >>> .dialog-demo {
|
||
text-align: center;
|
||
}
|
||
</style>
|