Vue-Uni-App小程序实现身份证识别

Vue-Uni-App小程序实现身份证识别~

需求:实现一个身份证的识别功能!看下方图片!
思路:(把用户上传的身份证图片转成base64请求接口发送给后端,后端返回对应的信息渲染到页面上就行了!
在这里插入图片描述

识别出来后

在这里插入图片描述

第一步:在components新建 image-uploader.vue 代码如下:

<template>
  <view class="uploader-container row wrap">
    <view
      class="upload-image-box"
      v-for="(item, index) in fileList"
      :key="index"
      :style="{ width: previewWidth, height: previewHeight }"
    >
      <image
        mode="widthFix"
        class="img-preview"
        :src="item.url"
        :style="{ width: previewWidth, height: previewHeight }"
      />
      <view
        v-if="deletable"
        class="close-icon row-center"
        @click="deleteImage($event, index)"
      >
        <icon type="cancel" size="30" color="white" />
      </view>
    </view>
    <view
      ref="input"
      class="uplader-upload row-center"
      :style="{ width: previewWidth, height: previewHeight }"
      @click="handleImage"
      v-show="(fileList.length == 0 || mutiple) && fileList.length < maxUpload"
      v-if="!useSlot"
    >
      <image
        mode="widthFix"
        class="img-preview"
        :src="defaultImage"
        :style="{ width: previewWidth, height: previewHeight }"
      />
      <icon v-if="deletable" type="cancel" size="30" color="white" />
      <!-- <view type="image" accept="image/*" class="uploader-input" /> -->
    </view>
    <view
      class="uplader-upload-slot row-center"
      @click="handleImage"
      v-show="(fileList.length == 0 || mutiple) && fileList.length < maxUpload"
      v-else
    >
      <slot></slot>
    </view>
  </view>
</template>

<script>
export default {
  name: "uploader",
  props: {
    fileList: {
      type: Array,
      default: () => [],
    },
    // 默认不允许多选图片
    mutiple: {
      type: Boolean,
      default: false,
    },
    // 限制上传文件数量
    maxUpload: {
      type: Number,
      default: 1,
    },
    previewWidth: {
      type: String,
      default: "",
    },
    previewHeight: {
      type: String,
      default: "",
    },
    previewImage: {
      type: String,
      default: "",
    },
    // 是否可删除
    deletable: {
      type: Boolean,
      default: false,
    },
    // camera
    camera: {
      type: Boolean,
      default: false,
    },
    useSlot: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      defaultImage: null,
      inputId: "",
    };
  },
  create() {},
  mounted() {
    this.defaultImage = this.previewImage;
    this.inputId = "fileid" + "_" + Math.random() * 10;
    var input = document.createElement("input");
    input.id = this.inputId;
    input.type = "file";
    if (this.camera) {
      input.setAttribute("capture", "camera");
    }
    input.style.display = "none";
    input.className = "uploader-input";
    input.accept = "image/*";
    let that = this;
    input.onchange = (event) => {
      let file = document.getElementById(this.inputId);
      let fileName = file.value;
      let files = file.files;
      if (fileName == null || fileName == "") {
      } else {
        if (files[0]) {
          let reader = new FileReader();
          reader.readAsDataURL(files[0]);
          reader.onload = function(e) {
            var data = e.target.result;
            that.defaultImage = data;
            that.$emit("after-read", data);
          };
        }
      }
      // var file = this.file.target.files[0];
      // var reader = new FileReader();
      // reader.readAsDataURL(file);
      // reader.onload = function(e) {
      // 	var data = e.target.result;
      // 	me.imgbase = data;
      // 	console.log('Base64', data);
      // };
    };
    this.$refs.input.$el.appendChild(input);
  },
  methods: {
    handleImage() {
      let file = document.getElementById(this.inputId);
      file.click();
    },
    deleteImage(e, index) {
      this.$emit("delete", index);
    },
  },
};
</script>

<style lang="scss">
.uploader-container {
  .upload-image-box {
    position: relative;
    margin-right: 8rpx;
    margin-bottom: 8rpx;

    .img-preview {
      border-radius: 10rpx;

    }
    .close-icon {
      position: absolute;
      right: -20rpx;
      top: -15rpx;
      width: 40rpx;
      height: 40rpx;
      background-color: red;
      border-radius: 50%;
      z-index: 20;
    }
  }
  .img-preview {
    width: 100%;
  }
  .uplader-upload {
    position: relative;
    // background-color: #f7f8fa;
    cursor: pointer;
    .uploader-input {
      position: absolute;
      width: 100%;
      height: 100%;
      overflow: hidden;
      opacity: 0;
      top: 0;
      left: 0;
      z-index: 10;
      cursor: pointer;
    }
  }

  .uplader-upload-slot {
    position: relative;
    min-width: 160rpx;
    min-height: 160rpx;
    .uploader-input {
      position: absolute;
      width: 100%;
      height: 100%;
      overflow: hidden;
      opacity: 0;
      top: 0;
      left: 0;
      z-index: 10;
      cursor: pointer;
    }
  }
}
</style>

第二步:在你需要的页面注册组件:代码如下

import Uploader from "@/components/image-uploader.vue";

在export default 下面注册

  components: {
    Uploader
  },

开始使用

data card{}里面是放的背景图片!

data() {
    return {
      card: {
        url1: "../../static/imgs/idcard1.jpg",
        url2: "../../static/imgs/idcard2.jpg",
      },
    }
  },

template

<div class="box">
     <Uploader :previewImage="card.url1"/>
</div>

效果如下
可以看见背景图片已经出来了!用户点击也可以选择图片了!
在这里插入图片描述

把图片转成base64

template

<div class="box">
     <Uploader :previewImage="card.url1" @after-read="chooseImgFront"  class="uploader"/>
  </div>

图片已经转成了base64的转码,这打印base64到控制台!

chooseImgFront(e) {
    console.log(e);
 },

在这里插入图片描述
调用后端的接口,传入base64,根据你们的需求来,接口不是活的

import request from './http'

export default {
	// 身份证正面识别接口
	getIDCardFrontInfo(data) {
		return request({
		  url: `blade-lhyg/user/user_staff/identity/frontBase64`,
			method: 'POST',
			data
		});
	},
	// 身份证正面识别接口
	getIDCardReverseInfo(data) {
		return request({
		  url: `blade-lhyg/user/user_staff/identity/contraryBase64`,
			method: 'POST',
			data
		});
	},
	// 身份认证
	authentication(data) {
		return request({
		  url: `blade-lhyg/user/user_staff/identity/authentication`,
			method: 'POST',
			data
		});
	},
}

调用接口代码:

 async chooseImgFront(e) {
      uni.showLoading({
        title: "加载中",
        mask: true,
      });

      try {
        const { code, data } = await this.$api.certify.getIDCardFrontInfo({
          phoneNo: this.$store.getters.phoneNo,
          photo: e,
        });
        if (code === 200) {
          Object.assign(this.form, data);
        }
      } catch (error) {
      } finally {
        uni.hideLoading();
      }
    },

数据已经请求过来了
在这里插入图片描述

接下来就是数据渲染,数据渲染就不写了太简单了,就是把数据保存到list[]里面然后{{}}就行了!

最终效果图
在这里插入图片描述

  • 5
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值