volunteer-4/src/login-sub/inviteCode.vue

222 lines
6.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<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>