| 
						 | 
						- <template>
 - 	<view class="containers po-r">
 - 		<image src="" mode="" class="mainBg"></image>
 - 		
 - 		<view class="w-100 po-a content">
 - 			
 - 			<stepProgress :step="1"></stepProgress>
 - 
 - 			<view class="bg-fff mt22 form ">
 - 				<view class="title fw700 size-30 flex-rowl">
 - 					基本信息
 - 				</view>
 - 				<dForm ref="formRef" :list="state.list" labelWidth="220rpx" :isFooter="false" @input="onFormInput"></dForm>
 - 			</view>
 - 			
 - 			<view class="license__view" v-if="form.isHave">
 - 				<view class="license">
 - 					<up-checkbox-group 
 - 						v-model="licenseData.selected" 
 - 						shape="circle"
 - 						activeColor="#FFBF60"
 - 						labelColor="#000000"
 - 						labelSize="26rpx"
 - 					>
 - 						<view class="license-options">
 - 							<up-checkbox
 - 								v-for="item in licenseOptions"
 - 								:key="`license-${item.id}`"
 - 								:label="item.title"
 - 								:name="item.id"
 - 							>
 - 							</up-checkbox>
 - 						</view>
 - 					</up-checkbox-group>
 - 					<view class="tips">
 - 						{{ configList.pet_news.paramValueText }}
 - 					</view>
 - 					<up-upload
 - 						:fileList="licenseData.fileList"
 - 						@afterRead="afterRead"
 - 						@delete="deletePic"
 - 						multiple
 - 					>
 - 						<image src="../static/list/icon-upload.png" style="width: 144rpx;height: 144rpx;"></image>
 - 					</up-upload>
 - 				</view>							
 - 			</view>
 - 
 - 			<view class="bg-fff mt22 form bt120">
 - 				<view class="title fw700 size-30 flex-rowl">
 - 					个人宠物类型
 - 				</view>
 - 				<view class="flex-between wrap mt32">
 - 
 - 					<view class="type" v-for="item in petTypeOptions" :key="`petType-${item.id}`">
 - 						<image :src="item.imageNo" mode="widthFix" @click="onSelectPetType(item.id)"></image>
 - 						<template v-if="petType === item.id">
 - 							<image class="active" :src="item.image" mode="widthFix"></image>
 - 							<view class="active-icon">
 - 								<up-icon name="checkmark-circle" color="#FFBF60" size="32rpx"></up-icon>
 - 							</view>
 - 						</template>
 - 					</view>
 - 				</view>
 - 			</view>
 - 
 - 			<view class="footer-btn" @click="toNext">
 - 				<view class="btn">
 - 					下一步
 - 				</view>
 - 			</view>
 - 		</view>
 - 
 - 	</view>
 - </template>
 - 
 - <script setup>
 - 	import { ref, reactive, computed } from "vue";
 - 	import { useStore } from 'vuex'
 - 	import { onLoad } from '@dcloudio/uni-app'
 - 	import { ossUpload } from '@/utils/oss-upload/oss/index.js'
 - 	import { getLicenseList } from '@/api/examination'
 - 	import { insertUser, udpateUser, getUserOne } from '@/api/userTeacher'
 - 
 - 	import dForm from "@/components/dForm/index.vue"
 - 	import stepProgress from '../components/stepProgress.vue';
 - 
 - 	const store = useStore()
 - 
 - 	const configList = computed(() => {
 - 		return store.getters.configList
 - 	})
 - 
 - 	const userId = computed(() => {
 - 		return store.state.user.userInfo.userId
 - 	})
 - 
 - 	const id = ref(null)
 - 
 - 	const state = reactive({
 - 		list: [{
 - 				type: "input",
 - 				label: "姓名",
 - 				key: "name",
 - 				placeholder: "请输入您的真实姓名",
 - 			},
 - 			{
 - 				type: "input",
 - 				label: "身份证号",
 - 				key: "idCard",
 - 				placeholder: "请输入您的真实身份证号",
 - 			},
 - 			{
 - 				type: "radio",
 - 				label: "性别",
 - 				key: "sex",
 - 				options: [{
 - 						name: "男",
 - 						value: 0,
 - 					},
 - 					{
 - 						name: "女",
 - 						value: 1,
 - 					}
 - 				]
 - 			},
 - 			{
 - 				type: "input",
 - 				label: "年龄",
 - 				key: "age",
 - 				placeholder: "请输入您的年龄",
 - 			},
 - 			{
 - 				type: "input",
 - 				label: "手机号",
 - 				key: "phone",
 - 				placeholder: "请输入您的手机号",
 - 			},
 - 			{
 - 				type: "input",
 - 				label: "养宠经验",
 - 				key: "experience",
 - 				placeholder: "请输入您的养宠年限",
 - 				unit: "年"
 - 			},
 - 			{
 - 				type: "radio",
 - 				label: "是否有专业执照",
 - 				key: "isHave",
 - 				placeholder: "请选择",
 - 				options: [{
 - 					name: "是",
 - 					value: 1,
 - 				}, {
 - 					name: "没有",
 - 					value: 0,
 - 				}]
 - 			},
 - 		]
 - 	})
 - 
 - 	const formRef = ref()
 - 	const form = ref({})
 - 	const onFormInput = (e) => {
 - 		form.value = e
 - 	}
 - 
 - 	const fetchUserInfo = async () => {
 - 		try {
 - 			const { userTelephone } = store.state.user.userInfo
 - 			
 - 			const data = await getUserOne(userId.value)
 - 
 - 			if (data) {
 - 				const {
 - 					id: _id,
 - 					status,
 - 					name,
 - 					idCard,
 - 					sex,
 - 					age,
 - 					phone,
 - 					experience,
 - 					isHave,
 - 					license,
 - 					images,
 - 					petType: _petType,
 - 				} = data
 - 
 - 				if ([1,2].includes(status)) { // status: 0-审核中 1-通过 2-不通过
 - 					uni.navigateTo({
 - 						url: `/otherPages/authentication/examination/trainCompleted/index?status=${status}`
 - 					})
 - 					return
 - 				}
 - 
 - 				id.value = _id
 - 
 - 				formRef.value.setData({
 - 					name,
 - 					idCard,
 - 					sex,
 - 					age,
 - 					phone: phone || userTelephone,
 - 					experience,
 - 					isHave,
 - 				})
 - 
 - 				licenseData.selected = license?.split?.(';').map(str => parseInt(str)) || []
 - 				licenseData.fileList = images?.split?.(';').map(url => ({ url })) || []
 - 
 - 				petType.value = _petType
 - 			} else {
 - 				formRef.value.setData({
 - 					phone: userTelephone,
 - 				})
 - 			}
 - 
 - 			
 - 			store.dispatch('fetchPetTypeOptions')
 - 			fetchLicenseOptions()
 - 			
 - 		} catch (err) {
 - 			console.log('--err', err)
 - 		}
 - 	}
 - 
 - 	const licenseData = reactive({
 - 		selected: [],
 - 		fileList: []
 - 	})
 - 	const licenseOptions = ref([])
 - 	const fetchLicenseOptions = async () => {
 - 		try {
 - 			licenseOptions.value = await getLicenseList()
 - 		} catch (err) {
 - 
 - 		}
 - 	}
 - 	const afterRead = (event) => {
 - 		event.file.forEach(n => {
 - 			ossUpload(n.url)
 - 				.then(url => {
 - 					licenseData.fileList.push({
 - 						url
 - 					})
 - 				})
 - 		})
 - 	};
 - 	const deletePic = (event) => {
 - 		licenseData.fileList.splice(event.index, 1);
 - 	};
 - 
 - 	const petType = ref()
 - 	const petTypeOptions = computed(() => {
 - 		return store.getters.petTypeOptions
 - 	})
 - 	const onSelectPetType = (type) => {
 - 		petType.value = type
 - 	}
 - 
 - 	const toNext = async () => {
 - 		try {
 - 			const {
 - 				name,
 - 				idCard,
 - 				sex,
 - 				age,
 - 				phone,
 - 				experience,
 - 				isHave,
 - 			} = form.value
 - 
 - 			const data = {
 - 				userId: userId.value,
 - 				name,
 - 				idCard,
 - 				sex,
 - 				age,
 - 				phone,
 - 				experience,
 - 				isHave,
 - 				petType: petType.value,
 - 			}
 - 
 - 			if (isHave) {
 - 				const { selected, fileList } = licenseData
 - 
 - 				data.license = selected.join(';')
 - 				data.images = fileList.map(item => item.url).join(';')
 - 			}
 - 
 - 			if (id.value) {
 - 				data.id = id.value
 - 				await udpateUser(data)
 - 			} else {
 - 				await insertUser(data)
 - 			}
 - 
 - 			uni.navigateTo({
 - 				url: `/otherPages/authentication/examination/start?petType=${petType.value}`
 - 			})
 - 		} catch (err) {
 - 			
 - 		}
 - 	}
 - 
 - 	onLoad(() => {
 - 		fetchUserInfo()
 -     store.dispatch('fetchPetTypeOptions')
 - 	})
 - </script>
 - 
 - <style lang="scss" scoped>
 - 	.bt120 {
 - 		margin-bottom: 120rpx;
 - 		width: 716rpx;
 - 		box-sizing: border-box;
 - 	}
 - 
 - 	.footer-btn {
 - 		width: 100vw;
 - 		height: 144rpx;
 - 		background-color: #fff;
 - 		display: flex;
 - 		justify-content: center;
 - 		position: fixed;
 - 		bottom: 0;
 - 		left: 0;
 - 		align-items: center;
 - 
 - 		.btn {
 - 			font-size: 30rpx;
 - 			color: #fff;
 - 			display: flex;
 - 			justify-content: center;
 - 			align-items: center;
 - 			width: 574rpx;
 - 			height: 94rpx;
 - 			border-radius: 94rpx;
 - 			background-color: #FFBF60;
 - 		}
 - 	}
 - 
 - 	.type {
 - 		width: 190rpx;
 - 		margin-bottom: 74rpx;
 - 		position: relative;
 - 
 - 		image {
 - 			width: 100%;
 - 		}
 - 
 - 		.active {
 - 			position: absolute;
 - 			top: 0;
 - 			left: 0;
 - 			
 -       &-icon {
 -   			position: absolute;
 -         top: 14rpx;
 -         right: 18rpx;
 -       }
 - 		}
 - 	}
 - 
 - 	.form {
 - 		padding: 40rpx 32rpx;
 - 		box-sizing: border-box;
 - 		width: 716rpx;
 - 	}
 - 
 - 	.title {
 - 		&::before {
 - 			content: "";
 - 			display: block;
 - 			width: 9rpx;
 - 			height: 33rpx;
 - 			background-color: #FFBF60;
 - 			margin-right: 7rpx;
 - 		}
 - 	}
 - 
 - 	.mb6 {
 - 		margin-bottom: 6rpx;
 - 	}
 - 
 - 	.containers {
 - 
 - 
 - 		.mainBg {
 - 			width: 100vw;
 - 			height: 442rpx;
 - 			background-image: linear-gradient(to bottom, #FFBF60, #f5f5f5);
 - 		}
 - 
 - 		.content {
 - 			top: 0;
 - 			left: 0;
 - 			padding: 16rpx;
 - 
 - 		}
 - 	}
 - 
 - 	.license__view {
 - 		width: 716rpx;
 - 		padding-bottom: 40rpx;
 - 		box-sizing: border-box;
 - 		background-color: #FFFFFF;
 - 
 - 		.license {
 - 			width: 100%;
 - 			padding: 13rpx 16rpx;
 - 			box-sizing: border-box;
 - 			background-color: #FFFCF1;
 - 
 - 			&-options {
 - 				display: grid;
 - 				grid-template-columns: repeat(2, 1fr);
 - 			}
 - 		}
 - 
 - 		.tips {
 - 			margin: 22rpx 0 24rpx 0;
 - 			color: #FFBF60;
 - 			font-size: 22rpx;
 - 			width: 100%;
 - 			word-break: break-all;
 - 		}
 - 	}
 - </style>
 
 
  |