import type { RouteLocationRaw } from 'vue-router'; import { isNavigationFailure } from 'vue-router'; import router from '@/router'; import { useUserStore, useTabBarStore } from '@/store'; import { ensureDynamicRouterReady } from '@/router/ensure-dynamic-router'; import { ensureHeavyPlugins } from '@/plugins/heavy-plugins'; import { ensureFullLocaleMessages } from '@/locale'; import { skipNextPageTransition } from '@/utils/page-transition-flag'; import type { UserInfoDto } from '@/api/rbac'; import { resolveAvatarUrl } from '@/utils/avatar'; export type EnterSystemTarget = { path?: string; name?: string; query?: Record; }; /** 将 RBAC 用户写入 userStore(密码/微信/SSO 共用) */ export function applyRbacUserToUserStore( userInfoData: UserInfoDto, fallbackAccount = '', ) { const userStore = useUserStore(); const displayName = userInfoData.name || userInfoData.account || fallbackAccount || String(userInfoData.id ?? ''); userStore.setInfo({ account: userInfoData.account || fallbackAccount, name: displayName, avatar: resolveAvatarUrl(userInfoData.avatar), email: userInfoData.email, id: userInfoData.id, accountId: userInfoData.id, defaultModule: undefined, moduleList: [], }); } /** * 登录成功后进入系统(客户端 / 管理端共用) * * 关键路径只等:完整语言包 + 动态路由就绪 → replace * 退场动画、重型插件:后台进行,不堵跳转 */ export async function enterSystemAfterLogin(options: { target: EnterSystemTarget; fallbackPath: string; playExit?: () => Promise; }): Promise { const userStore = useUserStore(); if (!userStore.chooseModuleGet) { userStore.setModule(1); } void options.playExit?.(); void ensureHeavyPlugins(); await Promise.all([ ensureFullLocaleMessages(), ensureDynamicRouterReady({ forceRefresh: false }), ]); skipNextPageTransition(); // 登录壳不进业务页签;进系统前清空,避免残留「login」标签 useTabBarStore().resetTabList(); try { await router.replace({ ...options.target } as RouteLocationRaw); } catch (navErr) { if (!isNavigationFailure(navErr)) throw navErr; await router.replace({ path: options.fallbackPath, query: (options.target.query || {}) as Record, }); } }