feat(login): 实现登录页面功能,包含手机号输入和验证码验证

This commit is contained in:
scout 2025-01-15 13:05:06 +08:00
parent 4d92cc13fc
commit 00188a9d48

View File

@ -1,16 +1,78 @@
<script setup> <script setup>
import { useRouter } from 'vue-router'; import { useRouter, useRoute } from 'vue-router';
import { useI18n } from 'vue-i18n'
import countryCode from '../countryRegion/data/index.js'
const router = useRouter(); const router = useRouter();
const route = useRoute();
const { locale } = useI18n()
definePageMeta({ definePageMeta({
layout: 'login', title: '登录',
i18n: 'login.title',
}) })
function goToPage() { function goToPage() {
router.push('/countryRegion'); router.push('/countryRegion');
} }
const phoneNum=ref('')
const code=ref('') const phoneNum = ref('')
const pane=ref(0) const code = ref('')
const pane = ref(0)
const showKeyboard = ref(true);
//
const getDefaultCountry = () => {
let defaultCode = 'CN' //
switch (locale.value) {
case 'zh-CN':
defaultCode = 'CN'
break
case 'zh-TW':
defaultCode = 'TW'
break
case 'ja-JP':
defaultCode = 'JP'
break
case 'en-US':
defaultCode = 'US'
break
}
const country = countryCode.find(c => c.code === defaultCode)
return {
zone: country.zone,
name: locale.value === 'zh-CN' ? country.cn :
locale.value === 'zh-TW' ? country.tw :
locale.value === 'ja-JP' ? country.ja :
country.en
}
}
const defaultCountry = getDefaultCountry()
//
const selectedZone = ref(route.query.zone || defaultCountry.zone)
const selectedCountry = ref(route.query.countryName || defaultCountry.name)
//
watch(locale, () => {
if (!route.query.zone) {
const newDefault = getDefaultCountry()
selectedZone.value = newDefault.zone
selectedCountry.value = newDefault.name
}
})
const getCode = () => {
pane.value = 1
}
const goBack = () => {
code.value = ''
pane.value = 0
}
const goLogin = () => {
router.push('/realAuth');
}
</script> </script>
<template> <template>
@ -18,19 +80,19 @@ const pane=ref(0)
<div class="w-full flex justify-center mb-[100px]"> <div class="w-full flex justify-center mb-[100px]">
<img class="h-[105px] w-[189px]" src="@/static/images/ghfggff.png" alt=""> <img class="h-[105px] w-[189px]" src="@/static/images/ghfggff.png" alt="">
</div> </div>
<div v-if="pane===0"> <div v-if="pane === 0">
<div class=""> <div class="">
<div class="w-full flex justify-between" @click="goToPage"> <div class="w-full flex justify-between" @click="goToPage">
<div class="text-[16px] text-[#000]"> <div class="text-[16px] text-[#000]">
中国大陆 {{ selectedCountry }}
</div> </div>
<div><van-icon color="#777" name="arrow" size="14" /></div> <div><van-icon color="#777" name="arrow" size="14" /></div>
</div> </div>
<div class="border-b-[1.7px] mt-[8px]"> <div class="border-b-[1.7px] mt-[8px]">
<van-field v-model="phoneNum" clearable placeholder="请输入手机号"> <van-field v-model="phoneNum" clearable :placeholder="$t('login.phonePlaceholder')">
<template #label> <template #label>
<div class="text-[16px] text-[#1A1A1A] flex align-center justify-start"> <div class="text-[16px] text-[#1A1A1A] flex align-center justify-start">
+86 +{{ selectedZone }}
</div> </div>
</template> </template>
</van-field> </van-field>
@ -38,39 +100,45 @@ const pane=ref(0)
<div /> <div />
</div> </div>
<div class="mt-[55px]"> <div class="mt-[55px]">
<van-button v-if="phoneNum" type="primary" block style="height: 48px" >获取验证码</van-button> <van-button v-if="phoneNum" type="primary" block style="height: 48px" @click="getCode">{{ $t('login.getCode')
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px" >获取验证码</van-button> }}</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('login.getCode')
}}</van-button>
</div> </div>
</div> </div>
<div v-else> <div v-else>
<div class="flex mb-[16px]"> <div class="flex mb-[16px]">
<div class="text-[16px] text-[#BDBDBD] mr-[10px]">已发送验证码至</div> <div class="text-[16px] text-[#BDBDBD] mr-[10px]">{{ $t('login.hasSendTo') }}</div>
<div class="text-[16px] text-[#000]">15834362333</div> <div class="text-[16px] text-[#000]">+{{ selectedZone }} {{ phoneNum }}</div>
</div> </div>
<van-password-input <van-password-input :value="code" :gutter="10" :mask="false" focused @focus="showKeyboard = true" />
:value="code" <van-number-keyboard v-model="code" :show="showKeyboard" @blur="showKeyboard = false" />
:gutter="10"
focused
/>
<div class="text-#2B53AC text-14px"> <div class="text-#2B53AC text-14px">
重新发送 {{ $t('login.reSend') }}
</div> </div>
<div class="mt-[17px]"> <div class="mt-[17px]">
<van-button v-if="code.length === 6" type="primary" block style="height: 48px" >登录</van-button> <van-button v-if="code.length === 6" type="primary" block style="height: 48px" @click="goLogin">{{
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px" >登录</van-button> $t('login.login')
}}</van-button>
<van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('login.login') }}</van-button>
</div>
<div class="mt-[17px]">
<van-button type="primary" @click="goBack" block style="height: 48px">{{ $t('login.back') }}</van-button>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
:deep(.van-cell.van-field){ :deep(.van-cell.van-field) {
padding-left: 0; padding-left: 0;
} }
:deep(.van-password-input){
:deep(.van-password-input) {
margin: 0; margin: 0;
} }
:deep(.van-password-input__item){
:deep(.van-password-input__item) {
border: 1px solid #E5E5E5; border: 1px solid #E5E5E5;
width: 41px; width: 41px;
height: 41px; height: 41px;