mirror of
https://gitee.com/xiaonuobase/snowy.git
synced 2026-10-06 06:52:58 +08:00
【底座】修复 #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:
committed by
小诺方舟
co-authored by
Claude Opus 5.5
parent
219b6b7094
commit
f614adc71d
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user