222 lines
6.2 KiB
Vue
222 lines
6.2 KiB
Vue
<route lang="json5" type="page">
|
||
{
|
||
style: {
|
||
navigationBarTitleText: '基本信息',
|
||
},
|
||
}
|
||
</route>
|
||
|
||
<template>
|
||
<view class="flex flex-col bg-[#f8f8f8] h-screen">
|
||
<view class="flex-1 pb-safe">
|
||
<view class="mx-[32rpx] mt-[24rpx] bg-[#fff] rounded-[20rpx]">
|
||
<form>
|
||
<view
|
||
class="flex items-center justify-between h-[100rpx] mx-[24rpx] border-b-[2rpx] border-b-solid border-[#F3F3F3]"
|
||
>
|
||
<view class="flex items-center">
|
||
<view class="text-[28rpx] text-[#000] font-[500]">姓名</view>
|
||
<view class="text-[#FF5151] font-[500] leading-[1] h-[18rpx] ml-[8rpx]">*</view>
|
||
</view>
|
||
<view>
|
||
<input
|
||
v-model="formData.name"
|
||
placeholder="请输入姓名"
|
||
confirm-type="done"
|
||
placeholder-style="color:#BABABA;font-size:28rpx;text-align:right;"
|
||
class="text-right w-[140rpx]"
|
||
/>
|
||
</view>
|
||
</view>
|
||
|
||
<view
|
||
class="flex items-center justify-between h-[100rpx] mx-[24rpx] border-b-[2rpx] border-b-solid border-[#F3F3F3]"
|
||
>
|
||
<view class="flex items-center">
|
||
<view class="text-[28rpx] text-[#000] font-[500]">性别</view>
|
||
<view class="text-[#FF5151] font-[500] leading-[1] h-[18rpx] ml-[8rpx]">*</view>
|
||
</view>
|
||
<view>
|
||
<RadioGroup v-model="formData.gender" class="custom-radio-group">
|
||
<Radio :name="1" class="custom-radio">男</Radio>
|
||
<Radio :name="2" class="custom-radio">女</Radio>
|
||
</RadioGroup>
|
||
</view>
|
||
</view>
|
||
|
||
<view
|
||
class="flex items-center justify-between h-[100rpx] mx-[24rpx] border-b-[2rpx] border-b-solid border-[#F3F3F3]"
|
||
>
|
||
<view class="flex items-center">
|
||
<view class="text-[28rpx] text-[#000] font-[500]">手机号</view>
|
||
<view class="text-[#FF5151] font-[500] leading-[1] h-[18rpx] ml-[8rpx]">*</view>
|
||
</view>
|
||
<view class="text-[#333] text-[28rpx]">{{ userStore.userInfo.mobile }}</view>
|
||
</view>
|
||
|
||
<view class="flex items-center justify-between h-[100rpx] mx-[24rpx]">
|
||
<view class="flex items-center">
|
||
<view class="text-[28rpx] text-[#000] font-[500]">就读学校</view>
|
||
</view>
|
||
<view class="">
|
||
<input
|
||
v-model="formData.school"
|
||
placeholder="请输入您的就读学校"
|
||
confirm-type="done"
|
||
placeholder-style="color:#BABABA;font-size:28rpx;text-align:right;"
|
||
class="text-right w-[252rpx]"
|
||
/>
|
||
</view>
|
||
</view>
|
||
</form>
|
||
</view>
|
||
|
||
<view class="p-[24rpx] bg-[#fff] mx-[32rpx] mt-[24rpx] rounded-[20rpx]">
|
||
<input
|
||
v-model="formData.invitedCode"
|
||
placeholder="邀请码"
|
||
confirm-type="done"
|
||
:maxlength="4"
|
||
placeholder-style="color:#999;font-size:28rpx;"
|
||
class="text-center h-[86rpx] bg-[#F5F5F5] rounded-[16rpx]"
|
||
@input="handleInviteCode"
|
||
/>
|
||
|
||
<view class="text-[#666] text-[24rpx] text-center mt-[10rpx]">
|
||
输入邀请码,获取免费AI报告解读
|
||
</view>
|
||
</view>
|
||
|
||
<button
|
||
class="w-[560rpx]! h-[88rpx]! rounded-[44rpx] font-500 text-[32rpx] text-white! flex items-center justify-center mt-[80rpx]"
|
||
:class="'bg-[#1580FF]!'"
|
||
@click="handleSubmit"
|
||
>
|
||
提交
|
||
</button>
|
||
</view>
|
||
</view>
|
||
</template>
|
||
|
||
<script lang="ts" setup>
|
||
import Radio from './components/radio-group/Radio.vue'
|
||
import RadioGroup from './components/radio-group/RadioGroup.vue'
|
||
import { useUserStore } from '@/store'
|
||
import { savePerfectInfo, verifyInviteCode } from '@/service/index/api'
|
||
|
||
const userStore = useUserStore()
|
||
|
||
const formData = ref({
|
||
name: userStore.userInfo.nickname,
|
||
gender: userStore.userInfo.sex || 1,
|
||
school: userStore.userInfo.estimatedAchievement.schoolName,
|
||
invitedCode: userStore.userInfo.estimatedAchievement.vipCode,
|
||
})
|
||
|
||
const invitedCodeFlag = ref(false)
|
||
|
||
const handleSubmit = () => {
|
||
if (!formData.value.name) {
|
||
uni.showToast({
|
||
title: '请输入昵称',
|
||
icon: 'error',
|
||
mask: true,
|
||
})
|
||
return
|
||
}
|
||
|
||
savePerfectInfo({
|
||
nickName: formData.value.name,
|
||
schoolName: formData.value.school,
|
||
sex: formData.value.gender,
|
||
inviteCode: formData.value.invitedCode,
|
||
}).then((resp) => {
|
||
if (resp.code === 200) {
|
||
userStore.setEstimatedAchievement({ init: true })
|
||
uni.switchTab({
|
||
url: '/pages/home/index/index',
|
||
})
|
||
} else {
|
||
uni.showToast({
|
||
title: resp.message,
|
||
icon: 'error',
|
||
mask: true,
|
||
})
|
||
}
|
||
})
|
||
}
|
||
|
||
const handleInviteCode = () => {
|
||
if (formData.value.invitedCode.length === 4) {
|
||
verifyInviteCode({ code: formData.value.invitedCode }).then((resp) => {
|
||
if (resp.code === 200) {
|
||
invitedCodeFlag.value = resp.result as boolean
|
||
}
|
||
})
|
||
} else {
|
||
invitedCodeFlag.value = false
|
||
}
|
||
}
|
||
const handleLogout = () => {
|
||
userStore.clearUserInfo()
|
||
uni.switchTab({
|
||
url: '/pages/home/index/index',
|
||
})
|
||
}
|
||
|
||
const instance = getCurrentInstance()
|
||
onUnload(() => {
|
||
if (!userStore.userInfo.estimatedAchievement.init) {
|
||
handleLogout()
|
||
}
|
||
}, instance)
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
:deep(.custom-radio-group) {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 20rpx;
|
||
background-color: #fff;
|
||
justify-content: center;
|
||
}
|
||
|
||
:deep(.custom-radio) {
|
||
width: 108rpx;
|
||
height: 60rpx;
|
||
background-color: #fff;
|
||
border-radius: 32rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
border: 2rpx solid #ccc;
|
||
color: #999;
|
||
|
||
.radio-wrapper {
|
||
padding: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
}
|
||
|
||
.radio {
|
||
display: none;
|
||
}
|
||
|
||
.radio-label {
|
||
margin-left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
}
|
||
|
||
.radio-label--active {
|
||
background-color: rgba(21, 128, 255, 0.1) !important;
|
||
border-color: #1580ff !important;
|
||
border: 2rpx solid #1580ff;
|
||
border-radius: 32rpx;
|
||
}
|
||
}
|
||
</style>
|