74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Vue
		
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Vue
		
	
	
|  | <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> |