结合华为云实现人证核验

华为云发布《基于MetaTown构建数字资产平台》 数字资产链(Digital Asset Chain,简称DAC)采用NFT技术,是华为云自研的数字资产链平台,基于华为云区块链引擎,通过时间戳、智能合约等技术创新,可实现数字资产的确权、可信保存、安全交易。华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案,由华为云数字资产链支撑底层区块链技术,实现数字资产的铸造、发行、流转、确权等全生命周期管理。将游戏道具、资产或IP周边数字资产化,数字资产可流通、变现,从而扩大用户量、增加用户粘性。(2)支持一键部署。 阅读详情
结合华为云实现人核核验
<template>
  <view class="content">
	<!-- 身份证正面 -->
	<view class="photo-container" v-if="photo1" style="margin-bottom: 30px;">
	  <image :src="photo1" mode="aspectFit" class="photo"></image>
	  <view class="close-button" @click="clearPhoto(1)">×</view>
	</view>
	<view v-else>
	  <navigator class="buttons" url="../camera/idcard/idcard?dotype=idcardface">
		<button type="primary">身份证正面</button>
	  </navigator>
	</view>
	
	
	<!-- 人脸拍照 -->
	<view class="photo-container" v-if="photo2">
	  <image :src="photo2" mode="aspectFit" class="photo"></image>
	  <view class="close-button" @click="clearPhoto(2)">×</view>
	</view>
	<view v-else>
	  <navigator class="buttons" url="../camera/idphoto/idphoto">
		<button type="primary">人脸拍照</button>
	  </navigator>
	</view>
    <button @click="submitPhotos()" type="primary">人证核验</button>
	<canvas id="canvas-clipper" canvas-id="canvas-clipper" type="2d" :style="{ width: state.canvasSiz.width + 'px', height: state.canvasSiz.height + 'px', position: 'absolute', left: '-500000px', top: '-500000px' }" />
	
  </view> 
</template>
<script setup>
import { ref, onMounted, reactive } from 'vue';
import { pathToBase64, base64ToPath } from 'image-tools';
import { ivs } from '../../api/ivsStandard';
import { onLoad } from '@dcloudio/uni-app';
const photo1 = ref('');
const photo2 = ref('');
const takePhoto = async (index) => {
  try {
    const res = await new Promise((resolve, reject) => {
      uni.chooseImage({
        count: 1,
        sizeType: ['original', 'compressed'],
        sourceType: ['camera','album'],
        success: resolve,
        fail: reject
      });
    });

    if (res.tempFilePaths.length > 0) {
      const tempFilePath = res.tempFilePaths[0];
      const base64String = await convertToBase64(tempFilePath);
      if (index === 1) {
        photo1.value = base64String;
      } else if (index === 2) {
        photo2.value = base64String;
      }
    }
  } catch (error) {
  }
};


const convertToBase64 = (filePath) => {
  return pathToBase64(filePath)
    .then(base64 => {
      return base64;
    })
    .catch(error => {
      console.error('转换失败:', error);
      throw error; // 重新抛出错误以便在调用者中捕获
    });
};

// 人证核身标准版(三要素)
const submitPhotos = () => {
		if (!photo1.value || !photo2.value) {
			uni.showToast({ title: '请拍摄两张照片' });
			return;
		}
		const prefix = "data:image/jpeg;base64,";
		ivs(photo1.value.substring(prefix.length),photo2.value.substring(prefix.length));
};


const clearPhoto = (index) => {
  if (index === 1) {
    photo1.value = '';
  } else if (index === 2) {
    photo2.value = '';
  }
};


const state = reactive({
  windowWidth: '',
  windowHeight: '',
  canvasSiz: {
    width: 188,
    height: 273
  }
});

const init = () => {
  uni.getSystemInfo({
    success: (res) => {
      state.windowWidth = res.windowWidth;
      state.windowHeight = res.windowHeight;
    }
  });
};

const setImage = (e) => {
  if (e.dotype === 'idphoto') {
    zjzClipper(e.path,e.index);
  } else if (e.dotype === 'watermark') {
    watermark(e.path);
  } else {
    savePhoto(e.path,e.index);
  }
};

