【底座】修复 #IKJ240 登录后初始化失败时不提示且TOKEN残留,刷新后直接进入系统的问题

afterLogin 先保存 TOKEN 再初始化用户信息、菜单和字典,任一请求失败时只在控制台打印错误,
页面不跳转也无提示,但 TOKEN 仍留在 localStorage,刷新后路由守卫放行直接进入系统。
现改为初始化失败时调用 tool.clearLoginCache() 回滚登录态并提示用户重新登录;
用户信息与菜单改用 Promise.allSettled 等两者都结束后再回滚,避免回滚后另一个请求返回又写入缓存。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bxjyl
2026-10-05 06:44:20 +00:00
committed by 小诺方舟
co-authored by Claude Opus 5.5
parent 219b6b7094
commit f614adc71d
+18 -5
View File
@@ -15,9 +15,19 @@ export const afterLogin = async (loginToken, targetPath) => {
tool.data.set('TOKEN', loginToken)
// 重新登录一定不处于锁屏,清掉上次会话残留的锁屏状态(服务端同样会在登录时清除)
globalStore().setIsLocked(false)
// 初始化失败时回滚登录态,否则残留的 TOKEN 会让刷新后绕过登录页直接进入系统
const rollbackLogin = (err) => {
tool.clearLoginCache()
message.error('登录成功,但系统初始化失败,请重新登录')
throw err
}
// 并行初始化用户信息和获取用户的菜单
await Promise.all([userStore.initUserInfo(), menuStore.fetchMenu()])
// 并行初始化用户信息和获取用户的菜单,两者都结束后再判断,避免回滚后另一个请求才返回又写入缓存
const initResults = await Promise.allSettled([userStore.initUserInfo(), menuStore.fetchMenu()])
const initFailed = initResults.find((item) => item.status === 'rejected')
if (initFailed) {
rollbackLogin(initFailed.reason)
}
const menu = tool.data.get('MENU')
let indexMenu = routerUtil.getIndexMenu(menu).path
@@ -49,9 +59,12 @@ export const afterLogin = async (loginToken, targetPath) => {
}
}
// 字典要在跳转前落缓存,否则首个页面顶层 tool.dictList() 会取到空数组
await dictApi.dictTree().then((data) => {
tool.data.set('DICT_TYPE_TREE_DATA', data)
})
await dictApi
.dictTree()
.then((data) => {
tool.data.set('DICT_TYPE_TREE_DATA', data)
})
.catch(rollbackLogin)
// 第三方Token登录:直接跳转到指定目标路径
if (targetPath) {