修复: 退出登录未清空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 store from '@/store'
import iView from 'view-design' import iView from 'view-design'
import config from '@/config' 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 { formatMenuList } from '@/libs/router-util'
import { getPermissionList } from '@/api/sys/sys-permission' import { getPermissionList } from '@/api/sys/sys-permission'
@@ -106,9 +106,11 @@ router.beforeEach((to, from, next) => {
if (!turnToRedirectedFrom(to, next)) next() if (!turnToRedirectedFrom(to, next)) next()
} }
}).catch(() => { }).catch(() => {
setToken('') // token 失效被踢回登录页:走统一退出清理,防止内存态残留到下一个会话
next({ store.dispatch('handleLogOut').finally(() => {
name: 'login' next({
name: 'login'
})
}) })
}) })
} }
+29 -20
View File
@@ -8,7 +8,7 @@ export default {
avatorImgPath: '', avatorImgPath: '',
nickname: '', nickname: '',
token: getToken(), token: getToken(),
expireTime: getExpireTime(), //增加的token过期时间 expireTime: getExpireTime(), // 增加的token过期时间
access: '', access: '',
hasGetInfo: false hasGetInfo: false
}, },
@@ -42,7 +42,7 @@ export default {
}, },
actions: { actions: {
// 登录 // 登录
handleLogin ({ commit }, {username, password ,ip}) { handleLogin ({ commit }, { username, password, ip }) {
username = username.trim() username = username.trim()
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
login({ login({
@@ -55,8 +55,8 @@ export default {
let token = data.token let token = data.token
commit('setToken', token) commit('setToken', token)
let curDate = new Date() let curDate = new Date()
let expireTime = curDate.getTime() +24*60*60*1000 // 假设过期时间为后一天24*60*60*1000 let expireTime = curDate.getTime() + 24 * 60 * 60 * 1000 // 假设过期时间为后一天24*60*60*1000
commit('setExpireTime',expireTime) commit('setExpireTime', expireTime)
resolve(data) resolve(data)
} else { } else {
// 登录失败(如用户名或密码错误):把错误抛出给页面提示 // 登录失败(如用户名或密码错误):把错误抛出给页面提示
@@ -69,20 +69,29 @@ export default {
}, },
// 退出登录 // 退出登录
handleLogOut ({ state, commit }) { 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(() => { logout(state.token).then(() => {
commit('setToken', '') clearLocalState()
commit('setAccess', []) resolve()
// 退出时清空缓存路由 }).catch(() => {
localDelete('route') // logout 接口失败(如 token 已过期)也完成本地退出,避免卡在系统内
clearLocalState()
resolve() resolve()
}).catch(err => {
reject(err)
}) })
// 如果你的退出登录无需请求接口,则可以直接使用下面三行代码而无需使用logout调用接口
// commit('setToken', '')
// commit('setAccess', [])
// resolve()
}) })
}, },
// 获取用户相关信息 // 获取用户相关信息
@@ -90,12 +99,12 @@ export default {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
getUserInfo(state.token).then(res => { getUserInfo(state.token).then(res => {
const data = res.data.data; const data = res.data.data
commit('setAvator', data.avatar) commit('setAvator', data.avatar)
commit('setUsername', data.username) // 登录账号 commit('setUsername', data.username) // 登录账号
commit('setNickname', data.nickname) // 昵称 commit('setNickname', data.nickname) // 昵称
commit('setUserId', data.id) //用户ID commit('setUserId', data.id) // 用户ID
commit('setAccess', ['admin']) //用户权限 commit('setAccess', ['admin']) // 用户权限
commit('setHasGetInfo', true) commit('setHasGetInfo', true)
resolve(data) resolve(data)
}).catch(err => { }).catch(err => {