const zjzClipper = (path,index) => {
  uni.getImageInfo({
    src: path,
    success: (image) => {
      state.canvasSiz.width = 188;
      state.canvasSiz.height = 273;

      let ctx = uni.createCanvasContext('canvas-clipper');

      ctx.drawImage(
        path,
        parseInt(0.15 * image.width),
        parseInt(0.17 * image.height),
        parseInt(0.69 * image.width),
        parseInt(0.65 * image.height),
        0,
        0,
        188,
        273
      );

      ctx.draw(false, () => {
        uni.canvasToTempFilePath(
          {
            destWidth: 188,
            destHeight: 273,
            canvasId: 'canvas-clipper',
            fileType: 'jpg',
            success: (res) => {
              savePhoto(res.tempFilePath,index);
            }
          },
          this
        );
      });
    }
  });
};

const watermark = (path) => {
  uni.getImageInfo({
    src: path,
    success: (image) => {
      state.canvasSiz.width = image.width;
      state.canvasSiz.height = image.height;

      setTimeout(() => {
        let ctx = uni.createCanvasContext('canvas-clipper');

        ctx.drawImage(
          path,
          0,
          0,
          image.width,
          image.height
        );

        ctx.setFillStyle('white');
        ctx.setFontSize(40);
        ctx.fillText('live-camera', 20, 100);

        const now = new Date();
        const time = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()} ${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}`;
        ctx.setFontSize(30);
        ctx.fillText(time, 20, 140);

        ctx.draw(false, () => {
          uni.canvasToTempFilePath(
            {
              destWidth: image.width,
              destHeight: image.height,
              canvasId: 'canvas-clipper',
              fileType: 'jpg',
              success: (res) => {
                savePhoto(res.tempFilePath);
              }
            },
            this
          );
        });
      }, 500);
    }
  });
};

const savePhoto = async(path,index) => {
  if (path) {
    const base64String = await convertToBase64(path);
    if (index === 1) {
      photo1.value = base64String;
    } else if (index === 2) {
      photo2.value = base64String;
    }
  }
  
};

onLoad(() => {
  init();
});







defineExpose({setImage});
</script>
<style scoped>
.content {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

.photo-container {
  position: relative;
  width: 200px;
  height: 200px;
}

.photo {
  width: 100%;
  height: 100%;
}

.close-button {
  position: absolute;
  top: 0;
  right: 0;
  background-color: rgba(255, 0, 0, 0.7);
  color: white;
  font-size: 10px;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  cursor: pointer;
}

button {
  margin: 10px;
}
</style>
学习stm32H7之路开始(STM32H7系列1) 前期准备,HAL库框架 2020.01.07 几个重要的参考网址 1.电子工程世界网 http://tags.eeworld.com.cn/tags/STM32H7 链接: link. 2.转:https://blog.youkuaiyun.com/simon223/article/list/2?t=1 链接: link. ———————————————— 版权声明:本文为优快云博主「Simon223」的原创文章,遵循 CC 4.... 阅读详情

相关推荐

国科大 雁栖湖校区 研一上 课程避坑与生存指南

本文为国科大雁栖湖校区研一新生提供全面的课程避坑与生存指南,涵盖选课策略、核心课程学习技巧、校园生活攻略及心态管理。重点解析算法设计与分析、人工智能原理等硬核课程的学习方法,并分享食堂、住宿、自习室等实用生存技巧,帮助新生高效适应研究生生活。

weixin_29304985的博客 301

小程序实名认证与人脸核身双保险验证方案设计与实践

身份验证是保障在线业务安全的核心环节,其原理在于通过多因素校验确认操作者身份的真实性。在移动互联网时代,传统的密码或短信验证码已难以应对日益复杂的网络攻击,如短信劫持和撞库攻击。因此,结合实名信息核验与生物特征识别(如人脸识别)的多因素认证技术,因其更高的安全性和防伪能力,成为金融、政务等高安全要求场景的技术价值选择。该技术通过调用权威数据源进行实名信息比对,并利用活体检测与人脸比对算法,有效抵御伪造攻击,确保“人证合一”。其应用场景广泛覆盖用户注册、支付交易、敏感信息修改等关键操作。本文聚焦于在小程序这一

cuixie2370的博客 375

算法导论之线性规划

线性规划,充斥着运筹学,在图的单源最短路径求解差分约束系统就是用到线性规划。怎么样问题可以建模为线性规划来解决呢?在给定的有限的资源和竞争约束情况下,取得最大化或最小化目标的问题。导论中给出政治竞选问题、航空航线调度问题、钻井采油问题。最大化或最小化目标是函数的因变量,自变量就是资源的约束因素,其函数就是由这些制约因素构成的等式或不等式。下面数学定义下线性规划。 在一般线性规划问题中,最优化一个

医疗影像检索 2万+

基于SpringBoot的人脸识别的智慧医疗预约挂号平台系统(程序+文档+讲解)

当前智慧医疗预约挂号存在身份核验繁琐、号源占用混乱、就医流程低效等痛点:传统挂号依赖身份证或医保卡手动核验,易出现 “黄牛” 冒用他人身份囤号;患者需多次排队提交资料、确认信息,就医流程耗时长;老年患者等群体因操作不熟练,难以独立完成线上挂号,就医体验不佳。 基于人脸识别的智慧医疗预约挂号平台系统可系统性解决这些问题。系统通过人脸识别技术实现 “刷脸” 快速身份核验,结合医保数据联动确保人证一致,从源头遏制号源倒卖;整合预约挂号、就诊提醒、报告查询等功能,减少患者线下排队环节;针对特殊群体开发简化操作界面,

739

使用再生龙还原镜像文件到硬盘

1. 把制作好的再生龙光盘插入需要的电脑,开机按F4使用再生龙启动2. 选择默认的:Clonezailla live(Default settings,VGA 800*600),然后等待几分钟 3. 选择语言:简体中文 4. 选择不修改键盘映射 5. 选择使用再生龙          6. 选择硬盘/分区(存到/来自)镜像文件,此选项既可以制作镜像,也可以恢复镜像。 7. 使用本机的分区     ...

weixin_42168893的博客 1万+

nupkg 本地安装_使用Nuget安装离线包nupkg

一:Nuget简介:NuGet 是免费、开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库。当需要分享开发的工具或是库,需要建立一个Nuget package,然后把这个package放到Nuget的站点。如果想要使用别人已经开发好的工具或是库,只需要从站点获得这个package,并且安装到自己的Visual Studio项目或是解决方案里。NuGet能更方便地把一...

weixin_34460380的博客 1万+

基于Python+人脸识别的门禁管理系统设计与实现(精品源码+精品论文+答辩PPT)

本毕业设计聚焦于基于人脸识别的门禁管理系统的设计与实现,采用 Django 框架结合 MySQL 数据库构建。系统涵盖用户和管理员两个角色,具备多种实用功能。用户端提供注册登录、出入申请、出入识别、门禁使用、查看小区公告、留言反馈、修改密码以及管理个人信息等功能,为居民提供便捷、安全的门禁使用体验。通过人脸识别技术,实现快速准确的身份验证,提高出入效率。

java李阳勇的博客 1111

MS1030超声波流量计电路实战:如何用15ps精度优化水表设计(附配置代码)

本文深入探讨了如何利用MS1030超声波流量计芯片实现15ps高精度测量,以优化水表设计。文章从系统误差分配出发,详细解析了硬件电路设计要点、SPI通信配置及核心优化技巧,如利用可编程偏置电压和8回波累加功能来提升抗干扰能力与测量稳定性,并附有实用的配置代码示例。

svm4gardener的博客 334

MetaTown:一个可以自己构建数字资产的平台

华为云Solution as Code重磅推出《基于MetaTown构建数字资产平台》解决方案。

华为云官方博客 3341

三、STM32F103ZET6最小系统

stm32最小系统除去主控CPU外,需要包含,电源电路,复位电路,BOOT电路,时钟电路(因为stm32有内置时钟,对时钟要求不高的话,可以不要)。NRST引脚其实芯片已经用一个约40K的电阻上拉了,所以理论上来说是不需要再外接上拉电阻的,但我看大家都是有外接上拉的,心里没有底,不管这么多,先预留着。吃过亏,特意查看了芯片手册资料,下图是官方建议的供电方案,图片来自stm32f103zet6数据手册。首先明白目标,单纯的学习软件知识并不是我希望的,我还希望会硬件设计,这样后面才能摆脱开发板。

sevendecsdn的博客 6454

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3216

django基于人脸识别的门禁管理系统设计与开发(源码+精品论文+答辩PPT等资料)

摘要本毕业设计聚焦于基于人脸识别的门禁管理系统的设计与实现,采用 Django 框架结合 MySQL 数据库构建。系统涵盖用户和管理员两个角色,具备多种实用功能。用户端提供注册登录、出入申请、出入识别、门禁使用、查看小区公告、留言反馈、修改密码以及管理个人信息等功能,为居民提供便捷、安全的门禁使用体验。通过人脸识别技术,实现快速准确的身份验证,提高出入效率。

java李阳勇的博客 76

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

除了阿里云,还有哪些靠谱的身份证实名认证方案?SpringBoot开发者选型指南

本文为SpringBoot开发者提供了超越阿里云的五大身份证实名认证方案选型指南,详细对比了云服务商、专业第三方平台及自建系统的优缺点。内容涵盖API性能、成本控制、合规要点及SpringBoot集成实践,帮助开发者在确保安全合规的同时优化开发效率。特别适合需要高精度身份证实名认证的企业级应用。

weixin_33696106的博客 618

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为云运维类服务实战|CTS云审计、CES云监控、LTS云日志完整实验

本文通过华为云控制台实操,系统演示了CTS云审计、CES云监控、LTS云日志三大运维服务的完整配置与应用:启用CTS追踪器并结合SMN实现高危操作短信告警;配置CES CPU告警规则,模拟负载飙升触发告警并排查故障;部署ICAgent采集ECS日志,实现云端集中检索。实验强调资源清理,避免持续扣费,适合零基础运维学习者掌握云上监控与审计核心能力。

我的Linux界下小雨. 292

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

华为云镜像管理实战:从企业级私有镜像制作到CBR备份恢复的深度解析

诞生(IMS制作):从一台装好LAMP环境的公网云主机,剥离出纯净的私有镜像,成为弹性伸缩集群的“启动基石”。扩充(AS使用镜像):负载均衡与弹性伸缩利用该镜像,轻松实现“一秒克隆”多台Web服务器。保命(CBR备份与恢复):利用云备份技术对业务数据存底,在服务器被误删的绝境下,依托底层的镜像技术起死回生。上云的终极目标,不仅是把业务搬上去,而是要让业务在云上跑得更安全、更具弹性、更易维护。理解了镜像管理,你就掌握了“业务标准化”与“灾难恢复”的核心命脉。

2501_94351186的博客 155

华为云对等连接、Virtual Private Network 与 NAT 网关:两个网络要互通,三条路怎么选

对等连接用私有 IP 打通同区域两个 VPC(记得两边都加路由),VPN 用 IPSec 隧道打通跨区域或本地机房(记得两端参数对称),NAT 网关让一屋子机器共享一个出口(SNAT 出、DNAT 进)。三条路各修一段,谁也不能替代谁;删除时永远反着来。至此华为云的网络类服务走完一轮——VPC 给隔离,EIP 给入口,ELB 分流量,对等/VPN 连网络,NAT 省地址。

xbzb的博客 563

华为云存储怎么选?EVS、SFS、OBS 核心区别与实战解析

存储选型核心看两点:**访问模式(单机 / 多机共享)+ 数据类型(结构化数据库数据 / 文件 / 海量非结构化资源)**。没有绝对最好的存储,只有最合适业务场景的存储。实际生产环境还会出现组合方案:数据库用 EVS、集群日志用 SFS、图片素材备份放 OBS,三者搭配使用。

ShiqingfengA的博客 451

IntelliJ IDEA 下载 Gradle 报 504 怎么办?华为云镜像、本地 ZIP 和代理配置(Windows)

在 Windows 上用 IntelliJ IDEA 导入 Fabric 工程时,我遇到了 Gradle Wrapper 下载发行包报 HTTP 504 的问题。本文以 Gradle 9.8.2 为例,介绍华为云镜像、本地 ZIP 和 JVM 代理三种解决方法,并说明如何校验安装包、验证 Gradle 版本及重新同步项目。最后结合实际日志,区分发行包下载失败、JDK 版本不匹配和 downloadAssets 卡住这三类问题。

exlink2012的专栏 321

华为云五大运维监管服务详解|IAMSMNCESLTSCTS 理论 + 实战

摘要:上云不是终点,云上运维才是保障业务稳定运行的核心。华为云提供一整套运维监管套件:**IAM 身份权限、SMN 消息通知、CES 云监控、LTS 云日志、CTS 云审计**,实现权限管控、指标监控、日志采集、操作审计、告警通知完整闭环。本文结合课程理论 + 动手实验,梳理各服务定位、核心功能、业务场景,同时附上实操流程与踩坑经验。

ShiqingfengA的博客 599

华为云弹性文件服务 SFS 与云备份 CBR:一个目录,多台机器共享

SFS 的骨架是「一个文件系统 + 多台客户端 + NFS/CIFS 协议」,Linux 侧四条命令(装包、建目录、

xbzb的博客 477

华为云对象存储 OBS:桶、对象与四种存储类别,一次讲清

OBS 的记忆骨架是「一个账号 → 多个桶 → 桶里一堆扁平对象」,每个对象 = Key + 元数据 + 数据。四种存储类别按访问频次省钱,多版本控制防手滑,跨域复制做异地容灾,SSE 加密保内容、防盗链保流量、桶策略保权限。

xbzb的博客 319

embedding模型api怎么调?我把阿里云、腾讯云、华为云三家接口和本地推理的坑都踩了一遍

做语义检索或者给知识库喂向量的时候,头一道坎往往不是模型效果,而是怎么把一句话变成一串能算距离的数字。我这两周把 embedding模型api 在三家云上的调用方式,以及把模型拉到本地自己跑的完整链路都摸了一遍,发现云端和本地各有各的坑,而且本地推理的坑更隐蔽。这篇内容把我实测出来的五个反直觉点拆开讲,省得你重复踩。

vibecode的博客 318

华为云——运维服务

本文系统介绍运维服务的核心概念与实践,涵盖运维定义、职责及自动化、云时代变迁。重点讲解华为云IAM统一身份认证的权限管理、委托机制与企业项目应用,实现精细化访问控制;结合消息通知服务(SMN)与云监控服务(CES),构建高效、安全的告警与通知体系,保障系统稳定运行,提升运维效率与安全性。

zyf2431447031的博客 239

做异地灾备,华为云国际站 OBS 跨地域复制该怎么配置?

企业部署华为云国际站OBS跨Region复制构建异地灾备时,需警惕数据延迟、历史文件遗漏及恢复环境缺失等风险。跨区域复制为异步机制,非实时同步,且默认不自动迁移历史数据。应合理选择支持复制的Region,明确RPO/RTO要求,评估存储与传输成本,避免预算超支。建议结合应用、数据库及域名切换方案,实现完整业务恢复。云老大可协助规划方案、核对费用与配置,确保灾备实效,避免“有备无用”。

yunlaodacom的博客 112

华为云存储全套实战|EVS云硬盘、OBS对象存储、SFS弹性文件服务、CBR云备份

本文基于华为云控制台,面向零基础用户实操EVS云硬盘、OBS对象存储、SFS弹性文件服务与CBR云备份四大核心组件。通过创建、挂载、快照恢复、多版本控制、跨系统共享及整机备份等实战演练,掌握云存储核心功能。强调资源需同可用区、及时清理按需计费资源,避免账单损失。适合运维入门、课程实验与复习参考。

我的Linux界下小雨. 280

云原生运维实战笔记:华为云存储类服务全景解析——EVS、OBS、SFS与CBR深度实践

本文深度解析华为云EVS、OBS、SFS与CBR四大存储服务,涵盖块存储挂载、文件系统初始化、快照回滚及对象存储实操。通过Windows/Linux系统实战,掌握磁盘分区、格式化、自动挂载及数据保护机制;结合快照实现秒级数据恢复,验证EVS三副本高可靠架构;剖析OBS多层级存储策略与生命周期管理,全面呈现云原生环境下数据持久化与高效管理的完整解决方案。

2604_96593683的博客 487
上一篇: 抖音支付的使用(Java版本)
下一篇: vue2与springboot实现deepseek打印机聊天
unique_perfect
博客等级 码龄7年 2370粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

unique_perfect

您的支持是我创造的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值