人脸登录实现
- 进入人脸识别登录界面
- 调用权限(打开摄像头功能)
- 点击人脸登录,通过
javascript编写的setImage()绘制图片
- 拍照图转换
file格式上传base64ToFile() base64转为 file
- 调用后台接口
faceLogin.faceLogin(formData)比对图片,识别度通过就允许登录
- 离开当前页面,关闭摄像头
destroyed销毁
登录界面的前端代码
<template>
<div class="container">
<div class="face-login">
<div class="top">
<div class="left-lable">IP地址:</div>
<div class="right-lable">
<select v-model="myIp" placeholder="请选择">
<option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
></option>
</select>
</div>
</div>
<div class="body">
<div class="img">
<img src="@/assets/images/login/face_kuang.png" alt="" />
<div class="mask">
<video
id="videoCamera"
:width="videoWidth"
:height="videoHeight"
:x5-video-player-fullscreen="true"
autoplay
></video>
<canvas
style="display: none"
id="canvasCamera"
:width="videoWidth"
:height="videoHeight"
></canvas>
</div>
</div>
</div>
<div class="footer" @click="setImage()">刷脸识别登录进入平台</div>
<div class="login" @click="loginHandle">账号登录</div>
</div>
</div>
</template>
<script>
import faceLogin from "@/https/login/login";
export default {
name: "",
data() {
return {
videoWidth: 300,
videoHeight: 300,
imgSrc: "",
thisCancas: null,
thisContext: null,
thisVideo: null,
openVideo: false,
postVideoImg: "",
options: [
{
value: "152.220.22.0",
label: "152.220.22.0",
},
{
value: "152.220.22.1",
label: "152.220.22.1",
},
],
myIp: "",
};
},
created() {},
computed: {},
mounted() {
this.getCompetence();
},
methods: {
setImage() {
let that = this;
that.thisContext.drawImage(that.thisVideo, 0, 0);
let image = this.thisCancas.toDataURL("image/png");
that.imgSrc = image;
this.postImg();
},
async postImg() {
let that = this;
let formData = new FormData();
formData.append("pic", this.base64ToFile(this.imgSrc, "png"));
formData.append("ip", this.myIp);
let res = await faceLogin.faceLogin(formData);
if (res.data.code == 200) {
this.$message({
message: "人脸识别成功",
type: "success",
center: true,
showClose: true,
});
that.$router.push({ path: "/index" });
} else {
this.$message({
message: "登录失败,图像不合格",
center: true,
type: "error",
showClose: true,
});
}
return false;
},
getCompetence() {
let that = this;
that.thisCancas = document.getElementById("canvasCamera");
that.thisContext = this.thisCancas.getContext("2d");
that.thisVideo = document.getElementById("videoCamera");
that.thisVideo.style.display = "block";
if (navigator.mediaDevices === undefined) {
navigator.mediaDevices = {};
}
if (navigator.mediaDevices.getUserMedia === undefined) {
navigator.mediaDevices.getUserMedia = function (constraints) {
var getUserMedia =
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia ||
navigator.getUserMedia;
if (!getUserMedia) {
return Promise.reject(
new Error("getUserMedia is not implemented in this browser")
);
}
return new Promise(function (resolve, reject) {
getUserMedia.call(navigator, constraints, resolve, reject);
});
};
}
var constraints = {
audio: false,
video: {
width: this.videoWidth,
height: this.videoHeight,
transform: "scaleX(-1)",
},
};
navigator.mediaDevices
.getUserMedia(constraints)
.then(function (stream) {
if ("srcObject" in that.thisVideo) {
that.thisVideo.srcObject = stream;
} else {
that.thisVideo.src = window.URL.createObjectURL(stream);
}
that.thisVideo.onloadedmetadata = function (e) {
console.log(e);
that.thisVideo.play();
};
})
.catch((err) => {
console.log(err);
});
},
stopNavigator() {
this.thisVideo.srcObject.getTracks()[0].stop();
},
base64ToFile(urlData, fileName) {
let arr = urlData.split(",");
let mime = arr[0].match(/:(.*?);/)[1];
let bytes = atob(arr[1]);
let n = bytes.length;
let ia = new Uint8Array(n);
while (n--) {
ia[n] = bytes.charCodeAt(n);
}
return new File([ia], fileName, { type: mime });
},
loginHandle() {
let that = this;
that.$router.push({ path: "/login1" });
},
},
destroyed: function () {
this.stopNavigator();
},
};
</script>
<style lang='scss' scoped>
@import "@/scss/login/face.scss";
</style>