chenyc
2025-08-06 aec98248047327dd29d9ac6f5f307d5a86b939a1
src/samples/faceApi.ts
@@ -1,5 +1,6 @@
// This file is auto-generated, don't edit it
import facebody20191230, * as $facebody20191230 from '@alicloud/facebody20191230';
import {checkUploadFile} from '@/api/user'
// 依赖的模块可通过下载工程中的模块依赖文件或右上角的获取 SDK 依赖信息查看
import * as $OpenApi from '@alicloud/openapi-client';
import Util, * as $Util from '@alicloud/tea-util';
@@ -8,6 +9,19 @@
import { confingInfoStore } from '@/stores/StoresConfing'
import {sendPationCodeApi} from './httpApi'
import { sockteStore } from '@/stores/sockteInfo';
var AipFaceClient = require("baidu-aip-sdk").face;
// 设置APPID/AK/SK  百度人脸识别
var APP_ID = "119524671";
var API_KEY = "53x6fo60pAGACz078FyT2QpY";
var SECRET_KEY = "r06aXtscuAk2SXHk1FsGM66aUCoGzncU";
// 新建一个对象,建议只保存一个对象调用服务接口
var clientBaidu = new AipFaceClient(APP_ID, API_KEY, SECRET_KEY);
// 要识别的人脸库
const faceDatabase= confingInfoStore().confingInfo.face_database
@@ -28,7 +42,6 @@
  });
  // 访问的域名
  config.endpoint = `facebody.cn-shanghai.aliyuncs.com`;
  console.log('人脸识别客户端已启动')
  return new facebody20191230(config);
}
// 将文件上传到oss
@@ -38,31 +51,32 @@
  return ossUrl
}
/**
 *
 * 阿里云人脸识别
 * @param path 图片路径
 */
const  faceShibie= async(path:any)=>{
  console.log('文件路径',path)
  const fileStream = fs.createReadStream(path);
  let client=createClient()
  // 通过本地文件
  const facedata= confingInfoStore().confingInfo.face_database
  const faceScore=confingInfoStore().confingInfo.face_score
  console.log(facedata,'人脸数据库')
  let searchFaceAdvanceRequest = new $facebody20191230.SearchFaceAdvanceRequest();
  searchFaceAdvanceRequest.imageUrlObject = fileStream;
  searchFaceAdvanceRequest.dbName = facedata
  searchFaceAdvanceRequest.limit = 2;
  let runtime = new $Util.RuntimeOptions({ });
  console.log('-----监测图片--')
  client.searchFaceAdvance(searchFaceAdvanceRequest, runtime).then(re=>{
    console.log('返回结果')
    console.log(re.statusCode)
    if(re.statusCode===200){
      const matchList=re.body.data?.matchList
      console.log('得到的人脸库')
      // console.log('得到的人脸库')
      console.log(matchList)
      if(matchList?.length>0){
        const faceItems =matchList[0].faceItems
        if(faceItems?.length===0){
          console.log('没有找到患者对应的人脸')
          return false
        }
        if(faceItems[0].score>=faceScore){
          const entityId=faceItems[0].entityId
          console.log(entityId,'得到了人脸识别id,存患者code到vuex')
@@ -73,18 +87,157 @@
            resultTime: ''
          })
        }else{
          console.log('那些人脸都不是')
          console.log('没有找到患者对应的人脸')
        }
      }
    }
  }).finally(()=>{
    console.log('---------------都要执行的')
    // console.log('---------------都要执行的')
     // 删除图片
    delImg(path)
  })
}
// base64z转文件后验证
/**
 * 百度人脸识别
 * @param path base64
 */
