<template> <view class="main"> <view class="logo"> <image src="@/static/image/logo2.png" mode="scaleToFill" class="img" /> </view> <view class="container"> <view class="head"> <view style="display: flex; align-items: center"> <view class="title">注册手机号</view> <!-- <view :style="{ fontSize: '18rpx' }">*实名认证失败</view> --> <!-- <view>*实名认证成功</view> --> </view> <view style="color: #7fa770; font-size: 24rpx; margin-left: 36rpx" >此实名仅用于注册该小程序</view > </view> <view class="radioGroup"> <view>实名认证方式</view> <u-radio-group v-model="radiovalue" placement="row" @change="groupChange" > <u-radio label="身份证" :name="'0'"></u-radio> <u-radio label="护照" :name="'1'"></u-radio> </u-radio-group> </view> <view class="info"> <view class="item"> <view class="name">姓名</view> <u--input placeholder="请输入姓名" border="none" v-model="name" @change="changeName" ></u--input> </view> <view class="item"> <view class="name">{{ radiovalue === "0" ? "身份证号" : "护照号" }}</view> <u--input placeholder="请输入身份证号" border="none" v-model="num" @change="changeNum" clearable type="idcard" v-if="radiovalue === '0'" ></u--input> <u--input placeholder="请输入护照号" border="none" v-model="passportId" @change="changePassport" clearable v-else ></u--input> </view> </view> <view class="card-box" v-if="radiovalue === '0'"> <view class="color:#626262;font-size:28rpx">身份证照片</view> <view style=" display: flex; justify-content: space-between; margin-top: 20rpx; " > <view class="card"> <view> <u-upload :fileList="fileList" @afterRead="afterRead" @delete="deletePic" name="1" multiple :maxCount="1" :width="'270rpx'" :height="'158rpx'" previewImage > <image src="@/static/image/card.png" mode="scaleToFill" style="width: 270rpx; height: 158rpx" ></image> </u-upload> </view> <view style="color: #4e964d; font-size: 20rpx; margin-top: 20rpx" >上传身份证人像面</view > </view> <view class="card"> <view> <u-upload :fileList="fileList2" @afterRead="afterRead2" @delete="deletePic2" name="1" multiple :maxCount="1" :width="'270rpx'" :height="'158rpx'" > <image src="@/static/image/card2.png" mode="scaleToFill" style="width: 270rpx; height: 158rpx" ></image> </u-upload> </view> <view style="color: #4e964d; font-size: 20rpx; margin-top: 20rpx" >上传身份证国徽面</view > </view> </view> </view> <view v-else class="card-box"> <view class="color:#626262;font-size:28rpx">护照照片</view> <view style=" display: flex; justify-content: space-between; margin-top: 20rpx; " > <view class="card"> <view> <u-upload :fileList="passport" @afterRead="afterReadPassport" @delete="deletePassport" name="1" multiple :maxCount="1" :width="'270rpx'" :height="'158rpx'" previewImage > <image src="@/static/image/passport.png" mode="scaleToFill" style="width: 270rpx; height: 158rpx" ></image> </u-upload> </view> <view style="color: #4e964d; font-size: 20rpx; margin-top: 20rpx" >上传护照资料页</view > </view> <view class="card"> <view> <u-upload :fileList="passport2" @afterRead="afterReadPassport2" @delete="deletePassport2" name="1" multiple :maxCount="1" :width="'270rpx'" :height="'158rpx'" > <image src="@/static/image/passport2.png" mode="scaleToFill" style="width: 270rpx; height: 158rpx" ></image> </u-upload> </view> <view style="color: #4e964d; font-size: 20rpx; margin-top: 20rpx" >上传护照封面</view > </view> </view> </view> <view v-if="needPersonSecret" class="face"> <view class="faceTitle">人脸识别</view> <view class="recognition" @click="camera" v-if="!video"> <view style="color: #fff; margin-right: 10rpx">前往认证</view> <u-icon name="arrow-right-double" color="#fff"></u-icon> </view> <view class="recognition" @click="camera" v-else> <view style="color: #fff; margin-right: 10rpx">认证成功</view> <u-icon name="checkmark-circle" color="#fff"></u-icon> </view> </view> <view class="face"> <view class="faceTitle">法大大认证</view> <view class="recognition" @click="fddRealName" v-if="!isFddSuccess"> <view style="color: #fff; margin-right: 10rpx">前往认证</view> <u-icon name="arrow-right-double" color="#fff"></u-icon> </view> <view class="recognition" @click="fddRealName" v-else> <view style="color: #fff; margin-right: 10rpx">认证成功</view> <u-icon name="checkmark-circle" color="#fff"></u-icon> </view> </view> <view class="agreement"> <u-checkbox-group v-model="checked" iconPlacement="left" placement="row" inactiveColor="#76C458" > <u-checkbox name="yes" shape="circle" activeColor="#76C458" ></u-checkbox> <view class="know"> 已阅读并同意 <text @click="agreementHandle('service')" >《软件许可及服务协议》</text > <text @click="agreementHandle('privacy')">&《隐私保护政策》</text> </view> </u-checkbox-group> </view> <view style="width: 284rpx; margin: 20rpx auto"> <u-button text="完成注册" shape="circle" @click="completeRegistration" color="#76C458" ></u-button> </view> </view> <!-- <u-loading-page bg-color="rgba(0, 0, 0, 0.8)" loading-text="数据正在加载中" :loading="show"></u-loading-page> --> </view> </template> <script> import http from "@/http/api"; import { configFun } from "../../http/login"; export default { data() { return { needPersonSecret: false, name: "", num: "", passportId: "", checked: [], fileList: [], fileList2: [], passport: [], passport2: [], video: "", isChecked: false, isFddSuccess: false, radiovalue: "0", typeId: "", }; }, async onLoad(options) { const res = await configFun(); if (res.code === 200) { this.needPersonSecret = res.data.needPersonSecret; } const data = JSON.parse(decodeURIComponent(options.data)); this.name = data.name || ""; this.num = data.num || ""; this.fileList = data.fileList || []; this.fileList2 = data.fileList2 || []; this.radiovalue = data.radiovalue; this.passport = data.passport || []; this.passport2 = data.passport2 || []; this.passportId = data.passportId || ""; }, async onShow() { if (!uni.getStorageSync("telNum")) { uni.navigateTo({ url: "/pages/login/login", }); } this.checkFdd(); // if (uni.getStorageSync("tempVideoPath")) { // const tempVideoPath = uni.getStorageSync("tempVideoPath"); // this.video = await this.uploadFilePromise(tempVideoPath); // uni.removeStorageSync("tempVideoPath"); // console.log( // "this.video", // this.video, // uni.getStorageSync("tempVideoPath") // ); // const data = { // num: uni.getStorageSync("info").num || '', // name: uni.getStorageSync("info").name || '', // fileList: uni.getStorageSync("info").fileList || [], // fileList2: uni.getStorageSync("info").fileList2, // video: this.video // } // uni.setStorageSync("info", data) // } }, watch: { isFddSuccess(newValue) { if (newValue) { console.log(newValue); this.name = uni.getStorageSync("info").name || ""; this.num = uni.getStorageSync("info").num || ""; this.fileList = uni.getStorageSync("info").fileList || []; this.fileList2 = uni.getStorageSync("info").fileList2 || []; this.video = uni.getStorageSync("info").video || ""; this.radiovalue = uni.getStorageSync("info").radiovalue ?? "0"; this.passport = uni.getStorageSync("info").passport || []; this.passport2 = uni.getStorageSync("info").passport2 || []; this.passportId = uni.getStorageSync("info").passportId || ""; uni.removeStorageSync("info"); } }, }, methods: { changeName(value) { this.name = value; }, changeNum(value) { this.num = value; }, changePassport(value) { this.passportId = value; }, camera() { uni.navigateTo({ url: "/pages/cameraContext/cameraContext", }); }, async completeRegistration() { const res1 = await this.checkFdd(); if (!res1) return this.$common.msgToast("法大大验证未通过"); if (res1 && this.typeId !== this.radiovalue) return this.$common.msgToast("法大大验证失效请重新认证"); if (!this.checked.length) return this.$common.msgToast("请阅读并勾选协议"); if (!this.name) return this.$common.msgToast("请输入姓名"); if (this.radiovalue === "0") { if (!this.fileList.length) return this.$common.msgToast("请上传身份证人面像"); if (!this.fileList2.length) return this.$common.msgToast("请上传身份国徽面"); if (!this.num) return this.$common.msgToast("请输入身份证号"); } else { if (!this.passport.length) return this.$common.msgToast("请上传护照正面"); if (!this.passport2.length) return this.$common.msgToast("请上传护照背面"); if (!this.passportId) return this.$common.msgToast("请输入护照号"); } // if (this.needPersonSecret && !this.video) // return this.$common.msgToast("请上传人脸识别视频"); const res = await this.$api.login.register({ user: { telNum: uni.getStorageSync("telNum"), realNameIDName: this.num, realName: this.name, realIDImgA: this.fileList[0]?.url || "", realIDImgB: this.fileList2[0]?.url || "", idType: this.radiovalue, passport: { idNum: this.passportId, name: this.name, RealIDImgA: this.passport[0]?.url || "", RealIDImgB: this.passport2[0]?.url || "", }, }, }); if (res.status === 0) { uni.switchTab({ url: "/pages/home/index", }); } else { this.$common.msgToast(res.msg); } }, // 删除图片 deletePic(event) { this[`fileList`].splice(event.index, 1); }, deletePassport(event) { this[`passport`].splice(event.index, 1); }, deletePassport2(event) { this[`passport2`].splice(event.index, 1); }, // 删除图片 deletePic2(event) { this[`fileList2`].splice(event.index, 1); }, // 新增图片 async afterRead(event) { // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式 let lists = [].concat(event.file); let fileListLen = this[`fileList`].length; lists.map((item) => { this[`fileList`].push({ ...item, status: "uploading", message: "上传中", }); }); for (let i = 0; i < lists.length; i++) { const result = await this.uploadFilePromise(lists[i].url, "check"); let item = this[`fileList`][fileListLen]; this[`fileList`].splice( fileListLen, 1, Object.assign(item, { status: "success", message: "", url: result, }) ); fileListLen++; } }, async afterReadPassport(event) { let lists = [].concat(event.file); let fileListLen = this[`passport`].length; lists.map((item) => { this[`passport`].push({ ...item, status: "uploading", message: "上传中", }); }); for (let i = 0; i < lists.length; i++) { const result = await this.uploadFilePromise(lists[i].url, "check"); let item = this[`passport`][fileListLen]; this[`passport`].splice( fileListLen, 1, Object.assign(item, { status: "success", message: "", url: result, }) ); fileListLen++; } }, async afterRead2(event) { // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式 let lists = [].concat(event.file); let fileListLen = this[`fileList2`].length; lists.map((item) => { this[`fileList2`].push({ ...item, status: "uploading", message: "上传中", }); }); for (let i = 0; i < lists.length; i++) { const result = await this.uploadFilePromise(lists[i].url); let item = this[`fileList2`][fileListLen]; this[`fileList2`].splice( fileListLen, 1, Object.assign(item, { status: "success", message: "", url: result, }) ); fileListLen++; } }, async afterReadPassport2(event) { // 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式 let lists = [].concat(event.file); let fileListLen = this[`passport2`].length; lists.map((item) => { this[`passport2`].push({ ...item, status: "uploading", message: "上传中", }); }); for (let i = 0; i < lists.length; i++) { const result = await this.uploadFilePromise(lists[i].url); let item = this[`passport2`][fileListLen]; this[`passport2`].splice( fileListLen, 1, Object.assign(item, { status: "success", message: "", url: result, }) ); fileListLen++; } }, uploadFilePromise(url, type = null) { return new Promise((resolve) => { uni.uploadFile({ url: http.baseUrl + "/api/wxuser/uploadpic", filePath: url, name: "file", success: (res) => { const { path } = JSON.parse(res.data).data; resolve(path); if (type === "check" && this.radiovalue === "0") { this.chenckId(path); } }, }); }); }, async chenckId(realIDImgA) { const res = await this.$api.login.chenckId({ realIDImgA }); if (res.status === 0) { this.num = res.data.iDNum; this.name = res.data.realName; } else { this.$common.msgToast("未识别身份信息"); } }, async fddRealName() { console.log(this.radiovalue); if (this.radiovalue === "0") { if (!this.num || !this.name) return this.$common.msgToast("姓名和身份证号不能为空"); } else { if (!this.passportId || !this.name) return this.$common.msgToast("姓名和护照号不能为空"); } const data = { num: this.num, name: this.name, fileList: this.fileList, fileList2: this.fileList2, passport: this.passport, passport2: this.passport2, passportId: this.passportId, radiovalue: this.radiovalue, }; console.log(data, "data"); uni.setStorageSync("info", data); const mobile = uni.getStorageSync("telNum"); const res = await this.$api.login.fddRealName({ customerName: this.name, customerIdentNo: this.num || this.passportId, mobile, idType: this.radiovalue, }); if (res.status === 0) { uni.setStorageSync("fddUrl", res.data?.url); uni.navigateTo({ url: "/pages/realName/FDDRegister", }); } else { this.$common.msgToast(res.msg); } }, checkFdd() { return this.$api.login.checkFdd().then((res) => { if (res.status === 0) { this.isFddSuccess = res.data.isVerify; this.typeId = res.data.idType; return res.data.isVerify; } else { this.$common.msgToast(res.msg); } }); }, agreementHandle(type) { const data = { num: this.num, name: this.name, fileList: this.fileList, fileList2: this.fileList2, radiovalue: this.radiovalue, passport: this.passport, passport2: this.passport2, passportId: this.passportId, }; uni.setStorageSync("info", data); uni.navigateTo({ url: "/pages/realName/agreement?type=" + type + "&data=" + encodeURIComponent(JSON.stringify(data)), }); }, groupChange(value) { console.log(value); if (value === "1") { this.fileList = []; this.fileList2 = []; this.name = ""; this.num = ""; } else { this.passport = []; this.passport2 = []; this.passportId = ""; } }, }, }; </script> <style lang="scss" scoped> /deep/ .u-radio { margin-right: 20rpx; } /deep/.u-checkbox__icon-wrap--circle { width: 30upx !important; height: 30upx !important; } /deep/ .u-checkbox-label--left { margin-top: 20rpx; } .main { background: url("@/static/image/login-bg.png") no-repeat; box-sizing: border-box; display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100vh; .logo { height: 200rpx; display: flex; flex-direction: column; justify-content: center; align-items: center; .img { width: 142rpx; height: 60rpx; } } .container { display: flex; flex-direction: column; flex: 1; box-sizing: border-box; height: calc(100vh - 200upx); width: 100%; background: #fff; border-radius: 40rpx 40rpx 0rpx 0rpx; padding: 62rpx 32rpx; .head { .title { color: #626262; font-size: 40rpx; margin-left: 36rpx; font-weight: 600; } } .radioGroup { display: flex; gap: 40rpx; margin: 10rpx 0; } .info { margin-top: 24rpx; .item { box-sizing: border-box; background: #f8f8f8; border-radius: 20rpx; width: 100%; height: 92rpx; display: flex; align-items: center; padding-left: 24rpx; margin-bottom: 20rpx; .name { width: 200rpx; height: 72rpx; line-height: 72rpx; border-right: 1rpx solid #d1d1d1; } /deep/ .u-input { margin-left: 40rpx; } } } .card-box { width: 100%; height: 322rpx; background: #f8f8f8; padding: 32rpx 24rpx; box-sizing: border-box; .card { display: flex; justify-content: center; align-items: center; flex-direction: column; } } .face { margin-top: 20rpx; box-sizing: border-box; background: #f8f8f8; border-radius: 20rpx; width: 100%; height: 92rpx; display: flex; align-items: center; .faceTitle { width: 202rpx; height: 100%; padding: 26rpx 0 26rpx 24rpx; box-sizing: border-box; } .recognition { height: 92rpx; width: calc(100% - 202rpx); background: #76c458; display: flex; justify-content: center; align-items: center; border-radius: 0 20rpx 20rpx 0; } } .agreement { font-size: 28rpx; margin: 46rpx auto; .know { margin-top: 20upx; font-size: 28upx; color: #a6a6a6; text { color: #76c458; } } } } } </style>