<template>
|
<view class="cert-details-page" v-if="detailData">
|
<view class="cert-details-page__status-card" :class="'cert-details-page__status-card--' + statusType">
|
<view class="cert-details-page__status-head">
|
<image class="cert-details-page__status-icon" :src="statusIcon" mode="aspectFit"></image>
|
<text class="cert-details-page__status-title" :class="'cert-details-page__status-title--' + statusType">{{ statusTitle }}</text>
|
</view>
|
<text v-if="statusDesc" class="cert-details-page__status-desc">{{ statusDesc }}</text>
|
</view>
|
|
<view class="cert-details-page__section">
|
<text class="cert-details-page__section-title">基本信息</text>
|
|
<view class="cert-details-page__info-list">
|
<view v-for="item in basicInfo" :key="item.label" class="cert-details-page__info-item">
|
<text class="cert-details-page__info-label">{{ item.label }}</text>
|
<text class="cert-details-page__info-value">{{ item.value }}</text>
|
</view>
|
</view>
|
|
<view class="cert-details-page__upload-group">
|
<text class="cert-details-page__upload-title">身份证正反面</text>
|
<view class="cert-details-page__upload-list">
|
<view v-for="(img, index) in idcardImgs" :key="index" class="cert-details-page__upload-card">
|
<image class="cert-details-page__upload-image" :src="img" mode="aspectFill" @click="previewImage(img)"></image>
|
</view>
|
</view>
|
</view>
|
</view>
|
|
<view class="cert-details-page__section cert-details-page__section--last">
|
<text class="cert-details-page__section-title">车辆信息</text>
|
|
<view class="cert-details-page__info-list">
|
<view v-for="item in vehicleInfo" :key="item.label" class="cert-details-page__info-item">
|
<text class="cert-details-page__info-label">{{ item.label }}</text>
|
<text class="cert-details-page__info-value">{{ item.value }}</text>
|
</view>
|
</view>
|
|
<view class="cert-details-page__upload-group">
|
<text class="cert-details-page__upload-title">车辆照片</text>
|
<view class="cert-details-page__upload-list">
|
<view v-for="(img, index) in carImgs" :key="index" class="cert-details-page__upload-img">
|
<image class="cert-details-page__upload-image" :src="img" mode="aspectFill" @click="previewImage(img)"></image>
|
</view>
|
</view>
|
</view>
|
|
<view v-if="needLicense" class="cert-details-page__upload-group">
|
<text class="cert-details-page__upload-title">驾驶证照片</text>
|
<view class="cert-details-page__upload-list cert-details-page__upload-list--single">
|
<view v-for="(img, index) in licenseImgs" :key="index" class="cert-details-page__upload-img">
|
<image class="cert-details-page__upload-image" :src="img" mode="aspectFill" @click="previewImage(img)"></image>
|
</view>
|
</view>
|
</view>
|
|
<view class="cert-details-page__upload-group">
|
<text class="cert-details-page__upload-title">其它材料</text>
|
<view class="cert-details-page__upload-list cert-details-page__upload-list--single">
|
<view v-for="(img, index) in otherImgs" :key="index" class="cert-details-page__upload-img">
|
<image class="cert-details-page__upload-image" :src="img" mode="aspectFill" @click="previewImage(img)"></image>
|
</view>
|
</view>
|
</view>
|
</view>
|
|
<button v-if="hasApprovedOfficial && statusType === 'approved'" class="cert-details-page__rebtn" @click="goRecertify">重新认证</button>
|
<button v-if="statusType === 'rejected'" class="cert-details-page__rebtn" @click="goRecertify">重新认证</button>
|
<view style="width: 100%; height: 30rpx;" v-if="statusType === 'rejected'"></view>
|
</view>
|
</template>
|
|
<script>
|
export default {
|
data() {
|
return {
|
statusType: 'review',
|
detailData: null,
|
hasApprovedOfficial: false,
|
basicInfo: [],
|
vehicleInfo: [],
|
idcardImgs: [],
|
carImgs: [],
|
licenseImgs: [],
|
otherImgs: [],
|
needLicense: false,
|
carTypeList: []
|
}
|
},
|
computed: {
|
statusTitle() {
|
const titleMap = {
|
review: '平台审核中',
|
approved: '司机认证已通过',
|
rejected: '司机认证已拒绝'
|
}
|
|
return titleMap[this.statusType] || titleMap.review
|
},
|
statusDesc() {
|
const descMap = {
|
review: '审核结果将通过短信/订单消息通知您',
|
approved: '',
|
rejected: this.detailData?.auditRemark || '认证信息有误,请重新提交审核'
|
}
|
|
return descMap[this.statusType] || ''
|
},
|
statusIcon() {
|
const iconMap = {
|
review: '/static/image/ic_renzhengzhong@2x.png',
|
approved: '/static/image/ic_pass@2x.png',
|
rejected: '/static/image/ic_fail@2x.png'
|
}
|
|
return iconMap[this.statusType] || iconMap.review
|
}
|
},
|
onShow() {
|
this.getVerifyDetail()
|
},
|
methods: {
|
getVerifyDetail() {
|
this.$u.api.verifyDetail().then(res => {
|
uni.hideLoading()
|
if (res.code === 200) {
|
this.detailData = res.data
|
this.hasApprovedOfficial = res.data.hasApprovedOfficial === true
|
console.log(res.data)
|
this.setStatusType(res.data.auditStatus)
|
this.formatBasicInfo(res.data)
|
this.formatVehicleInfo(res.data)
|
this.formatImages(res.data)
|
this.getCategoryList(res.data.carType)
|
}
|
})
|
},
|
|
getCategoryList(carType) {
|
this.$u.api.getCategoryList({ type: 1 }).then(res => {
|
if (res.code === 200) {
|
this.carTypeList = res.data
|
if (carType) {
|
const selectedCarType = this.carTypeList.find(item => item.id === carType)
|
this.needLicense = selectedCarType && selectedCarType.otherField === '1'
|
}
|
}
|
})
|
},
|
setStatusType(auditStatus) {
|
console.log(auditStatus)
|
const map = { 0: 'review', 1: 'approved', 2: 'rejected', 3: 'approved' }
|
this.statusType = map[auditStatus] || 'review'
|
},
|
getMaritalStatusText(status) {
|
const map = { 0: '未婚', 1: '已婚', 2: '离异', 3: '丧偶' }
|
return map[status] || '未知'
|
},
|
formatBasicInfo(data) {
|
this.basicInfo = [
|
{ label: '注册手机号', value: data.telephone || '' },
|
{ label: '司机姓名', value: data.name || '' },
|
{ label: '婚姻状况', value: this.getMaritalStatusText(data.maritalStatus) },
|
{ label: '居住城市', value: [data.provinceName, data.cityName, data.districtName].filter(Boolean).join('/') || '' },
|
{ label: '详细地址', value: data.livePlace || '' },
|
{ label: '支付宝账号', value: data.aliAccount || '' },
|
{ label: '支付宝姓名', value: data.aliName || '' },
|
{ label: '身份证号', value: data.idcard || '' }
|
]
|
},
|
formatVehicleInfo(data) {
|
const formatDate = (dateStr) => {
|
if (!dateStr) return ''
|
const date = dateStr.split(' ')[0]
|
const [year, month, day] = date.split('-')
|
return `${year}年${month}月${day}日`
|
}
|
const startDate = formatDate(data.cardStartDate)
|
const endDate = formatDate(data.cardEndDate)
|
this.vehicleInfo = [
|
{ label: '车牌号', value: data.carCode || '' },
|
{ label: '车辆类型', value: data.carTypeName || '' },
|
{ label: '车辆颜色', value: data.carColor || '' },
|
{ label: '驾驶证有效期', value: startDate && endDate ? `${startDate}至${endDate}` : '' }
|
]
|
},
|
previewImage(current) {
|
uni.previewImage({
|
current: current,
|
urls: [...this.idcardImgs, ...this.carImgs, ...this.licenseImgs, ...this.otherImgs]
|
})
|
},
|
goRecertify() {
|
uni.navigateTo({
|
url: '/pages/driver-certification/driver-certification'
|
})
|
},
|
formatImages(data) {
|
this.idcardImgs = [data.idcardImg, data.idcardImgBack].filter(Boolean).map(item => data.imgPrefix + item)
|
this.carImgs = data.carImgList.map(item => data.imgPrefix + item.fileurl)
|
this.licenseImgs = data.licenseImgList.map(item => data.imgPrefix + item.fileurl)
|
this.otherImgs = data.otherImgList.map(item => data.imgPrefix + item.fileurl)
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.cert-details-page {
|
background: #ffffff;
|
|
&__status-card {
|
width: 100%;
|
height: 248rpx;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
flex-direction: column;
|
background: linear-gradient(180deg, #fff3e7 0%, #fff7f0 100%);
|
text-align: center;
|
|
&--approved {
|
background: linear-gradient(180deg, #ecfff3 0%, #f5fff9 100%);
|
}
|
|
&--rejected {
|
background: linear-gradient(180deg, #fff1f1 0%, #fff7f7 100%);
|
}
|
}
|
|
&__status-head {
|
display: flex;
|
justify-content: center;
|
align-items: center;
|
gap: 12rpx;
|
}
|
|
&__status-icon {
|
width: 60rpx;
|
height: 60rpx;
|
flex-shrink: 0;
|
}
|
|
&__status-title {
|
font-weight: 600;
|
font-size: 40rpx;
|
color: #FA8010;
|
|
&--approved {
|
color: #18c86d;
|
}
|
|
&--rejected {
|
color: #ff2f2f;
|
}
|
}
|
|
&__status-desc {
|
display: block;
|
margin-top: 14rpx;
|
font-weight: 400;
|
font-size: 28rpx;
|
color: #333333;
|
}
|
|
&__section {
|
padding: 24rpx 30rpx;
|
box-sizing: border-box;
|
|
&--last {
|
padding-bottom: calc(env(safe-area-inset-bottom) + 28rpx);
|
}
|
}
|
|
&__section-title {
|
display: block;
|
font-weight: 600;
|
font-size: 36rpx;
|
color: #222222;
|
}
|
|
&__info-list {
|
margin-top: 14rpx;
|
}
|
|
&__info-item {
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
gap: 20rpx;
|
padding: 30rpx 0;
|
box-sizing: border-box;
|
border-bottom: 1rpx solid #E5E5E5;
|
}
|
|
&__info-label {
|
font-weight: 400;
|
font-size: 30rpx;
|
color: #777777;
|
flex-shrink: 0;
|
margin-right: 30rpx;
|
}
|
|
&__info-value {
|
font-weight: 400;
|
font-size: 30rpx;
|
color: #222222;
|
text-align: right;
|
}
|
|
&__upload-group {
|
padding: 30rpx 0;
|
box-sizing: border-box;
|
border-bottom: 1rpx solid #E5E5E5;
|
}
|
|
&__upload-title {
|
display: block;
|
font-weight: 400;
|
font-size: 30rpx;
|
color: #777777;
|
}
|
|
&__upload-list {
|
display: flex;
|
flex-wrap: wrap;
|
gap: 20rpx;
|
margin-top: 30rpx;
|
|
&--single {
|
justify-content: flex-start;
|
}
|
}
|
|
&__upload-card {
|
flex: 1;
|
height: 216rpx;
|
border-radius: 10rpx;
|
overflow: hidden;
|
background: #f7f8fa;
|
border: 1rpx solid #eef1f5;
|
|
&--license {
|
height: 124rpx;
|
}
|
}
|
|
&__upload-img {
|
width: 144rpx;
|
height: 144rpx;
|
background-color: #f7f8fa;
|
border-radius: 10rpx;
|
overflow: hidden;
|
}
|
|
&__upload-image {
|
width: 100%;
|
height: 100%;
|
}
|
|
&__id-avatar {
|
width: 36rpx;
|
height: 42rpx;
|
margin-left: auto;
|
margin-top: -34rpx;
|
border-radius: 8rpx;
|
background: linear-gradient(180deg, #ffd39a 0%, #ffc56d 100%);
|
}
|
|
&__id-emblem,
|
&__id-emblem-sub {
|
display: block;
|
font-size: 14rpx;
|
font-weight: 700;
|
color: #9b6e67;
|
}
|
|
&__id-emblem-sub {
|
margin-top: 6rpx;
|
letter-spacing: 2rpx;
|
}
|
|
&__car-photo {
|
position: relative;
|
width: 144rpx;
|
height: 144rpx;
|
background: linear-gradient(180deg, #f5f7fa 0%, #eff2f7 100%);
|
}
|
|
&__rebtn {
|
width: calc(100% - 60rpx);
|
height: 88rpx;
|
line-height: 88rpx;
|
background: #10B2FA;
|
color: #ffffff;
|
font-size: 32rpx;
|
border-radius: 44rpx;
|
border: none;
|
|
&::after {
|
border: none;
|
}
|
}
|
}
|
</style>
|