const faceSearchBaidu=async(path:any)=>{
  const faceScore=confingInfoStore().confingInfo.face_score
  console.log('文件路径百度识别')
  try {
    var image = path; // 图片的 base64 数据,图片大小不超过 10M,支持 JPG、PNG、BMP、JPEG 格式
    var imageType = "BASE64";
    var groupIdList = confingInfoStore().confingInfo.clientCode; // 人脸库ID列表,多个用逗号分隔,最多支持20个
    // 调用人脸搜索
    clientBaidu.search(image, imageType, groupIdList).then(function(result: any) {
        console.log(result.error_msg==='SUCCESS','百度人脸识别成功');
        console.log(result.result.user_list);
        if(result.error_msg==='SUCCESS'){
          if(result.result.user_list.length>0){
            const userList=result.result.user_list
            const user=userList[0]
            const entityId=user.user_id
            const score=user.score
            console.log(`entityId=`+entityId+','+'score='+score)
            //设置识别的的两 要大于多少
            if(entityId!=='unknown'&&score>=faceScore){
              console.log(entityId,'得到了人脸识别id,存患者code到vuex')
              sockteStore().setfaceSockte({
                deviceType: "人脸识别",
                deviceName: "百度人脸识别",
                result: entityId,
                resultTime: new Date().toLocaleString(),
              })
            }
          }
        }
    }).catch(function(err: any) {
        // 如果发生网络错误
        console.log(err);
    });
  } catch (err:any) {
    console.error('发生错误:', err.message);
  }
}
// 验证---逻辑
const yanzhengimg=async(path:any)=>{
  console.log('文件路径--逻辑',path)
  const fileStream = fs.createReadStream(path);
  let client=createClient()
  // 通过本地文件
  const facedata= confingInfoStore().confingInfo.face_database
  const faceScore=confingInfoStore().confingInfo.face_score
  let searchFaceAdvanceRequest = new $facebody20191230.SearchFaceAdvanceRequest();
  searchFaceAdvanceRequest.imageUrlObject = fileStream;
  searchFaceAdvanceRequest.dbName = facedata
  searchFaceAdvanceRequest.limit = 2;
  let runtime = new $Util.RuntimeOptions({ });
  client.searchFaceAdvance(searchFaceAdvanceRequest, runtime).then(re=>{
    if(re.statusCode===200){
      const matchList=re.body.data?.matchList
      // console.log('得到的人脸库')
      console.log(matchList)
      if(matchList?.length>0){
        const faceItems =matchList[0].faceItems
        if(faceItems?.length===0){
          console.log('没有找到患者对应的人脸')
          return false
        }
        if(faceItems[0].score>=faceScore){
          const entityId=faceItems[0].entityId
          console.log(entityId,'得到了人脸识别id,存患者code到vuex')
          sockteStore().setfaceSockte({
            deviceType: "人脸识别",
            deviceName: "人脸识别",
            result: entityId,
            resultTime: ''
          })
        }else{
          console.log('没有找到患者对应的人脸')
        }
      }
    }
  }).finally(()=>{
    // console.log('---------------都要执行的')
     // 删除图片
    delImg(path)
  })
}
/**
 * 本地人脸识别
 * @param path
 */
const faceApiCheck=async(path:any)=>{
  const faceScore=confingInfoStore().confingInfo.face_score
  fs.readFile(path, (err, data) => {
    if (err) throw err;
      let blobFile = new File([data], 'name.png', {type:"image/png"})
      console.log(blobFile)
      const formData = new FormData() // 下面有备注
      formData.append('image', blobFile)
      checkUploadFile(formData).then(re=>{
          console.log('-----',re)
          if(re.code===200&&re?.data?.data.result.length>0&&re?.data?.data.result[0]){
            const result=re?.data?.data.result[0]
            const entityId=result.user_id
            const distance=result.score
            console.log(`entityId=`+entityId+','+'distance='+distance)
            //设置识别的的两 要大于多少
            if(entityId!=='unknown'&&distance>=faceScore){
              console.log(entityId,'得到了人脸识别id,存患者code到vuex')
              console.log(entityId,'得到了人脸识别id,存患者code到vuex')
              sockteStore().setfaceSockte({
                type: "人脸识别",
                deviceName: "人脸识别",
                result: entityId,
                resultTime: '',
                state:2,
              })
            }
          //
          }else{
            console.log('本地没识别')
          }
      }).finally(()=>{
          // 删除图片
          delImg(path)
      })
  })
  }
  // base64z转文件后验证
const base64toFile = (dataurl:any,filename='file') =>  {
  if (!fs.existsSync('./imgs')) {
    fs.mkdir('./imgs', (err) => {
@@ -97,16 +250,34 @@
  // new Buffer 操作权限太大,v6.0后使用Buffer.from()创建构造函数
  const dataBuffer = new Buffer(base64, 'base64'); //把base64码转成buffer对象,
  // return dataBuffer
  fs.writeFile(path, dataBuffer, function(err){//用fs写入文件
  if(err){
    console.log(err);
  }else{
    console.log('写入成功!',path);
    // getOssUrl(path)
    // 验证图片
    faceShibie(path)
  }
  })
   fs.writeFile(path, dataBuffer, function (err) {
     if (err) {
       console.log(err);
     } else {
       // 是否本地识别
       const isLanFace= confingInfoStore().confingInfo.isLanFace
       // 人脸识别类型
       const faceType= confingInfoStore().confingInfo.faceType
       if(isLanFace===true){
        console.log('本地识别')
        //本地识别
        faceApiCheck(path)
       }else{
        //阿里验证外网
        if(faceType==='阿里云'){
          console.log('阿里识别')
          faceShibie(path)
        }else if(faceType==='百度'){
          console.log('百度识别')
          faceSearchBaidu(base64)
          //直接删除
          delImg(path)
       }else{
          console.log('阿里识别')
          faceShibie(path)
       }
     }
   } });
}
//验证后删除文件图片
const delImg=(path:string)=>{
@@ -118,7 +289,9 @@
    }
  })
}
export {
  yanzhengimg,
  createClient,
  faceShibie,
  base64toFile