vue3?證件識別上傳組件封裝功能
證件圖片識別上傳根據(jù)業(yè)務(wù)需要,經(jīng)常涉及到證件上傳,例如身份證上傳、銀行卡、營業(yè)執(zhí)照等信息,根據(jù)設(shè)計師的設(shè)計,單獨封裝了一個上傳組件。識別接口后端用的是阿里云的。
上傳組件用的是 element-plus el-upload 上代碼:
<template> <div class="component-upload-image"> <el-upload :action="uploadUrl" list-type="picture-card" :on-success="handleUploadSuccess" :before-upload="handleBeforeUpload" :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" ref="imageUpload" :before-remove="handleDelete" :data="params" name="file" :show-file-list="true" :headers="headers" v-model:file-list="fileList" :on-preview="handlePictureCardPreview" :class="{ hide: fileList.length >= limit }"> <el-icon class="avatar-uploader-icon"> <plus /> </el-icon> </el-upload> <!-- 上傳提示 --> <div class="el-upload__tip" v-if="showTip"> 請上傳 <template v-if="fileSize"> 大小不超過 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template> <template v-if="fileType"> 格式為 <b style="color: #f56c6c">{{ fileType.join("、") }}</b> </template> 的文件 </div> <template v-if="showTipButton"> <el-button link type="primary" @click="showDiagram = !showDiagram" icon="InfoFilled">查看示意圖</el-button> </template> <el-image class="tip-img" :src="diagram" fit="contain" :preview-src-list="[diagram]" v-if="showDiagram" :preview-teleported="true"></el-image> <el-dialog v-model="dialogVisible" title="預(yù)覽" width="800px" append-to-body> <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" /> </el-dialog> </div> </template> <script setup name="CertificateUpload"> import { getToken } from "@/utils/auth"; const props = defineProps({ // 是否顯示示意圖 showTipButton: { type: Boolean, default: true }, // 示意圖 diagram: { type: String, default: '', }, //識別接口 action:{ type: String, default: '', }, modelValue: [String, Object, Array], limit: { type: Number, default: 1, }, // 大小限制(MB) fileSize: { type: Number, default: 5, }, // 文件類型, 例如['png', 'jpg', 'jpeg'] fileType: { type: Array, default: () => ['png','jpg','jpeg','bmp'], }, // 是否顯示提示 isShowTip: { type: Boolean, default: true }, }); const { proxy } = getCurrentInstance(); const emit = defineEmits(['update:modelValue','certificateInfo']); const showDiagram = ref(false) const dialogImageUrl = ref(""); const dialogVisible = ref(false); const baseUrl = import.meta.env.VITE_APP_BASE_API; // const uploadUrl = ref(baseUrl + props.action); // 上傳的圖片服務(wù)器地址 const headers = ref({ Authorization: "Bearer " + getToken() , repeatSubmit : false}); const uploadUrl = computed( //上傳的圖片服務(wù)器地址 () => baseUrl + props.action ); const showTip = computed( () => props.isShowTip && (props.fileType || props.fileSize) ); const params = ref({}) const fileList = computed({ get: () => { if(props.modelValue){ // 首先將值轉(zhuǎn)為數(shù)組 if(!Array.isArray(props.modelValue)){ proxy.$modal.msgError('modelValue 必須是數(shù)組 { url ossId name }[]') return [] } return props.modelValue }else{ return [] } }, set: (newVal) => {} }); // 上傳前l(fā)oading加載 function handleBeforeUpload(file) { try { let isImg = false; if (props.fileType.length) { let fileExtension = ""; if (file.name.lastIndexOf(".") > -1) { fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1); } isImg = props.fileType.some(type => { if (file.type.indexOf(type) > -1) return true; if (fileExtension && fileExtension.indexOf(type) > -1) return true; return false; }); } else { isImg = file.type.indexOf("image") > -1; } if (!isImg) { proxy.$modal.msgError( `文件格式不正確, 請上傳${props.fileType.join("/")}圖片格式文件!` ); return false; } if (props.fileSize) { const isLt = file.size / 1024 / 1024 < props.fileSize; if (!isLt) { proxy.$modal.msgError(`上傳頭像圖片大小不能超過 ${props.fileSize} MB!`); return false; } } params.value.name = file.name.replace(/\.[a-zA-Z]+$/g, '') + '_' + new Date().getTime() // 帶上時間戳,避免文件地址重復(fù)被覆蓋 proxy.$modal.loading("正在上傳圖片,請稍候..."); } catch (error) { proxy.$modal.closeLoading(); console.log(error) } } // 文件個數(shù)超出 function handleExceed() { proxy.$modal.msgError(`上傳文件數(shù)量不能超過 ${props.limit} 個!`); } // 上傳成功回調(diào) function handleUploadSuccess(res, file, fileList) { try { if (res.code === 200) { // 多張 // const all = [res.data.file.url, ...fileList.filter(z=>!z.response).map(u=>u.url)].join(',') emit("update:modelValue", [{ url: res.data.oss.url, name: res.data.oss.fileName, ossId: res.data.oss.ossId }]) emit("certificateInfo",res.data.recognition.data) proxy.$modal.closeLoading(); } else { proxy.$modal.closeLoading(); proxy.$modal.msgError(res.msg); proxy.$refs.imageUpload.handleRemove(file); } } catch (error) { proxy.$modal.closeLoading(); console.log(error) } } // 刪除圖片 function handleDelete(file) { const findex = fileList.value.map(f => f.url).indexOf(file.url); if (findex > -1) { fileList.value.splice(findex, 1); emit("update:modelValue", fileList.value.map(z => z.url).join(',')) return false; } } // 上傳失敗 function handleUploadError() { proxy.$modal.msgError("上傳圖片失敗"); proxy.$modal.closeLoading(); } // 預(yù)覽 function handlePictureCardPreview(file) { dialogImageUrl.value = file.url; dialogVisible.value = true; } </script> <style scoped lang="scss"> :deep(.hide .el-upload--picture-card) { display: none; } </style>
到此這篇關(guān)于vue3 證件識別上傳組件封裝的文章就介紹到這了,更多相關(guān)vue3 證件識別上傳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-cli2.x項目優(yōu)化之引入本地靜態(tài)庫文件的方法
這篇文章主要介紹了vue-cli2.x項目優(yōu)化之引入本地靜態(tài)庫文件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06關(guān)于vue 結(jié)合原生js 解決echarts resize問題
這篇文章主要介紹了關(guān)于vue 結(jié)合原生js 解決echarts resize問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07vue iview多張圖片大圖預(yù)覽、縮放翻轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了vue iview多張圖片大圖預(yù)覽、縮放翻轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07如何利用VUE監(jiān)聽網(wǎng)頁關(guān)閉并執(zhí)行退出操作
這篇文章主要給大家介紹了關(guān)于如何利用VUE監(jiān)聽網(wǎng)頁關(guān)閉并執(zhí)行退出操作的相關(guān)資料,因為項目中需求,瀏覽器關(guān)閉時進行一些操作處理,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-083分鐘搞定vite項目(vue/react)使用vite-plugin-pwa配置為pwa應(yīng)用
這篇文章主要介紹了3分鐘搞定vite項目(vue/react)使用vite-plugin-pwa配置為pwa應(yīng)用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-02-02vue中子組件向父組件傳遞數(shù)據(jù)的實例代碼(實現(xiàn)加減功能)
這篇文章主要介紹了vue中子組件向父組件傳遞數(shù)據(jù)的實例代碼(實現(xiàn)加減功能) ,需要的朋友可以參考下2018-04-04