From 79ad0e5fe03a725e0d844ceb4840702287f173db Mon Sep 17 00:00:00 2001 From: pengda <1111@qq.com> Date: Tue, 12 Aug 2025 17:20:04 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E9=99=86=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.js | 6 ++-- src/utils/login.js | 83 +++++++++++++++++++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/src/main.js b/src/main.js index b525bd4..ebeff31 100755 --- a/src/main.js +++ b/src/main.js @@ -66,10 +66,12 @@ Vue.use(clipboard); Vue.directive('clickaway', clickaway); Vue.mixin(HeaderIcon) // ✅ 自动登录后再启动应用 -autoLoginByToken().finally(() => { +autoLoginByToken().then(() => { new Vue({ router, store, render: h => h(App) }).$mount('#app') -}) +}).catch(() => { + window.location.href = process.env.VUE_APP_HOST; +}); diff --git a/src/utils/login.js b/src/utils/login.js index 122a8e9..6cc3978 100644 --- a/src/utils/login.js +++ b/src/utils/login.js @@ -2,39 +2,64 @@ import axios from 'axios' -export async function autoLoginByToken() { +// axios 带超时机制 +function axiosWithTimeout(promise, ms) { + return Promise.race([ + promise, + new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), ms)) + ]); +} + +export async function autoLoginByToken(timeout = 10000) { + const urlParams = new URLSearchParams(window.location.search) const token = urlParams.get('token') if (token) { - try { - const res = await axios.post(process.env.VUE_APP_BASE_API+'/agentnew/token_login', { token: token },{ - headers: { - 'Content-Type': 'application/x-www-form-urlencoded' - }, - }) - if (res.data.status) { - // 可选:将 token 存入 localStorage - localStorage.setItem('token', res.data.data.access_token) - localStorage.setItem('nick', res.data.data.nick) - - //非代理商 直接跳至加盟页 - if(res.data.data.nick === ''){ - const aid = urlParams.get('aid') - window.location.href = "/franchise?aid="+aid - return true - } - - const url = new URL(window.location.href); - url.searchParams.delete('token'); - window.location.replace(url.toString()); - return true - } else { - return false - } - } catch (e) { - console.error('请求异常', e) + const res = await axiosWithTimeout( + axios.post( + process.env.VUE_APP_BASE_API+'/agentnew/token_login', + new URLSearchParams({ token }) + ), + timeout + ); + + if(!res.data.status){ + throw new Error('登陆失败'); } + + // 可选:将 token 存入 localStorage + localStorage.setItem('token', res.data.data.access_token) + localStorage.setItem('nick', res.data.data.nick) + } + + const res = await axiosWithTimeout( + axios.post( + process.env.VUE_APP_BASE_API+'/agentnew/check_login',{}, // 保证和 x-www-form-urlencoded 匹配 + { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } + ), + timeout + ); + if(!res.data.status){ + throw new Error('您还未登陆'); } - return false + + const access_token = localStorage.get('token') + if(access_token === ''){ + throw new Error('登陆有误'); + } + + const nick = localStorage.get('nick') + + //非代理商 直接跳至加盟页 + if(nick === ''){ + const aid = urlParams.get('aid') + window.location.href = "/franchise?aid="+aid + return true + } + + const url = new URL(window.location.href); + url.searchParams.delete('token'); + history.replaceState(null, '', url.toString()); + return true }