550 lines
22 KiB
Vue
550 lines
22 KiB
Vue
<template>
|
||
<div class="main">
|
||
<largeScreenHeader></largeScreenHeader>
|
||
<div class="mainContent">
|
||
<div class="boxLevelOne sideBoxLevelOne">
|
||
<div class="boxLevelTwo boxLevelTwoFst">
|
||
<boxHeader :boxHeaderText="'识别结果统计'"></boxHeader>
|
||
<pieIDResultCount></pieIDResultCount>
|
||
</div>
|
||
|
||
<div class="boxLevelTwo">
|
||
<boxHeader :boxHeaderText="'识别结果展示'"></boxHeader>
|
||
<div class="faceContentBox">
|
||
<img src="../../assets/images/resultHeader.png" alt="error" class="resultHeader">
|
||
<table class="faceContentTable">
|
||
<thead>
|
||
<tr class="faceContentRow">
|
||
<th class="faceContentColume faceContentColumeSort">序号</th>
|
||
<th class="faceContentColume faceContentColumeIPAddr">访问地址</th>
|
||
<th class="faceContentColume faceContentColumeDate">访问时间</th>
|
||
<th class="faceContentColume faceContentColumeTime">响应时长</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr v-for="(item, index) in recognition.slice(0, 7)" :key="index"
|
||
:class="{ 'faceContentRowEven': index % 2 === 0, 'faceContentRowPrime': index % 2 !== 0 }">
|
||
<td class="faceContentColume faceContentColumeSort">{{ index + 1 }}</td>
|
||
<td class="faceContentColume faceContentColumeIPAddr">{{ item.ip }}</td>
|
||
<td class="faceContentColume faceContentColumeDate">{{ item.returnTime }}</td>
|
||
<td class="faceContentColume faceContentColumeTime">{{ item.responseTime }}</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="boxLevelOne midBoxLevelOne">
|
||
<boxHeader :boxHeaderText="'OCR识别应用'"></boxHeader>
|
||
<div class="pressButton">
|
||
<button class="IDpressButtons1 ">身份证识别</button>
|
||
<button class="invoicePressButtons1 " @click="goToInvoiceRecognition">发票识别</button>
|
||
<button class="textPressButtons1" @click="goToTextRecognition">文本识别</button>
|
||
</div>
|
||
<div class="mainIdPicid">
|
||
<img class="IDCardMainid" src="../../assets/images/IDCardMain.png" alt="error">
|
||
<img class="IDCardMainUpid" src="../../assets/images/IDCardMainUp.png" alt="error">
|
||
<img class="IDCardMainDownid" src="../../assets/images/IDCardMainDown.png" alt="error">
|
||
|
||
</div>
|
||
|
||
<div class="testIdPicId">
|
||
<div class="IDMidReco">
|
||
<div class="icon">
|
||
<div class="text">身份证信息</div>
|
||
<img src="../../assets/images/IDTextBackImg.png" alt="error" class="faceThree">
|
||
</div>
|
||
<div class="content">
|
||
<img src="../../assets/images/borderIDCard.png" alt="error" class="backIDRecoMain">
|
||
<button class="commit" @click="onMount">识别</button>
|
||
<div class="IDCardPositive">
|
||
<el-upload class="upload-demo" :on-preview="handleBeforeUpload" :before-remove="beforeRemove"
|
||
drag :action="urlposi" accept=".jpg,.png" :limit=1 :on-change="handleUploading" ref="IDposi"
|
||
list-type="picture-card" :auto-upload="false" v-bind="dataList" :show-file-list="true">
|
||
<i slot="default" class="el-icon-plus"></i>
|
||
<div class="el-upload-list__item-thumbnail" slot="file" slot-scope="{file}">
|
||
<img class="el-upload-list__item-thumbnail" :src="file.url" alt="" :key="file.uid"
|
||
style="object-fit: cover; width: 15.3rem !important; height:9.8rem; position: absolute;top:-0.8rem;left:-1.2rem">
|
||
<span class="el-upload-list__item-actions">
|
||
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
|
||
<i class="el-icon-zoom-in"></i>
|
||
</span>
|
||
<span v-if="!disabled" class="el-upload-list__item-delete"
|
||
@click="handleDownload(file)">
|
||
<i class="el-icon-download"></i>
|
||
</span>
|
||
<span v-if="!disabled" class="el-upload-list__item-delete" @click="handleRemove(file)">
|
||
<i class="el-icon-delete"></i>
|
||
</span>
|
||
</span>
|
||
</div>
|
||
</el-upload>
|
||
<el-dialog :visible.sync="dialogVisible">
|
||
<img width="100%" :src="dialogImageUrl" alt="">
|
||
</el-dialog>
|
||
|
||
</div>
|
||
<div class="IDCardNegative">
|
||
|
||
<el-upload class="upload-demo" :on-preview="handleBeforeUpload" :before-remove="beforeRemove"
|
||
drag :action="urlposi" accept=".jpg,.png" :limit=1 v-bind="dataList" :on-error="IDerror"
|
||
:on-change="handleUploading" :on-success="handleUploadSuccess" list-type="picture-card"
|
||
:auto-upload="false" ref="IDnega">
|
||
<i slot="default" class="el-icon-plus"></i>
|
||
<div slot="file" slot-scope="{file}">
|
||
<img class="el-upload-list__item-thumbnail" :src="file.url" alt=""
|
||
style="object-fit: cover; width: 15.3rem !important; height:9.8rem; position: absolute;top:-0.8rem;left:-1.2rem">
|
||
<span class="el-upload-list__item-actions">
|
||
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
|
||
<i class="el-icon-zoom-in"></i>
|
||
</span>
|
||
<span v-if="!disabled" class="el-upload-list__item-delete"
|
||
@click="handleDownload(file)">
|
||
<i class="el-icon-download"></i>
|
||
</span>
|
||
<span v-if="!disabled" class="el-upload-list__item-delete"
|
||
@click="handleRemove1(file)">
|
||
<i class="el-icon-delete"></i>
|
||
</span>
|
||
</span>
|
||
</div>
|
||
</el-upload>
|
||
<el-dialog :visible.sync="dialogVisible">
|
||
<img width="100%" :src="dialogImageUrl" alt="">
|
||
</el-dialog>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="IDMidReco">
|
||
<div class="icon">
|
||
<div class="text">人脸信息</div>
|
||
<img src="../../assets/images/IDTextBackImg.png" alt="error" class="faceThree"
|
||
@click="handleImport">
|
||
</div>
|
||
<div class="content">
|
||
<img src="../../assets/images/borderIDCard.png" alt="error" class="backIDRecoMain">
|
||
<div class="tmp">
|
||
<ul class="tmpUl">
|
||
<li class="tmpLi">姓名: {{ this.name }}</li>
|
||
<li class="tmpLi">性别: {{ this.gender }}</li>
|
||
<li class="tmpLi">民族: {{ this.nation }}</li>
|
||
<li class="tmpLi">出生: {{ this.birth }}</li>
|
||
<li class="tmpLi">住址: {{ this.address }}</li>
|
||
<li class="tmpLi">身份号码: {{ this.id }}</li>
|
||
<li class="tmpLi">签发机关: {{ this.authority }}</li>
|
||
<li class="tmpLi">有效期: {{ this.date }}</li>
|
||
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="boxLevelOne sideBoxLevelOne">
|
||
<div class="boxLevelTwo boxLevelTwoFst">
|
||
<boxHeader :boxHeaderText="'识别结果统计'"></boxHeader>
|
||
<rectangleIDInvokeCount></rectangleIDInvokeCount>
|
||
|
||
</div>
|
||
|
||
<div class="boxLevelTwo boxLevelTwoSnd">
|
||
<boxHeader :boxHeaderText="'服务响应监控'"></boxHeader>
|
||
|
||
|
||
<div class="faceContentBox">
|
||
<img src="../../assets/images/resultHeader.png" alt="error" class="resultHeader">
|
||
<table class="faceContentTable">
|
||
<thead>
|
||
<tr class="faceContentRow">
|
||
<th class="faceContentColume faceContentColumeSort">序号</th>
|
||
<th class="faceContentColume faceContentColumeIPAddr">访问地址</th>
|
||
<th class="faceContentColume faceContentColumeDate">访问时间</th>
|
||
<th class="faceContentColume faceContentColumeTime">响应时长</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr v-for="(item, index) in ServerResult" :key="index"
|
||
:class="{ 'faceContentRowEven': index % 2 === 0, 'faceContentRowPrime': index % 2 !== 0 }">
|
||
<td class="faceContentColume faceContentColumeSort">{{ index + 1 }}</td>
|
||
<td class="faceContentColume faceContentColumeIPAddr">{{ item.ip }}</td>
|
||
<td class="faceContentColume faceContentColumeDate">{{ item.returnTime }}</td>
|
||
<td class="faceContentColume faceContentColumeTime">{{ item.responseTime }}</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<el-alert title="错误提示的文案" type="error" center show-icon>
|
||
</el-alert>
|
||
|
||
</div>
|
||
|
||
|
||
</template>
|
||
|
||
<script>
|
||
|
||
import axios from 'axios';
|
||
import { getToken } from "@/utils/auth";
|
||
import largeScreenHeader from '@/components/LargeScreen'
|
||
import boxHeader from '@/views/components/boxHeader.vue'
|
||
import pieIDResultCount from '@/views/updateIDCard/pieIDResultCount.vue'
|
||
import RectangleIDInvokeCount from '@/views/updateIDCard/rectangleIDInvokeCount.vue'
|
||
|
||
export default {
|
||
components: {
|
||
RectangleIDInvokeCount,
|
||
boxHeader,
|
||
largeScreenHeader,
|
||
pieIDResultCount,
|
||
},
|
||
props: {
|
||
value: [String, Object, Array],
|
||
// 图片数量限制
|
||
limit: {
|
||
type: Number,
|
||
default: 1,
|
||
},
|
||
// 大小限制(MB)
|
||
fileSize: {
|
||
type: Number,
|
||
default: 5,
|
||
},
|
||
// 文件类型, 例如['png', 'jpg', 'jpeg']
|
||
fileType: {
|
||
type: Array,
|
||
default: () => ["png", "jpg", "jpeg"],
|
||
},
|
||
// 是否显示提示
|
||
isShowTip: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
showSize: {
|
||
type: Boolean,
|
||
default: true,
|
||
},
|
||
},
|
||
methods: {
|
||
onMount() {
|
||
if (Object.keys(this.dataList).length === 0) {
|
||
this.$modal.msgWarning("请选择文件");
|
||
return;
|
||
}
|
||
if (Object.keys(this.dataList).length === 1) {
|
||
this.$modal.msgWarning("请上传身份证正反面两张图片");
|
||
return;
|
||
}
|
||
console.log(this.dataList);
|
||
let formData = new FormData(); // 用FormData存放上传文件
|
||
formData.append('type', 1)
|
||
Object.keys(this.dataList).forEach(item => {
|
||
formData.append('files', this.dataList[item].raw)
|
||
})
|
||
console.log(formData)
|
||
this.$modal.loading("数据上传中,请稍后。。。");
|
||
axios({
|
||
url: [process.env.VUE_APP_BASE_API]+'/ai/ocr/recognition',
|
||
data: formData,
|
||
method: 'post',
|
||
headers: {
|
||
'Content-Type': 'application/x-www-form-urlencoded',
|
||
Authorization: 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6ImQzNTQ2ZDI1LTJjY2ItNDQxMS1iOGMyLWEwODFiMmRiZjQyMCIsInVzZXJuYW1lIjoiYWRtaW4ifQ.YxtEeGyp09occmm2CUYSTTIJNrq81IWYTGZoXyHPo0sMK_akGt-29DObz8_3uLoZQGpwd7xGD6gzvjbrEG3rVg'
|
||
},
|
||
}).then(res => {
|
||
alert(JSON.stringify(res))
|
||
alert(res)
|
||
// console.log("111"+dataToJS.name);
|
||
// alert(res.data.result.data.name)
|
||
// if(res.code===200 && Object.keys(res.data[0]===601)){
|
||
// alert('调用大模型失败')
|
||
// }
|
||
this.name = res.data.result.data.name;
|
||
this.gender = res.data.result.data.gender;
|
||
this.nation = res.data.result.data.ethnicity;
|
||
this.birth = res.data.result.data.dateOfBirth;
|
||
this.address = res.data.result.data.address;
|
||
this.id = res.data.result.data.idNumber;
|
||
this.authority = res.data.result.data.issuingAuthority;
|
||
this.date = res.data.result.data.validTime;
|
||
this.$modal.closeLoading();
|
||
// this.$refs.IDnega.clearFiles();
|
||
// this.$refs.IDposi.clearFiles();
|
||
this.open = false;
|
||
this.dataList = [];
|
||
// this.baseUrl();
|
||
}).catch(error => {
|
||
|
||
alert('调用大模型失败')
|
||
|
||
})
|
||
},
|
||
|
||
goToInvoiceRecognition() {
|
||
this.$router.beforeEach((to, from, next) => {
|
||
if (from.path === '/Violation') {
|
||
// 清除缓存的操作
|
||
// 可以使用 localStorage.clear() 或其他方法清除缓存
|
||
localStorage.clear();
|
||
}
|
||
next();
|
||
});
|
||
this.$router.push('/Violation');
|
||
},
|
||
goToTextRecognition() {
|
||
this.$router.beforeEach((to, from, next) => {
|
||
if (from.path === '/Text') {
|
||
// 清除缓存的操作
|
||
// 可以使用 localStorage.clear() 或其他方法清除缓存
|
||
localStorage.clear();
|
||
}
|
||
next();
|
||
});
|
||
this.$router.push('/Text');
|
||
|
||
},
|
||
|
||
|
||
|
||
|
||
// addPic(file){
|
||
// this.dataList.push({ url: file.url });
|
||
// },
|
||
handleUploadSuccess(res, file) {
|
||
if (res.code === 200) {
|
||
this.uploadList.push({ name: res.fileName, url: res.url });
|
||
this.uploadedSuccessfully();
|
||
} else {
|
||
this.number--;
|
||
this.$modal.closeLoading();
|
||
this.$modal.msgError(res.msg);
|
||
this.$refs.imageUpload.handleRemove(file);
|
||
this.uploadedSuccessfully();
|
||
}
|
||
},
|
||
IDerror() {
|
||
|
||
},
|
||
uploadedSuccessfully() {
|
||
if (this.number > 0 && this.uploadList.length === this.number) {
|
||
this.dataList = this.dataList.concat(this.uploadList);
|
||
console.log('上传结束处理后', this.dataList);
|
||
this.uploadList = [];
|
||
this.number = 0;
|
||
// console.log('传给父组件的图片字符串',this.listToString(this.dataList));
|
||
// this.$emit("input", this.listToString(this.dataList));
|
||
this.$emit("input", this.dataList);
|
||
this.$modal.closeLoading();
|
||
}
|
||
},
|
||
handleBeforeUpload(file) {
|
||
|
||
let isImg = false;
|
||
if (this.fileType.length) {
|
||
let fileExtension = "";
|
||
if (file.name.lastIndexOf(".") > -1) {
|
||
fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
|
||
}
|
||
isImg = this.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) {
|
||
this.$modal.msgError(
|
||
`文件格式不正确, 请上传${this.fileType.join("/")}图片格式文件!`
|
||
);
|
||
return false;
|
||
}
|
||
if (this.fileSize) {
|
||
const isLt = file.size / 1024 / 1024 < this.fileSize;
|
||
if (!isLt) {
|
||
this.$modal.msgError(`上传头像图片大小不能超过 ${this.fileSize} MB!`);
|
||
return false;
|
||
}
|
||
}
|
||
this.$modal.loading("正在上传图片,请稍候...");
|
||
this.number++;
|
||
},
|
||
handleUploading(file, dataList) {
|
||
this.dataList.push(file);
|
||
|
||
console.log(file);
|
||
console.log(dataList);
|
||
},
|
||
handleUploadError(error, file, dataList) {
|
||
console.log(error);
|
||
console.log(file);
|
||
console.log(dataList);
|
||
this.dataList.push({
|
||
url: file.url,
|
||
uid: file.uid,
|
||
file: file.file
|
||
});
|
||
|
||
},
|
||
submitFileForm() {
|
||
|
||
},
|
||
handleRemove(file, dataList) {
|
||
const index = this.dataList.indexOf(file);
|
||
// 如果找到了文件,则从 dataList 中删除
|
||
if (index !== -1) {
|
||
this.dataList.splice(index, 1);
|
||
}
|
||
this.$refs.IDposi.clearFiles();
|
||
console.log(this.dataList.length)
|
||
},
|
||
handleRemove1(file, dataList) {
|
||
const index = this.dataList.indexOf(file);
|
||
// 如果找到了文件,则从 dataList 中删除
|
||
if (index !== -1) {
|
||
this.dataList.splice(index, 1);
|
||
}
|
||
this.$refs.IDnega.clearFiles();
|
||
console.log(this.dataList.length)
|
||
},
|
||
|
||
handleUploadError() {
|
||
this.$modal.msgError("上传图片失败,请重试");
|
||
this.$modal.closeLoading();
|
||
},
|
||
beforeRemove(file, dataList) {
|
||
return this.$confirm(`确定移除 ${file.name}?`);
|
||
},
|
||
handleImport() {
|
||
this.open = true;
|
||
},
|
||
handlePictureCardPreview(file) {
|
||
this.dialogImageUrl = file.url;
|
||
this.dialogVisible = true;
|
||
},
|
||
handleDownload(file) {
|
||
const fileUrl = file.url;
|
||
const fileName = 'example.png';
|
||
// 创建一个隐藏的 <a> 标签
|
||
const link = document.createElement('a');
|
||
link.href = fileUrl;
|
||
link.download = fileName;
|
||
// 将 <a> 标签添加到页面中
|
||
document.body.appendChild(link);
|
||
// 触发点击事件,开始下载
|
||
link.click();
|
||
// 下载完成后移除 <a> 标签
|
||
document.body.removeChild(link);
|
||
}
|
||
|
||
|
||
},
|
||
computed: {
|
||
// 是否显示提示
|
||
showTip() {
|
||
return this.isShowTip && (this.fileType || this.fileSize);
|
||
},
|
||
},
|
||
|
||
data() {
|
||
return {
|
||
uploadList: [],
|
||
headers: {
|
||
Authorization: "Bearer " + getToken(),
|
||
},
|
||
dialogImageUrl: '',
|
||
dialogVisible: false,
|
||
disabled: false,
|
||
urlposi: '/ocr/recognition',
|
||
dataList: [],
|
||
open: false,
|
||
currentDate: '',
|
||
currentTime: '',
|
||
dayOfWeek: '',//如果要星期的话可以直接用,此处为中文的星期
|
||
imageUrl: '',
|
||
IDCardPositiveUrl: '',
|
||
IDCardNegativeUrl: '',
|
||
name: '',
|
||
gender: '',
|
||
nation: '',
|
||
birth: '',
|
||
id: '',
|
||
authority: '',
|
||
address: '',
|
||
date: '',
|
||
recognition: [
|
||
{ ip: '192.168.1.1', returnTime: '10:00', responseTime: '100ms' },
|
||
{ ip: '192.168.1.2', returnTime: '13:00', responseTime: '130ms' },
|
||
{ ip: '192.168.1.3', returnTime: '11:00', responseTime: '120ms' },
|
||
{ ip: '192.168.1.4', returnTime: '9:00', responseTime: '20ms' }
|
||
],
|
||
ServerResult: [
|
||
{ ip: '192.168.1.5', returnTime: '22:00', responseTime: '1020ms' },
|
||
{ ip: '192.168.1.6', returnTime: '22:30', responseTime: '1230ms' },
|
||
{ ip: '192.168.1.7', returnTime: '21:00', responseTime: '1120ms' },
|
||
{ ip: '192.168.1.8', returnTime: '2:00', responseTime: '220ms' },
|
||
{ ip: '192.168.1.9', returnTime: '23:59', responseTime: '240ms' },
|
||
{ ip: '192.168.1.10', returnTime: '1:30', responseTime: '980ms' },
|
||
{ ip: '192.168.1.11', returnTime: '3:45', responseTime: '1350ms' },
|
||
{ ip: '192.168.1.12', returnTime: '4:15', responseTime: '780ms' },
|
||
{ ip: '192.168.1.13', returnTime: '5:20', responseTime: '1500ms' },
|
||
{ ip: '192.168.1.14', returnTime: '6:10', responseTime: '890ms' },
|
||
{ ip: '192.168.1.15', returnTime: '6:10', responseTime: '890ms' },
|
||
{ ip: '192.168.1.16', returnTime: '6:10', responseTime: '890ms' }
|
||
],
|
||
pieThree: {
|
||
China: '34', USA: '55', Japan: '36'
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
},
|
||
|
||
watch: {
|
||
value: {
|
||
handler(val) {
|
||
console.log('侦听', val);
|
||
if (val) {
|
||
// 首先将值转为数组
|
||
const list = Array.isArray(val) ? val : this.value.split(",");
|
||
// 然后将数组转为对象数组
|
||
this.dataList = list.map((item) => {
|
||
if (typeof item === "string") {
|
||
if (item.indexOf(this.baseUrl) === -1) {
|
||
item = { name: this.baseUrl + item, url: item };
|
||
} else {
|
||
item = { name: item, url: item };
|
||
}
|
||
}
|
||
return item;
|
||
});
|
||
console.log('侦听处理后', this.dataList);
|
||
} else {
|
||
this.dataList = [];
|
||
return [];
|
||
}
|
||
},
|
||
deep: true,
|
||
immediate: true,
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style scoped>
|
||
@import url('./../../assets/styles/updateIDCard.css');
|
||
</style> |