|
|
@@ -0,0 +1,121 @@
|
|
|
+<template lang="">
|
|
|
+ <div id="verify-root">
|
|
|
+ <div class="verify" style="border-radius: 8px; box-shadow: var(--el-box-shadow-lighter);">
|
|
|
+ <el-row >
|
|
|
+ <el-col >
|
|
|
+ <el-text type="success" size="large" tag="b">扫码成功</el-text>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col>
|
|
|
+ <el-text>正在跳转到</el-text>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row>
|
|
|
+ <el-col>
|
|
|
+ <!-- 使用 v-if 控制链接的显示,只有在登录成功后才显示 -->
|
|
|
+ <el-link v-if="isLoggedIn" type="primary" @click="navigateToAccount">我的主页</el-link>
|
|
|
+ <!-- 添加加载状态的文本 -->
|
|
|
+ <el-text v-else>{{info}}...</el-text>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, onMounted, nextTick } from 'vue';
|
|
|
+import axios from 'axios'; // 确保已经安装了axios
|
|
|
+
|
|
|
+const isLoggedIn = ref(false);
|
|
|
+const info = ref('正在验证登录信息...')
|
|
|
+async function tryLoginWithUrls(apiUrls, code, state, index = 0) {
|
|
|
+ if (index >= apiUrls.length) {
|
|
|
+ // 所有URL都尝试过了,抛出错误或处理失败
|
|
|
+ throw new Error('所有服务器登录尝试均失败');
|
|
|
+ }
|
|
|
+
|
|
|
+ const apiUrl = apiUrls[index];
|
|
|
+ try {
|
|
|
+ const response = await axios.post(`${apiUrl}/login`, { code, state });
|
|
|
+ if (response.data.success) {
|
|
|
+ isLoggedIn.value = true;
|
|
|
+ await nextTick();
|
|
|
+ await nextTick();
|
|
|
+ navigateToAccount();
|
|
|
+ } else {
|
|
|
+ // 可以选择在这里再次尝试,或者直接失败
|
|
|
+ throw new Error('登录失败: 无效的响应数据');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error(`尝试登录服务器${apiUrl}失败:`, error);
|
|
|
+ // 尝试下一个URL
|
|
|
+ return tryLoginWithUrls(apiUrls, code, state, index + 1);
|
|
|
+ }
|
|
|
+}
|
|
|
+onMounted(async () => {
|
|
|
+ try {
|
|
|
+ const queryString = window.location.search;
|
|
|
+ const urlParams = new URLSearchParams(queryString);
|
|
|
+ const code = urlParams.get('code');
|
|
|
+ const state = urlParams.get('state');
|
|
|
+
|
|
|
+ const apiUrls = import.meta.env.VITE_API_URLS.split(',');
|
|
|
+ await tryLoginWithUrls(apiUrls, code, state);
|
|
|
+ } catch (error) {
|
|
|
+ info.value = '登录失败:' + error.message;
|
|
|
+ console.error('最终登录失败:', error);
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+// 跳转函数
|
|
|
+const navigateToAccount = () => {
|
|
|
+ window.location.href = '/account';
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="css" scoped>
|
|
|
+#verify-root{
|
|
|
+ display: flex;
|
|
|
+ justify-content: center; /* 控制水平居中 */
|
|
|
+ align-items: center; /* 控制垂直居中 */
|
|
|
+ flex-direction: column; /* 确保子元素按列排列,这对于多行文本或元素很重要 */
|
|
|
+ /* background-color: rgb(240, 240, 242);; */
|
|
|
+ background-color: rgb(233,241,253);
|
|
|
+ height: 100vh;
|
|
|
+}
|
|
|
+.el-col{
|
|
|
+ display: flex;
|
|
|
+ justify-content: center; /* 控制水平居中 */
|
|
|
+ align-items: center; /* 控制垂直居中 */
|
|
|
+ flex-direction: column; /* 确保子元素按列排列,这对于多行文本或元素很重要 */
|
|
|
+
|
|
|
+}
|
|
|
+.verify {
|
|
|
+ display: flex; /* 添加此行 */
|
|
|
+ flex-direction: column; /* 添加此行 */
|
|
|
+ justify-content: center; /* 添加此行以垂直居中 */
|
|
|
+ align-items: center; /* 如果需要,也可以水平居中 */
|
|
|
+ height: 60%; /* 使得容器占据整个视口的高度,这样内容可以在其中垂直居中 */
|
|
|
+ width: 80vw;
|
|
|
+ max-width: 300px;
|
|
|
+ max-height: 500px;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: var(--el-box-shadow-lighter);
|
|
|
+ background-color: rgb(255, 255, 255);;
|
|
|
+}
|
|
|
+/* .el-text {
|
|
|
+ color: rgb(36, 36, 36);
|
|
|
+ font-size: 22px;
|
|
|
+} */
|
|
|
+
|
|
|
+/* .verify {
|
|
|
+ height: 100vh;
|
|
|
+}
|
|
|
+.el-col {
|
|
|
+ flex-grow: 1;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+} */
|
|
|
+</style>
|