officialAccount/pages/addjigou/name.vue

616 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="container">
<u-modal v-model="show" :content="content"></u-modal>
<view class="title-back">
<view class="left-father" @click="goBack">
<image class="back-img" src="https://www.focusnu.com/media/directive/index/left.png" />
<view style="font-size: 30rpx;">企业加盟</view>
</view>
</view>
<view class="white-content">
<view class="content-title">
<view class="shu"></view>
<view class="content-weight">身份证</view>
<view style="font-size: 20rpx;margin: 12rpx 0 0 15rpx;">(必填)</view>
</view>
<view class="white-photo" @click="selectphoto(0)">
<view class="photo-left">
<view class="photo-weight">人像面</view>
<view class="photo-font">请上传身份证人像面</view>
</view>
<view style="position: relative;">
<image class="photo"
:src="headImge ? headImge : `https://www.focusnu.com/media/directive/index/IDcard.png`" />
<image v-if="!headImge"
style="position: absolute;top: 50%;left: 50%;width: 70rpx;height: 60rpx;transform: translate(-50%,-50%);"
src="https://www.focusnu.com/media/directive/index/takephoto.png" />
</view>
</view>
<view class="white-photo" style="margin-top: 30rpx;" @click="selectphoto(1)">
<view class="photo-left">
<view class="photo-weight">国徽面</view>
<view class="photo-font">请上传身份证国徽面</view>
</view>
<view style="position: relative;">
<image class="photo"
:src="backImge ? backImge : `https://www.focusnu.com/media/directive/index/backIDcard.png`" />
<image v-if="!backImge"
style="position: absolute;top: 50%;left: 50%;width: 70rpx;height: 60rpx;transform: translate(-50%,-50%);"
src="https://www.focusnu.com/media/directive/index/takephoto.png" />
</view>
</view>
<view class="content-title" style="margin: 20rpx 0;">
<view class="shu"></view>
<view class="content-weight">确认身份证信息</view>
<!-- <view style="font-size: 20rpx;margin: 15rpx 0 0 15rpx;">(必填)</view> -->
</view>
<view class="white-message">
<!-- <view class="message-title">
<view class="shu"></view>
<view class="message-weight">
确认身份证信息
</view>
</view> -->
<view>
<view v-for="(item,index) in nameArray" :key="index" class="one"
@click="openLook(textArray[index])">
<view class="one-left">{{item}}</view>
<!-- <view class="one-right">{{textArray[index] ? textArray[index] : "自动获取" }}</view> -->
<view class="one-right">{{textArray[index] ? textArray[index] : "自动获取" }}</view>
</view>
</view>
</view>
</view>
<view class="gray-font">
<view style="color: #333333;">注意事项:</view>
<view style="margin-top: 30rpx;font-size: 28rpx;">
<view class="line">1.同一个身份证号只能认证一个账号。</view>
<view class="line">2.国徽与正面信息应为同一身份证的信息且在有效期内。</view>
<view class="line">3.所有上传照片需清晰且未遮挡,请勿进行美化和修改。</view>
<view class="line">4.所有上传信息均会被妥善保管,不会用于其他商业用途或传输给第三方。</view>
</view>
</view>
<view style="display: flex;width: 100%;">
<!-- <view class="finish-button" @click="goBack">
上一步
</view> -->
<view class="finish-button" @click="next">
确认并继续
</view>
</view>
<u-action-sheet :list="bottomlist" @click="photoclick" v-model="bottomshow"></u-action-sheet>
</div>
</template>
<script setup>
import {
ref,
reactive
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app';
import {
base_url
} from '@/request/index.js';
import {
changemessage
} from './api/addjigou.js'
const show = ref(false);
const content = ref("");
const bottomshow = ref(false);
const bottomlist = [{
text: '拍摄图片',
fontSize: 40
}, {
text: '图片预览',
fontSize: 40
}]
const nameArray = ["姓名", "性别", "身份证号码", "民族", "出生日期", "住址", "签发机关", "有效期限"];
const textArray = reactive(["", "", "", "", "", "", "", ""]);
const states = ["审核中", "审核未通过", "审核通过"];
const fontphoto = ref("");
const endphoto = ref("");
const statesTarget = ref(0);
const shenhe = () => {
if (statesTarget.value == 2) {
statesTarget.value = 0
} else {
statesTarget.value++
}
}
const photoclick = (element) => {
if(element){
uni.previewImage({
urls: [headImge.value,backImge.value], // 必填,所有要预览的图片地址数组
current: targetphoto.value?backImge.value:headImge.value , // 可选,当前显示图片的地址,默认是 urls[0]
indicator: 'default', // 可选指示器样式H5/App 有效,值为 'default'(圆点)或 'number'(数字)
longPressActions: { // 可选,仅 App 支持,长按图片时弹出的操作项
itemList: ['保存图片到相册'],
},
});
}else{
getMessage()
}
}
// 本地保存的临时文件路径
const tempImagePath = ref('')
const targetphoto = ref(0)
const selectphoto = (number) =>{
if(backImge.value && headImge.value){
targetphoto.value = number
bottomshow.value = true;
}else{
getMessage()
}
}
// 拍照并上传
function getMessage() {
// 使用 UniApp 的 API 调用摄像头
uni.chooseImage({
count: 1,
sourceType: ['album', 'camera'],
success: chooseRes => {
tempImagePath.value = chooseRes.tempFilePaths[0]
// 拍照成功后,调用上传函数
uni.navigateTo({
url: `/compontent/public/camera?url=${chooseRes.tempFilePaths[0]}&type=0`
});
},
fail: err => {
console.error('拍照失败:', err)
}
})
}
const headImge = ref("");
const backImge = ref("");
// 日期转换
function formatChineseDate(chineseDate) {
return chineseDate.replace(/(\d+)年(\d+)月(\d+)日/, (_, y, m, d) => {
return `${y}.${m}.${d}`;
});
}
function toIsoDate(dateStr) {
return dateStr.replace(
/(\d{2,4})\.(\d{1,2})\.(\d{1,2})/,
(_, y, m, d) => {
// 月日补齐两位
const mm = m.padStart(2, '0');
const dd = d.padStart(2, '0');
return `${y}-${mm}-${dd}`;
}
);
}
// 上传图片到服务器
function uploadImage(filePath) {
uping.value = false;
uni.showLoading()
uni.uploadFile({
url: `${base_url}/api/ocr/idCard`, // 替换为你的POST接口地址
filePath,
name: 'file', // 后端接收时的字段名
header: {
'X-Access-Token': uni.getStorageSync('token') || '',
},
formData: {},
success: uploadRes => {
console.log("token", uni.getStorageSync('token'))
if (!JSON.parse(uploadRes.data).success) {
uni.showToast({
title: '识别失败',
icon: 'error',
duration: 2000
})
uping.value = true;
uni.hideLoading()
return
}
if (JSON.parse(JSON.parse(uploadRes.data).result.data).data.face) {
let father = JSON.parse(JSON.parse(uploadRes.data).result.data).data.face.data;
textArray[0] = father.name;
textArray[1] = father.sex;
textArray[2] = father.idNumber;
textArray[3] = father.ethnicity;
textArray[4] = father.birthDate;
textArray[5] = father.address;
uni.showToast({
title: '识别成功',
})
headImge.value = filePath;
savephoto(filePath, 0);
uni.hideLoading()
} else if (JSON.parse(JSON.parse(uploadRes.data).result.data).data.back)
{
let father = JSON.parse(JSON.parse(uploadRes.data).result.data).data.back.data;
textArray[6] = father.issueAuthority;
textArray[7] = father.validPeriod;
uni.showToast({
title: '识别成功',
})
backImge.value = filePath;
savephoto(filePath, 1);
uni.hideLoading()
} else {
uni.showToast({
title: '识别失败',
icon: 'error',
duration: 2000
})
uping.value = false;
uni.hideLoading()
}
},
fail: err => {
uni.showToast({
title: '上传出错',
icon: 'error'
})
uni.hideLoading()
}
})
}
const uping = ref(true)
const savephoto = (filePath, type) => {
uni.uploadFile({
url: `${base_url}/sys/common/upload`, // 替换为你的POST接口地址
filePath,
name: 'file', // 后端接收时的字段名
header: {
'X-Access-Token': uni.getStorageSync('token') || '',
},
formData: {
biz: `temp`
},
success: uploadRes => {
if (!type) {
fontphoto.value = JSON.parse(uploadRes.data).message
} else {
endphoto.value = JSON.parse(uploadRes.data).message
}
uping.value = true;
},
fail: err => {
uni.showToast({
title: '上传出错',
icon: 'error'
})
uni.hideLoading()
}
})
}
const openLook = (res) => {
if (res) {
content.value = res;
show.value = true
}
}
const next = () => {
// console.log("??????")
const allNonEmpty = textArray.every(item => {
// 如果想忽略前后空格,可用 item.trim() !== ''
return item !== '';
});
if (!uping.value) {
return
}
if (allNonEmpty) {
const range = textArray[7];
const [start, end] = range.split('-');
let pushMessage = {
id: uni.getStorageSync('specicalid') || "",
tel: uni.getStorageSync('tel'),
name: textArray[0],
sex: textArray[1],
idCard: textArray[2],
national: textArray[3],
birthDate: textArray[4],
idCardAddress: textArray[5],
issuingAuthority: textArray[6],
startTime: start,
endTime: end,
cardZmPath: fontphoto.value,
cardFmPath: endphoto.value
}
// console.log("????",pushMessage)
changemessage(pushMessage).then(res => {
if (res.success) {
if (res.message == `保存成功!`) {
uni.navigateTo({
url: "/pages/addjigou/card"
});
} else {
uni.setStorageSync('specicalid', res.result.id);
uni.navigateTo({
url: "/pages/addjigou/card"
});
}
} else {
uni.showToast({
title: res.message,
icon: 'error'
})
}
})
} else {
uni.showToast({
title: '请完善信息',
icon: 'error'
})
}
}
const goBack = () => {
uni.navigateBack()
}
onLoad(() => {
if (uni.getStorageSync('baddata')) {
let data = uni.getStorageSync('baddata');
textArray[0] = data.name;
textArray[1] = data.sex;
textArray[2] = data.idCard;
textArray[3] = data.national;
textArray[4] = data.birthDate;
textArray[5] = data.idCardAddress;
textArray[6] = data.issuingAuthority;
textArray[7] = `${data.startTime}-${data.endTime}`;
headImge.value = `${base_url}/sys/common/static/${data.cardZmPath}`;
backImge.value = `${base_url}/sys/common/static/${data.cardFmPath}`;
fontphoto.value = data.cardZmPath
endphoto.value = data.cardFmPath
}
})
onShow(() => {
const img = uni.getStorageSync('imgkey0')
if (img) {
uploadImage(img)
uni.removeStorageSync('imgkey0')
}
})
</script>
<style lang="scss" scoped>
.container {
display: flex;
flex-direction: column;
min-height: 100vh;
width: 100%;
background-color: #F7F7F7;
position: relative;
// box-shadow: 2rpx 2rpx 4rpx rgba(0, 0, 0, 0.1);
.white-content {
width: 90%;
margin-left: 5%;
// margin-top: 30rpx;
// height: 1200rpx;
border-radius: 35rpx;
// background-color: rgb(245, 251, 254);
.content-title {
display: flex;
align-items: center;
height: 100rpx;
position: relative;
font-weight: 600;
.content-weight {
// font-size: 35rpx;
// margin-left: 10rpx;
font-size: 32rpx;
// margin-top: 20rpx;
}
.content-img {
position: absolute;
right: 0;
top: 0;
width: 400rpx;
height: 100%;
}
}
}
.white-photo {
width: 100%;
// margin-left: 5%;
// margin-top: 30rpx;
height: 300rpx;
border-radius: 35rpx;
background-color: #fff;
// box-shadow: 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.1);
justify-content: space-around;
align-items: center;
display: flex;
.photo {
width: 300rpx;
height: 200rpx;
}
}
.white-message {
width: 100%;
// margin-left: 5%;
margin-top: 20rpx;
padding-top: 20rpx;
padding-bottom: 20rpx;
margin-bottom: 30rpx;
// height: 800rpx;
border-radius: 35rpx;
background-color: #fff;
// box-shadow: 4rpx 4rpx 8rpx rgba(0, 0, 0, 0.1);
justify-content: space-around;
// align-items: center;
display: flex;
flex-direction: column;
.message-title {
width: 100%;
height: 100rpx;
align-items: center;
display: flex;
.message-weight {
font-size: 30rpx;
// font-weight: 600;
}
}
.one {
width: 90%;
margin-left: 5%;
// border-bottom: 1rpx solid #F7F7F7;
height: 100rpx;
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10rpx;
.one-left {
margin-left: 10rpx;
font-size: 30rpx;
}
.one-right {
margin-right: 10rpx;
font-size: 30rpx;
color: #999999;
overflow: hidden;
/* 隐藏超出内容 */
white-space: nowrap;
/* 不换行 */
text-overflow: ellipsis;
max-width: 380rpx;
}
}
}
}
.photo-left {
.photo-weight {
font-size: 32rpx;
font-weight: 600;
color: #333;
}
.photo-font {
font-size: 28rpx;
margin-top: 10rpx;
color: #666;
}
}
.gray-font {
padding: 20rpx 60rpx;
padding-bottom: 35rpx;
color: #999999;
}
.finish-button {
display: flex;
justify-content: center;
align-items: center;
width: 92%;
height: 90rpx;
margin: 0rpx auto;
margin-bottom: 80rpx;
margin-top: 20rpx;
color: #fff;
background: linear-gradient(to right, #00C9FF, #0076FF);
border-radius: 50rpx;
font-size: 35rpx;
}
.title-back {
margin-top: 100rpx;
width: 100%;
height: 100rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.left-father {
display: flex;
align-items: center;
.back-img {
width: 40rpx;
height: 40rpx;
margin-left: 40rpx;
margin-right: 15rpx;
}
}
.rightStautes {
width: 170rpx;
height: 62rpx;
border-radius: 60rpx;
background-color: #FF913A;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
margin-right: 30rpx;
}
.rightStautesred {
width: 170rpx;
height: 62rpx;
border-radius: 60rpx;
background: linear-gradient(to right, #FF4A76, #FF553A);
display: flex;
justify-content: center;
align-items: center;
color: #fff;
margin-right: 30rpx;
}
.rightStautesblue {
width: 170rpx;
height: 62rpx;
border-radius: 60rpx;
background: linear-gradient(to right, #00C9FF, #0076FF);
display: flex;
justify-content: center;
align-items: center;
color: #fff;
margin-right: 30rpx;
}
.shu {
width: 14rpx;
height: 36rpx;
background-color: #0097FF;
border-radius: 10rpx;
margin: 3rpx 20rpx 0 30rpx;
}
.line {
margin: 10rpx 0;
}
</style>