修复: 退出登录未清空Vuex内存态,导致下个会话昵称/菜单残留(如yiciheng显示超级管理员)
CI/CD Deploy (Web) / 构建前端镜像并部署 (push) Successful in 33s

This commit is contained in:
张家训
2026-10-20 18:45:46 +08:00
parent 86202d0c13
commit 3b591486b6
2 changed files with 35 additions and 24 deletions
+6 -4
View File
@@ -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'
})
})
})
}
+29 -20
View File
@@ -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 => {