diff --git a/src/router/index.js b/src/router/index.js index 6513e4d..9ba049c 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -4,7 +4,7 @@ import routes from './routers' import store from '@/store' import iView from 'view-design' import config from '@/config' -import { setToken, getToken, setTitle, localSave, localRead } from '@/libs/util' +import { getToken, setTitle, localSave, localRead } from '@/libs/util' import { formatMenuList } from '@/libs/router-util' import { getPermissionList } from '@/api/sys/sys-permission' @@ -106,9 +106,11 @@ router.beforeEach((to, from, next) => { if (!turnToRedirectedFrom(to, next)) next() } }).catch(() => { - setToken('') - next({ - name: 'login' + // token 失效被踢回登录页:走统一退出清理,防止内存态残留到下一个会话 + store.dispatch('handleLogOut').finally(() => { + next({ + name: 'login' + }) }) }) } diff --git a/src/store/module/user.js b/src/store/module/user.js index a5c4ba4..fafb731 100644 --- a/src/store/module/user.js +++ b/src/store/module/user.js @@ -8,7 +8,7 @@ export default { avatorImgPath: '', nickname: '', token: getToken(), - expireTime: getExpireTime(), //增加的token过期时间 + expireTime: getExpireTime(), // 增加的token过期时间 access: '', hasGetInfo: false }, @@ -42,7 +42,7 @@ export default { }, actions: { // 登录 - handleLogin ({ commit }, {username, password ,ip}) { + handleLogin ({ commit }, { username, password, ip }) { username = username.trim() return new Promise((resolve, reject) => { login({ @@ -55,8 +55,8 @@ export default { let token = data.token commit('setToken', token) let curDate = new Date() - let expireTime = curDate.getTime() +24*60*60*1000 // 假设过期时间为后一天24*60*60*1000 - commit('setExpireTime',expireTime) + let expireTime = curDate.getTime() + 24 * 60 * 60 * 1000 // 假设过期时间为后一天24*60*60*1000 + commit('setExpireTime', expireTime) resolve(data) } else { // 登录失败(如用户名或密码错误):把错误抛出给页面提示 @@ -69,20 +69,29 @@ export default { }, // 退出登录 handleLogOut ({ state, commit }) { - return new Promise((resolve, reject) => { + // 本地态清理:不清理的话,SPA 内退出再登录,路由守卫见 menuList 非空 + // 会跳过 getUserInfo,导致上个会话的昵称/头像/菜单残留(刷新才恢复) + const clearLocalState = () => { + commit('setToken', '') + commit('setAccess', []) + commit('setAvator', '') + commit('setUsername', '') + commit('setNickname', '') + commit('setUserId', '') + commit('setHasGetInfo', false) + // 清空内存菜单,强制下次路由守卫重新拉用户信息与权限 + commit('updateMenuList', [], { root: true }) + localDelete('route') + } + return new Promise((resolve) => { logout(state.token).then(() => { - commit('setToken', '') - commit('setAccess', []) - // 退出时清空缓存路由 - localDelete('route') + clearLocalState() + resolve() + }).catch(() => { + // logout 接口失败(如 token 已过期)也完成本地退出,避免卡在系统内 + clearLocalState() resolve() - }).catch(err => { - reject(err) }) - // 如果你的退出登录无需请求接口,则可以直接使用下面三行代码而无需使用logout调用接口 - // commit('setToken', '') - // commit('setAccess', []) - // resolve() }) }, // 获取用户相关信息 @@ -90,12 +99,12 @@ export default { return new Promise((resolve, reject) => { try { getUserInfo(state.token).then(res => { - const data = res.data.data; + const data = res.data.data commit('setAvator', data.avatar) - commit('setUsername', data.username) // 登录账号 - commit('setNickname', data.nickname) // 昵称 - commit('setUserId', data.id) //用户ID - commit('setAccess', ['admin']) //用户权限 + commit('setUsername', data.username) // 登录账号 + commit('setNickname', data.nickname) // 昵称 + commit('setUserId', data.id) // 用户ID + commit('setAccess', ['admin']) // 用户权限 commit('setHasGetInfo', true) resolve(data) }).catch(err => {