<script setup> import { useRouter, useRoute } from 'vue-router'; import { useI18n } from 'vue-i18n' import countryCode from '../countryRegion/data/index.js' import {senCode, userLogin} from "@/api/auth/index.js"; import {authStore} from "@/stores/auth/index.js"; import {message} from '@/components/x-message/useMessage.js' const {userInfo,token}= authStore() const router = useRouter(); const route = useRoute(); const { locale } = useI18n() definePageMeta({ title: '登录', i18n: 'login.title', }) const loadingRef=ref({ loading1:false, loading2:false, }) const isExist=ref(false)//帐号是否存在 true存在 const isReal=ref(false) //isReal 是否实名过 function goToPage() { router.push('/countryRegion'); } const interval=ref(null) const startCountdown=()=> { if (interval.value){ clearInterval(interval.value); } countdown.value = 60; interval.value = setInterval(() => { if (countdown.value > 0) { countdown.value--; } else { clearInterval(interval.value); } }, 1000); } const countdown = ref(0); const phoneNum = ref('17630920520') const code = ref('123789') const pane = ref(0) const showKeyboard = ref(false); // 根据语言获取默认国家 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 vanSwipeRef=ref(null) const getCode =async () => { loadingRef.value.loading1=true const res=await senCode({ telNum:phoneNum.value, zone:selectedZone.value }) loadingRef.value.loading1=false if (res.status===0){ } pane.value = 1 vanSwipeRef.value?.swipeTo(pane.value) showKeyboard.value=true startCountdown(); /* pane.value = 1 vanSwipeRef.value?.swipeTo(pane.value) showKeyboard.value=true startCountdown();*/ } const goBack = () => { code.value = '' pane.value = 0 vanSwipeRef.value?.swipeTo(pane.value) } const goLogin =async () => { loadingRef.value.loading2=true const res=await userLogin({ telNum:phoneNum.value, zone:selectedZone.value, code:code.value }) if (res.status===0){ userInfo.value=res.data.accountInfo token.value=res.data.token if (!res.data.isReal){ await router.push('/realAuth'); }else { await router.push('/'); } } loadingRef.value.loading2=false } </script> <template> <div class="h-screen-nav w-[100vw] bg-[url('@/static/images/asdfsdd.png')] bg-cover px-[31px] pt-[86px]"> <div class="w-full flex justify-center mb-[100px]"> <img class="h-[105px] w-[189px]" src="@/static/images/ghfggff.png" alt=""> </div> <van-swipe ref="vanSwipeRef" :show-indicators="false" :touchable="false" :lazy-render="true" :loop="false"> <van-swipe-item > <div v-show="pane===0"> <div class=""> <div class="w-full flex justify-between" @click="goToPage"> <div class="text-[16px] text-[#000]"> {{ selectedCountry }} </div> <div><van-icon color="#777" name="arrow" size="14" /></div> </div> <div class="border-b-[1.7px] mt-[8px]"> <van-field v-model="phoneNum" clearable :placeholder="$t('login.phonePlaceholder')"> <template #label> <div class="text-[16px] text-[#1A1A1A] flex align-center justify-start"> +{{ selectedZone }} </div> </template> </van-field> </div> <div /> </div> <div class="mt-[55px]"> <van-button :loading="loadingRef.loading1" v-if="phoneNum" :loading-text="$t('login.getCode')" color="#2B53AC" block style="height: 48px" @click="getCode">{{ $t('login.getCode') }}</van-button> <van-button v-else type="primary" color="#D3D3D3" block style="height: 48px">{{ $t('login.getCode') }}</van-button> </div> </div> </van-swipe-item> <van-swipe-item> <div v-show="pane===1"> <div class="flex mb-[16px]"> <div class="text-[16px] text-[#BDBDBD] mr-[10px]">{{ $t('login.hasSendTo') }}</div> <div class="text-[16px] text-[#000]">+{{ selectedZone }} {{ phoneNum }}</div> </div> <van-password-input :value="code" :gutter="10" :mask="false" focused @focus="showKeyboard = true" /> <div :class="`${countdown>0?'text-#BDBDBD':'text-#2B53AC'} text-14px`"> {{ $t('login.reSend') }}<span v-if="countdown>0">({{countdown}})</span> </div> <div class="mt-[17px]"> <van-button v-if="code.length === 6" type="primary" block :loading="loadingRef.loading2" :loading-text="$t('login.login')" style="height: 48px" @click="goLogin">{{ $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> </van-swipe-item> </van-swipe> <van-number-keyboard v-model="code" :show="showKeyboard" @blur="showKeyboard = false" /> </div> </template> <style scoped lang="scss"> :deep(.van-cell.van-field) { padding-left: 0; } :deep(.van-password-input) { margin: 0; } :deep(.van-password-input__item) { border: 1px solid #E5E5E5; width: 41px; height: 41px; } </style>