106 lines
2.5 KiB
Vue
106 lines
2.5 KiB
Vue
<template>
|
||
<el-dialog
|
||
v-model="state.visible"
|
||
draggable
|
||
append-to-body
|
||
:title="title"
|
||
width="50%"
|
||
:close-on-click-modal="false"
|
||
:close-on-press-escape="false"
|
||
@close="onClose"
|
||
>
|
||
<div class="import-tips">
|
||
<p>{{ tips }}</p>
|
||
<el-button v-if="templateUrl" type="primary" icon="download" text @click="emit('on-download', templateUrl)">下载模板</el-button>
|
||
</div>
|
||
<el-upload ref="uploadRef" drag action="#" :show-file-list="true" accept=".xlsx,.xls" :limit="1" :http-request="onUploadExcel">
|
||
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
|
||
<div class="el-upload__text">将文件放在此处或单击上传</div>
|
||
<template #tip>
|
||
<div class="el-upload__tip">仅允许导入xls、xlsx格式文件,excel文件大小小于500kb</div>
|
||
</template>
|
||
</el-upload>
|
||
<template #footer>
|
||
<el-button type="primary" @click="onConfirm"> 确定导入</el-button>
|
||
<el-button @click="onClose"> 取消</el-button>
|
||
</template>
|
||
</el-dialog>
|
||
</template>
|
||
<script setup name="custom-import-excel">
|
||
import { reactive, ref, shallowRef } from 'vue';
|
||
import { isEmpty } from '@/utils';
|
||
const props = defineProps({
|
||
title: {
|
||
type: String,
|
||
default: '文件导入',
|
||
},
|
||
tips: {
|
||
type: String,
|
||
default: '提示:导入前请先下载模板填写信息,然后再导入!',
|
||
},
|
||
templateUrl: {
|
||
type: [String, URL],
|
||
default: '',
|
||
},
|
||
// options: {
|
||
// type: Object,
|
||
// default: () => {
|
||
// return {
|
||
// tips: '提示:导入前请先下载模板填写信息,然后再导入!',
|
||
// };
|
||
// },
|
||
// },
|
||
});
|
||
const emit = defineEmits(['on-confirm', 'on-close', 'on-download']);
|
||
|
||
const uploadRef = ref(null);
|
||
const formDate = shallowRef(null);
|
||
const state = reactive({
|
||
visible: false,
|
||
loading: false,
|
||
});
|
||
|
||
const onUploadExcel = ({ file }) => {
|
||
if (isEmpty(file.name)) return;
|
||
formDate.value = new FormData();
|
||
formDate.value.append('file', file);
|
||
};
|
||
|
||
const onConfirm = () => {
|
||
emit('on-confirm', formDate.value);
|
||
};
|
||
|
||
const onClose = () => {
|
||
uploadRef?.value && uploadRef.value.clearFiles();
|
||
state.visible = false;
|
||
};
|
||
|
||
defineExpose({
|
||
show: () => {
|
||
formDate.value = null;
|
||
state.visible = true;
|
||
},
|
||
hide: () => {
|
||
onClose();
|
||
},
|
||
clear: () => {
|
||
uploadRef?.value && uploadRef.value.clearFiles();
|
||
},
|
||
});
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.import {
|
||
&-tips {
|
||
@include flex-row();
|
||
align-items: center;
|
||
margin-bottom: 20px;
|
||
font-size: 14px;
|
||
color: #979797;
|
||
|
||
p {
|
||
flex: 3;
|
||
}
|
||
}
|
||
}
|
||
</style>
|