|
@@ -1,30 +1,66 @@
|
|
<!-- 快速登录/注册 -->
|
|
<!-- 快速登录/注册 -->
|
|
<template>
|
|
<template>
|
|
- <CtDialog
|
|
|
|
- :visible="openDialog"
|
|
|
|
- :widthType="2"
|
|
|
|
- :footer="false"
|
|
|
|
- titleClass="text-h6"
|
|
|
|
- title="快速登录"
|
|
|
|
- @close="openDialog = false"
|
|
|
|
- >
|
|
|
|
- <div class="my-5">
|
|
|
|
- <phoneFrom ref="phoneRef" @handleEnter="handleLogin"></phoneFrom>
|
|
|
|
- <v-btn :loading="loginLoading" color="primary" class="white--text mt-5" min-width="350" @click="handleLogin">
|
|
|
|
- {{ $t('login.loginOrRegister') }}
|
|
|
|
- </v-btn>
|
|
|
|
- <div class="text-center color-666 font-size-14 mt-3">未注册的手机号,验证后自动注册账号</div>
|
|
|
|
- </div>
|
|
|
|
- </CtDialog>
|
|
|
|
|
|
+ <div>
|
|
|
|
+ <CtDialog
|
|
|
|
+ :visible="openDialog"
|
|
|
|
+ :widthType="2"
|
|
|
|
+ :footer="false"
|
|
|
|
+ titleClass="text-h6"
|
|
|
|
+ title="快速登录"
|
|
|
|
+ @close="loginClose"
|
|
|
|
+ >
|
|
|
|
+ <div class="mb-5">
|
|
|
|
+ <!-- <phoneFrom ref="phoneRef" @handleEnter="handleLogin"></phoneFrom> -->
|
|
|
|
+ <!-- 个人登录 -->
|
|
|
|
+ <div class="login-tab">
|
|
|
|
+ <v-tabs v-model="tab" align-tabs="center" color="primary" class="mb-10">
|
|
|
|
+ <v-tab :value="2">账号</v-tab>
|
|
|
|
+ <v-tab :value="1">验证码</v-tab>
|
|
|
|
+ </v-tabs>
|
|
|
|
+ <v-window v-model="tab">
|
|
|
|
+ <!-- 验证码登录 -->
|
|
|
|
+ <v-window-item :value="1">
|
|
|
|
+ <phoneFrom ref="phoneRef" class="phoneClass" openVerify @handleEnter="handleLogin"></phoneFrom>
|
|
|
|
+ </v-window-item>
|
|
|
|
+ <!-- 账号密码登录 -->
|
|
|
|
+ <v-window-item :value="2">
|
|
|
|
+ <passwordFrom ref="passRef" @handleEnter="handleLogin"></passwordFrom>
|
|
|
|
+ </v-window-item>
|
|
|
|
+ </v-window>
|
|
|
|
+ </div>
|
|
|
|
+ <v-btn :loading="loginLoading" color="primary" class="white--text mt-5" min-width="350" @click="handleLogin">
|
|
|
|
+ {{ $t('login.loginOrRegister') }}
|
|
|
|
+ </v-btn>
|
|
|
|
+ <div class="login-tips mt-3 font-size-14">
|
|
|
|
+ <v-icon v-if="isAgree" size="18" color="primary" class="mr-2" @click="isAgree = !isAgree">mdi-check-circle</v-icon>
|
|
|
|
+ <v-icon v-else size="18" color="grey" class="mr-2" @click="isAgree = !isAgree">mdi-circle-outline</v-icon>
|
|
|
|
+ {{ $t('login.agreeLogin') }}
|
|
|
|
+ <span class="color" style="cursor: pointer;" @click="windowOpen('/userAgreement')"> [{{ $t('login.userAgreement') }}] </span>和
|
|
|
|
+ <span class="color" style="cursor: pointer;" @click="windowOpen('/privacyPolicy')">[{{ $t('login.privacyPolicy') }}]</span>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-if="tab === 1" class="text-center color-666 font-size-12 mt-1">未注册的手机号,验证后自动注册账号</div>
|
|
|
|
+ </div>
|
|
|
|
+ <Verify
|
|
|
|
+ ref="verify"
|
|
|
|
+ captchaType="blockPuzzle"
|
|
|
|
+ :imgSize="{ width: '400px', height: '200px' }"
|
|
|
|
+ mode="pop"
|
|
|
|
+ @success="verifySuccess"
|
|
|
|
+ />
|
|
|
|
+ </CtDialog>
|
|
|
|
+ </div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
defineOptions({name: 'dialog-login-common-page'})
|
|
defineOptions({name: 'dialog-login-common-page'})
|
|
import phoneFrom from '@/components/VerificationCode'
|
|
import phoneFrom from '@/components/VerificationCode'
|
|
|
|
+import passwordFrom from '@/views/login/components/passwordPage.vue'
|
|
import { useUserStore } from '@/store/user'; const userStore = useUserStore()
|
|
import { useUserStore } from '@/store/user'; const userStore = useUserStore()
|
|
import { nextTick, ref } from 'vue'
|
|
import { nextTick, ref } from 'vue'
|
|
|
|
+import Verify from '@/components/Verifition'
|
|
|
|
+import Snackbar from '@/plugins/snackbar'
|
|
|
|
|
|
-const emit = defineEmits(['loginSuccess'])
|
|
|
|
|
|
+const emit = defineEmits(['loginSuccess', 'close'])
|
|
|
|
|
|
const props = defineProps({
|
|
const props = defineProps({
|
|
// 是否需要退出后再登录,切换账号时使用
|
|
// 是否需要退出后再登录,切换账号时使用
|
|
@@ -39,26 +75,81 @@ nextTick(() => {
|
|
openDialog.value = true
|
|
openDialog.value = true
|
|
})
|
|
})
|
|
|
|
|
|
|
|
+const tab = ref(2) // 密码登录
|
|
|
|
+const isAgree = ref(false)
|
|
|
|
+const passRef = ref()
|
|
// 验证码登录
|
|
// 验证码登录
|
|
const phoneRef = ref()
|
|
const phoneRef = ref()
|
|
const loginLoading = ref(false)
|
|
const loginLoading = ref(false)
|
|
|
|
|
|
const handleLogin = async () => {
|
|
const handleLogin = async () => {
|
|
- const { valid } = await phoneRef.value.phoneForm.validate()
|
|
|
|
|
|
+ // const { valid } = await phoneRef.value.phoneForm.validate()
|
|
|
|
+ const { valid } = tab.value === 1 ? await phoneRef.value.phoneForm.validate() : await passRef.value.passwordForm.validate()
|
|
if (!valid) return
|
|
if (!valid) return
|
|
|
|
+ if (!isAgree.value) return Snackbar.warning('请阅读并勾选底部协议')
|
|
|
|
+ //
|
|
|
|
+ let params, api = ''
|
|
|
|
+ params = tab.value === 1 ? { ...phoneRef.value.loginData } : { ...passRef.value.loginData }
|
|
|
|
+ api = tab.value === 1 ? 'handleSmsLogin' : 'handlePasswordLogin'
|
|
|
|
+ if (!params.captchaVerification && captchaStr.value) params.captchaVerification = captchaStr.value
|
|
|
|
+ if (!params.captchaVerification) {
|
|
|
|
+ getCode() // 验证码组件
|
|
|
|
+ return
|
|
|
|
+ }
|
|
|
|
+ loginLoading.value = true
|
|
if (props.hasLogout) {
|
|
if (props.hasLogout) {
|
|
await userStore.userLogout(1)
|
|
await userStore.userLogout(1)
|
|
}
|
|
}
|
|
- loginLoading.value = true
|
|
|
|
try {
|
|
try {
|
|
- const params = { ...phoneRef.value.loginData, autoRegister: true } // autoRegister: 是否自动注册
|
|
|
|
- await userStore.handleSmsLogin(params)
|
|
|
|
|
|
+ // const params = { ...phoneRef.value.loginData, autoRegister: true } // autoRegister: 是否自动注册
|
|
|
|
+ // await userStore.handleSmsLogin(params)
|
|
|
|
+ await userStore[api](params)
|
|
emit('loginSuccess')
|
|
emit('loginSuccess')
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
|
+ captchaStr.value = '' // 清空人机验证
|
|
|
|
+ phoneRef.value && phoneRef.value.clearCaptcha() // 清空人机验证
|
|
console.error('error', error)
|
|
console.error('error', error)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+// 获取验证码
|
|
|
|
+const verify = ref()
|
|
|
|
+const getCode = async () => {
|
|
|
|
+ // 弹出验证码 // 已开启:则展示验证码;只有完成验证码的情况,才进行登录
|
|
|
|
+ verify.value.show()
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+const captchaStr = ref('')
|
|
|
|
+const verifySuccess = (params) => {
|
|
|
|
+ captchaStr.value = params.captchaVerification
|
|
|
|
+ handleLogin()
|
|
|
|
+}
|
|
|
|
+const loginClose = () => {
|
|
|
|
+ openDialog.value = false
|
|
|
|
+ emit('close')
|
|
|
|
+}
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
|
|
+.login-tips {
|
|
|
|
+ width: 100%;
|
|
|
|
+ font-size: 12px;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: center;
|
|
|
|
+ align-items: center;
|
|
|
|
+}
|
|
|
|
+.tips {
|
|
|
|
+ span:hover {
|
|
|
|
+ text-decoration: underline;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+// :deep(.v-window-item) {}
|
|
|
|
+:deep(.mask) {
|
|
|
|
+ width: 100vw;
|
|
|
|
+ transform: translate(calc(-50% + 200px), calc(-50% + 223px));
|
|
|
|
+}
|
|
|
|
+.mask {
|
|
|
|
+ width: 100vw;
|
|
|
|
+ transform: translate(calc(-50% + 200px), calc(-50% + 223px));
|
|
|
|
+}
|
|
</style>
|
|
</style>
|