2025/07/24 APP端人脸
							parent
							
								
									246f61f975
								
							
						
					
					
						commit
						9dc6aad85e
					
				| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
import {post, upload, uploads,videoApiGet} from "@/utils/request";
 | 
			
		||||
import {post, upload, uploads,videoApiGet,loginRequest} from "@/utils/request";
 | 
			
		||||
 | 
			
		||||
export const submitLogin = (params) => post("/sys/login", params) // 登录
 | 
			
		||||
export const getUserInfo = (params) => post("/sys/user/info/app", params); // 获取用户信息
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -821,6 +821,12 @@
 | 
			
		|||
        "navigationBarTitleText" : "股份公司车辆管理"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "path": "pages/mine/face/face_authentication",
 | 
			
		||||
      "style": {
 | 
			
		||||
        "navigationBarTitleText": "人脸认证"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    {
 | 
			
		||||
      "path" : "pages/door_access_control/share_office_vehicle_info/add",
 | 
			
		||||
      "style" : {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,138 @@
 | 
			
		|||
<template>
 | 
			
		||||
	<view class="container">
 | 
			
		||||
		<view class="fat">
 | 
			
		||||
			<text class="fatt">请将人脸置于圆圈内</text>
 | 
			
		||||
		</view>
 | 
			
		||||
		<view class="livefater">
 | 
			
		||||
			<view style="width: 700upx; height: 700upx; border-radius: 700upx; overflow: hidden">
 | 
			
		||||
				<live-pusher id="livePusher" ref="livePusher" class="livePusher" url="" mode="SD" :muted="true"
 | 
			
		||||
					:enable-camera="true" :auto-focus="true" :beauty="1" whiteness="2" aspect="1:1" />
 | 
			
		||||
			</view>
 | 
			
		||||
			<cover-image src="/static/images/gaiz.png" class="gaiimg"></cover-image>
 | 
			
		||||
		</view>
 | 
			
		||||
 | 
			
		||||
		<view style="margin: 0 100upx">
 | 
			
		||||
			<u-button :text="btnTextStr" type="primary" @click="snapshot" />
 | 
			
		||||
		</view>
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
	import {
 | 
			
		||||
		submitEditUserFace,
 | 
			
		||||
		compareUserFaceCertify,
 | 
			
		||||
		compareUserExamFaceCertify
 | 
			
		||||
	} from '@/api';
 | 
			
		||||
	
 | 
			
		||||
	export default {
 | 
			
		||||
		data() {
 | 
			
		||||
			return {
 | 
			
		||||
				startPreviewTimer: null, // 开始预览计时器实例
 | 
			
		||||
				btnTextStr: '拍照'
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		onReady() {
 | 
			
		||||
			this.context = uni.createLivePusherContext('livePusher', this)
 | 
			
		||||
			this.startPreviewTimer = setInterval(() => {
 | 
			
		||||
				this.startPreview()
 | 
			
		||||
			}, 1000)
 | 
			
		||||
		},
 | 
			
		||||
		onUnload() {
 | 
			
		||||
			this.startPreviewTimer && clearInterval(this.startPreviewTimer)
 | 
			
		||||
		},
 | 
			
		||||
		methods: {
 | 
			
		||||
			snapshot() {
 | 
			
		||||
				uni.showLoading({
 | 
			
		||||
					title: '加载中'
 | 
			
		||||
				})
 | 
			
		||||
				this.context.snapshot({
 | 
			
		||||
					success: (e) => {
 | 
			
		||||
						this.getMinImage(e.message.tempImagePath)
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
			},
 | 
			
		||||
			startPreview() {
 | 
			
		||||
				this.context.stopPreview()
 | 
			
		||||
				this.context.startPreview({
 | 
			
		||||
					success: () => {
 | 
			
		||||
						this.startPreviewTimer && clearInterval(this.startPreviewTimer)
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
			},
 | 
			
		||||
			getMinImage(imgPath) {
 | 
			
		||||
				plus.zip.compressImage({
 | 
			
		||||
						src: imgPath,
 | 
			
		||||
						dst: imgPath,
 | 
			
		||||
						overwrite: true,
 | 
			
		||||
						quality: 40
 | 
			
		||||
					},
 | 
			
		||||
					(zipRes) => {
 | 
			
		||||
						setTimeout(() => {
 | 
			
		||||
							const reader = new plus.io.FileReader()
 | 
			
		||||
							reader.onloadend = async (res) => {
 | 
			
		||||
								const speech = res.target.result
 | 
			
		||||
								// 获取 base 64 图片编码的前缀
 | 
			
		||||
								const USERAVATARPREFIX = speech.substring(0, speech.indexOf(
 | 
			
		||||
									'base64,') + 7)
 | 
			
		||||
								// 获取 base 64 图片的二进制到文本
 | 
			
		||||
								const USERAVATARURL = speech.substring(speech.indexOf('base64,') + 7)
 | 
			
		||||
								try {
 | 
			
		||||
									// 	TODO  USERAVATARPREFIX   USERAVATARURL
 | 
			
		||||
									// 调用 API 提交人脸图片
 | 
			
		||||
									const fullBase64 = USERAVATARPREFIX + USERAVATARURL;
 | 
			
		||||
									console.log(fullBase64)
 | 
			
		||||
									console.log(this.$store.getters.getUserInfo.USER_ID)
 | 
			
		||||
								    const res = await submitEditUserFace({ faceData: fullBase64, userId: this.$store.getters.getUserInfo.USER_ID });
 | 
			
		||||
								    uni.hideLoading();
 | 
			
		||||
								    uni.$u.toast('上传成功');
 | 
			
		||||
									uni.navigateBack({ delta: 1 });
 | 
			
		||||
								} catch (e) {
 | 
			
		||||
									if (e && e.msg) {
 | 
			
		||||
										uni.$u.toast(e.msg)
 | 
			
		||||
									}
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
							reader.readAsDataURL(plus.io.convertLocalFileSystemURL(zipRes.target))
 | 
			
		||||
						}, 4000)
 | 
			
		||||
					}
 | 
			
		||||
				)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped>
 | 
			
		||||
	.container {
 | 
			
		||||
		background-color: #fff;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.livePusher {
 | 
			
		||||
		width: 700upx;
 | 
			
		||||
		height: 700upx;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.livefater {
 | 
			
		||||
		display: flex;
 | 
			
		||||
		justify-content: center;
 | 
			
		||||
		flex-direction: column;
 | 
			
		||||
		align-items: center;
 | 
			
		||||
		margin-bottom: 100upx;
 | 
			
		||||
		height: 700upx;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.fat {
 | 
			
		||||
		margin: 100upx;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.fatt {
 | 
			
		||||
		text-align: center;
 | 
			
		||||
		font-size: 36upx;
 | 
			
		||||
		font-weight: 800;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.gaiimg {
 | 
			
		||||
		width: 700upx;
 | 
			
		||||
		height: 700upx;
 | 
			
		||||
		margin-top: -700upx;
 | 
			
		||||
	}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			@ -61,6 +61,10 @@ export default {
 | 
			
		|||
          img: require('../../../static/images/my_ico1.png'),
 | 
			
		||||
          name:'个人信息',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          img: require('../../../static/images/my_ico2.png'),
 | 
			
		||||
          name: '人脸认证',
 | 
			
		||||
        },
 | 
			
		||||
        {
 | 
			
		||||
          img: require('../../../static/images/my_ico3.png'),
 | 
			
		||||
          name:'问题反馈',
 | 
			
		||||
| 
						 | 
				
			
			@ -137,11 +141,17 @@ export default {
 | 
			
		|||
        url: '/pages/mine/promise/promise'
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    faceAuthentication() {
 | 
			
		||||
      uni.navigateTo({
 | 
			
		||||
        url: '/pages/mine/face/face_authentication'
 | 
			
		||||
      })
 | 
			
		||||
    },
 | 
			
		||||
    clickItem(name){
 | 
			
		||||
      if(name === '个人信息') this.goabout()
 | 
			
		||||
      if(name === '问题反馈') this.feedbackclick()
 | 
			
		||||
      if(name === '安全承诺') this.promiseclick()
 | 
			
		||||
      if(name === '修改密码') this.pwdclick()
 | 
			
		||||
      if(name === '人脸认证') this.faceAuthentication()
 | 
			
		||||
	  // #ifdef APP-PLUS
 | 
			
		||||
      if(name === '版本更新') this.fnUpdateVersion()
 | 
			
		||||
	  // #endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -226,6 +226,51 @@ function videoApiGet(url, data) {
 | 
			
		|||
    })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function loginRequest(url, data = {}) {
 | 
			
		||||
    return new Promise((resolve, reject) => {
 | 
			
		||||
        if (data && data.loading !== false) {
 | 
			
		||||
            uni.showLoading({
 | 
			
		||||
                title: "加载中",
 | 
			
		||||
                mask: true,
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        uni.request({
 | 
			
		||||
            url: requestPath + url,
 | 
			
		||||
            data: {
 | 
			
		||||
                ...data,
 | 
			
		||||
            },
 | 
			
		||||
            header: {
 | 
			
		||||
                "Content-type": data?.postMethod || "application/json",
 | 
			
		||||
            },
 | 
			
		||||
            method: "POST",
 | 
			
		||||
            success: (res) => {
 | 
			
		||||
                if (data && data.loading !== false) {
 | 
			
		||||
                    uni.hideLoading();
 | 
			
		||||
                }
 | 
			
		||||
                if (res.data.result === "success") {
 | 
			
		||||
                    resolve(res.data);
 | 
			
		||||
                } else {
 | 
			
		||||
                    uni.showToast({
 | 
			
		||||
                        title: res.data || "系统开小差了",
 | 
			
		||||
                        icon: "none",
 | 
			
		||||
                    });
 | 
			
		||||
                    reject(res.data);
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            fail: (err) => {
 | 
			
		||||
                if (data && data.loading !== false) {
 | 
			
		||||
                    uni.hideLoading();
 | 
			
		||||
                }
 | 
			
		||||
                uni.showToast({
 | 
			
		||||
                    title: "网络错误请重试",
 | 
			
		||||
                    icon: "none",
 | 
			
		||||
                });
 | 
			
		||||
                reject(err);
 | 
			
		||||
            },
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setInterval(async () => {
 | 
			
		||||
    if (uni.getStorageSync('tokenTime') == null) return;
 | 
			
		||||
    if (dayjs().diff(dayjs(uni.getStorageSync('tokenTime')), "minute") >= 5) {
 | 
			
		||||
| 
						 | 
				
			
			@ -234,4 +279,4 @@ setInterval(async () => {
 | 
			
		|||
    }
 | 
			
		||||
}, 1000 * 60);
 | 
			
		||||
 | 
			
		||||
export {post, upload, uploads,setBasePath,videoApiGet}
 | 
			
		||||
export {post, upload, uploads,setBasePath,videoApiGet,loginRequest}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue