草庐IT

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

凉城苦笑 2023-04-13 原文

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[]里面然后{{}}就行了!

最终效果图

有关Vue-Uni-App小程序实现身份证识别的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  9. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  10. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

随机推荐