zy-vue-library/components/import_file/index.vue

74 lines
2.3 KiB
Vue
Raw Permalink Normal View History

2025-10-22 11:19:51 +08:00
<template>
<el-dialog v-model="visible" :title="title" :before-close="fnClose">
<el-form ref="formRef" :model="form" :rules="rules" :label-width="labelWidth">
<slot :form="form"></slot>
<el-form-item label="附件" prop="file">
<app-upload v-model="form.file" accept=".xls,.xlsx" />
</el-form-item>
</el-form>
<template #footer>
<el-button v-if="templateUrl" @click="fnExportTemplates">
导出模板
</el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
<el-button @click="fnClose"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import { useVModel } from "@vueuse/core";
import { ElDialog, ElForm, ElFormItem, ElButton, ElMessageBox } from "element-plus";
import "element-plus/es/components/dialog/style/css";
import "element-plus/es/components/form/style/css";
import "element-plus/es/components/form-item/style/css";
import "element-plus/es/components/button/style/css";
import AppUpload from "../upload/index.vue";
import useForm from "../../hooks/useForm/index.js";
import { getFileUrl } from "../../utils/index.js";
defineOptions({
name: "AppImportFile",
});
const props = defineProps({
labelWidth: { type: String, default: "80px" },
title: { type: String, default: "导入" },
templateUrl: { type: String, default: "" },
customForm: { type: Boolean, default: false },
form: { type: Object, default: () => ({ file: [] }) },
rules: {
type: Object,
default: () => ({
file: [{ required: true, message: "附件不能为空", trigger: "change" }],
}),
},
});
const emits = defineEmits(["submit", "update:form"]);
const visible = defineModel("visible", { type: Boolean, required: true });
const form = props.customForm
? useVModel(props, "form", emits)
: ref({ file: [] });
const { formRef, validate, reset } = useForm();
const fnExportTemplates = async () => {
await ElMessageBox.confirm("确定要下载excel模板吗", { type: "warning" });
window.open(getFileUrl() + props.templateUrl);
};
const fnClose = () => {
reset();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await validate();
emits("submit", form.value);
reset();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>