<template>
|
<div class="upload-container">
|
<a :href="template.url" ref="template"></a>
|
<div class="button-group">
|
<el-upload
|
style="float: left"
|
ref="uploadFile"
|
:max-size="maxSize"
|
:on-change="clearMsg"
|
:before-upload="beforeUpload"
|
:action="url"
|
>
|
<el-button size="small"
|
><i class="el-icon-folder-opened"></i>选择文件</el-button
|
>
|
</el-upload>
|
<el-button
|
v-if="template.url"
|
style="margin-left: 10px"
|
type="primary"
|
size="small"
|
@click="dowloadTemplate"
|
:loading="loadingStatus"
|
>
|
<i class="el-icon-bottom"></i>
|
下载模板</el-button
|
>
|
<el-button
|
type="success"
|
size="small"
|
@click="upload"
|
:loading="loadingStatus"
|
>
|
<i class="el-icon-top"></i>
|
上传文件</el-button
|
>
|
</div>
|
<div class="alert">
|
<el-alert title="上传说明" type="warning" :closable="false" show-icon
|
>只能上传excel文件,文件大小不超过{{ maxSize }}M</el-alert
|
>
|
</div>
|
|
<div v-if="file">
|
<h3>文件列表</h3>
|
<div class="file-info">
|
<span>文件名:{{ file.name }}</span>
|
<span>大小{{ (file.size / 1024).toFixed(2) }}KB</span>
|
</div>
|
</div>
|
<div v-show="message" class="v-r-message">
|
<h3 class="title">上传结果</h3>
|
<div class="text" :class="resultClass" v-html="message"></div>
|
</div>
|
<slot></slot>
|
</div>
|
</template>
|
<script>
|
//目前只支持单个Excel上传,其他功能开发中...
|
export default {
|
components: {},
|
props: {
|
url: {
|
type: String,
|
default: ''
|
},
|
template: {
|
//下载模板配置
|
type: Object,
|
default: () => {
|
return {
|
url: '', //模板下载路径,如果没有模板路径,则不显示下载模板功能
|
fileName: '未定义文件名' //下载模板的文件名
|
};
|
}
|
},
|
importExcelBefore: {
|
type: Function,
|
default: (file) => {
|
return true;
|
}
|
}
|
},
|
data() {
|
return {
|
maxSize: 100,
|
model: true,
|
file: null,
|
loadingStatus: false,
|
message: '',
|
resultClass: ''
|
};
|
},
|
methods: {
|
clearMsg() {
|
this.message = '';
|
},
|
reset() {
|
this.file = null;
|
this.message = '';
|
this.resultClass = '';
|
},
|
getFileType() {
|
let fileName =
|
this.file.name
|
.split('.')
|
.pop()
|
.toLocaleLowerCase() || '';
|
if (['numbers', 'csv', 'xls', 'xlsx'].indexOf(fileName) == -1) {
|
this.$Message.error('只能选择excel文件');
|
return false;
|
}
|
return true;
|
},
|
beforeUpload(file) {
|
this.file = file;
|
if (!this.getFileType()) {
|
return false;
|
}
|
return false;
|
},
|
upload() {
|
let _url = this.url;
|
if (!_url) {
|
return this.$Message.error('没有配置好Url');
|
}
|
|
if (!this.file) {
|
return this.$Message.error('请选择文件');
|
}
|
var formData = new FormData();
|
formData.append('fileInput', this.file);
|
if (!this.importExcelBefore(formData)) {
|
return;
|
}
|
this.loadingStatus = true;
|
this.http.post(_url, formData).then(
|
(x) => {
|
// this.$refs.uploadFile.clearFiles();
|
this.loadingStatus = false;
|
this.file = null;
|
if (x.status) {
|
this.$emit('importExcelAfter', x);
|
}
|
|
this.message = x.message;
|
this.resultClass = x.status ? 'v-r-success' : 'v-r-error';
|
},
|
(error) => {
|
this.loadingStatus = false;
|
}
|
);
|
},
|
dowloadTemplate() {
|
let url = this.template.url;
|
let xmlResquest = new XMLHttpRequest();
|
xmlResquest.open('GET', url, true);
|
xmlResquest.setRequestHeader('Content-type', 'application/json');
|
xmlResquest.setRequestHeader(
|
'Authorization',
|
this.$store.getters.getToken()
|
);
|
let fileName = this.template.fileName + '.xlsx';
|
let elink = this.$refs.template;
|
xmlResquest.responseType = 'blob';
|
let $_vue = this;
|
this.loadingStatus = true;
|
xmlResquest.onload = function(oEvent) {
|
$_vue.loadingStatus = false;
|
if (xmlResquest.response.type == 'application/json') {
|
return $_vue.message.error('未找到下载文件');
|
}
|
let content = xmlResquest.response;
|
elink.download = fileName;
|
let blob = new Blob([content]);
|
elink.href = URL.createObjectURL(blob);
|
elink.click();
|
};
|
xmlResquest.send();
|
}
|
}
|
};
|
</script>
|
<style lang="less" scoped>
|
.upload-container {
|
min-height: 270px !important;
|
display: inline-block;
|
width: 100%;
|
padding: 10px;
|
border: 1px dashed #989898;
|
min-height: 250px;
|
border-radius: 5px;
|
.alert {
|
margin-top: 12px;
|
}
|
.el-button-group > * {
|
display: flex;
|
}
|
h3 {
|
margin: 9px 0px;
|
}
|
.file-info > span {
|
margin-right: 20px;
|
}
|
.v-r-message {
|
margin-top: 10px;
|
.title {
|
margin-bottom: 2px;
|
}
|
> .text {
|
font-size: 13px;
|
}
|
.v-r-success {
|
color: #02b702;
|
}
|
.v-r-error {
|
color: #dc0909;
|
}
|
}
|
}
|
</style>
|