diff --git a/vue-frontend/src/api/network.js b/vue-frontend/src/api/network.js index 00992a1..6c9af44 100644 --- a/vue-frontend/src/api/network.js +++ b/vue-frontend/src/api/network.js @@ -1,5 +1,24 @@ import axios from 'axios'; +// 处理token失效的逻辑 +function handleTokenExpired() { + // 清除localStorage中的token + window.localStorage.removeItem('token'); + + // 跳转到登录页面 + if (window.location.pathname !== '/login') { + window.location.href = '/login'; + } +} + +// 检查响应是否为token失效 +function isTokenExpired(response) { + return response && response.code === 401 && + (response.msg === '未登录或token已过期' || + response.msg === '无效的token或token已过期' || + response.msg === '无法获取用户权限信息'); +} + export default { get: function(path = '', data = {}) { return new Promise(function(resolve, reject) { @@ -11,10 +30,22 @@ export default { } }) .then(function(response) { + // 检查是否token失效 + if (isTokenExpired(response.data)) { + handleTokenExpired(); + return; + } resolve(response.data); }) .catch(function(error) { console.error('GET请求错误:', error); + + // 检查是否是401错误(token失效) + if (error.response && error.response.status === 401) { + handleTokenExpired(); + return; + } + resolve({"code": -1, "msg": error.message || "网络请求失败"}); }); }); @@ -29,10 +60,22 @@ export default { } }) .then(function(response) { + // 检查是否token失效 + if (isTokenExpired(response.data)) { + handleTokenExpired(); + return; + } resolve(response.data); }) .catch(function(error) { console.error('POST请求错误:', error); + + // 检查是否是401错误(token失效) + if (error.response && error.response.status === 401) { + handleTokenExpired(); + return; + } + resolve({"code": -1, "msg": error.message || "网络请求失败"}); }); }); diff --git a/vue-frontend/src/router/index.js b/vue-frontend/src/router/index.js index 95ae22b..a4e1489 100644 --- a/vue-frontend/src/router/index.js +++ b/vue-frontend/src/router/index.js @@ -1,5 +1,6 @@ import Vue from 'vue'; import VueRouter from 'vue-router'; +import { isLoggedIn } from '@/utils/auth'; // 路由懒加载 @@ -18,7 +19,13 @@ Vue.use(VueRouter); // 路由配置 const routes = [ - {path: '/', redirect: '/login'}, + { + path: '/', + redirect: () => { + // 如果用户已登录,重定向到首页,否则重定向到登录页 + return isLoggedIn() ? '/index' : '/login'; + } + }, {path: '/login', component: Login}, {path: '/change-password', component: ChangeAccountPassword}, { @@ -40,12 +47,26 @@ const router = new VueRouter({ }) router.beforeEach((to, from, next) => { - if (to.path === '/login' || to.path === '/change-password') return next(); - const tokenStr = localStorage.getItem('token') - if (!tokenStr) { - return next('/login') + // 检查用户是否已登录 + const userIsLoggedIn = isLoggedIn(); + + // 如果用户已登录且访问登录页面,直接跳转到首页 + if (userIsLoggedIn && to.path === '/login') { + return next('/index'); } - next() + + // 如果访问登录或修改密码页面,直接放行 + if (to.path === '/login' || to.path === '/change-password') { + return next(); + } + + // 如果用户未登录且访问需要登录的页面,跳转到登录页面 + if (!userIsLoggedIn) { + return next('/login'); + } + + // 其他情况正常放行 + next(); })