perf: 顶栏复用登录菜单,瘦身 userInfo 持久化
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
d3e1c62043
commit
00285ac6a8
@ -344,7 +344,7 @@ const menuData = computed(() => {
|
|||||||
return convertMenuTreeToNavMenu(userMenus);
|
return convertMenuTreeToNavMenu(userMenus);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 加载菜单树和用户菜单权限
|
// 加载菜单:优先复用登录带回的 user menus,避免再打全量 get-menu-tree
|
||||||
async function loadMenuTree() {
|
async function loadMenuTree() {
|
||||||
menuLoading.value = true;
|
menuLoading.value = true;
|
||||||
try {
|
try {
|
||||||
@ -354,22 +354,25 @@ async function loadMenuTree() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentUserMenus = rbacUserStore.menus;
|
let currentUserMenus = rbacUserStore.menus;
|
||||||
if (currentUserMenus && currentUserMenus.length > 0) {
|
|
||||||
menuDataReady.value = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!currentUserMenus || currentUserMenus.length === 0) {
|
if (!currentUserMenus || currentUserMenus.length === 0) {
|
||||||
try {
|
try {
|
||||||
await rbacUserStore.getCurrentUser();
|
await rbacUserStore.getCurrentUser();
|
||||||
if (rbacUserStore.menus?.length) {
|
currentUserMenus = rbacUserStore.menus;
|
||||||
menuDataReady.value = true;
|
|
||||||
}
|
|
||||||
} catch (userError) {
|
} catch (userError) {
|
||||||
console.error('获取用户信息失败:', userError);
|
console.error('获取用户信息失败:', userError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (currentUserMenus && currentUserMenus.length > 0) {
|
||||||
|
allMenuTreeData.value = [];
|
||||||
|
await nextTick();
|
||||||
|
menuDataReady.value = true;
|
||||||
|
tabBarStore.refreshTagTitles();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 兜底:用户 menus 仍为空时再拉全量树(管理页等特殊场景)
|
||||||
try {
|
try {
|
||||||
const allMenus = await MenuService.getRbacMenuGetMenuTree() || [];
|
const allMenus = await MenuService.getRbacMenuGetMenuTree() || [];
|
||||||
allMenuTreeData.value = allMenus;
|
allMenuTreeData.value = allMenus;
|
||||||
|
|||||||
@ -80,8 +80,16 @@ export const useAuthStore = defineStore({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 优先使用 get-current-user 已返回的菜单,减少重复请求
|
// 优先使用内存中的登录菜单;若 localStorage 瘦身后无 menus,则拉 get-current-user
|
||||||
const cachedMenus = rbacUserStore.menus;
|
let cachedMenus = rbacUserStore.menus;
|
||||||
|
if (!cachedMenus || cachedMenus.length === 0) {
|
||||||
|
try {
|
||||||
|
await rbacUserStore.getCurrentUser();
|
||||||
|
cachedMenus = rbacUserStore.menus;
|
||||||
|
} catch {
|
||||||
|
// 继续走 get-user-menus 兜底
|
||||||
|
}
|
||||||
|
}
|
||||||
const menuTree =
|
const menuTree =
|
||||||
cachedMenus && cachedMenus.length > 0
|
cachedMenus && cachedMenus.length > 0
|
||||||
? cachedMenus
|
? cachedMenus
|
||||||
|
|||||||
@ -59,6 +59,22 @@ export const useRbacUserStore = defineStore('rbacUser', () => {
|
|||||||
// 兼容旧代码
|
// 兼容旧代码
|
||||||
const token = computed(() => accessToken.value)
|
const token = computed(() => accessToken.value)
|
||||||
|
|
||||||
|
/** 持久化瘦身:menus 仅留内存,避免 localStorage 写入过大 JSON */
|
||||||
|
function persistUserInfo(info: UserInfoDto | null) {
|
||||||
|
if (!info) {
|
||||||
|
getAuthStorage().removeItem(USER_INFO_KEY)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const slim: UserInfoDto = { ...info }
|
||||||
|
delete slim.menus
|
||||||
|
getAuthStorage().setItem(USER_INFO_KEY, JSON.stringify(slim))
|
||||||
|
}
|
||||||
|
|
||||||
|
function setUserInfo(info: UserInfoDto) {
|
||||||
|
userInfo.value = info
|
||||||
|
persistUserInfo(info)
|
||||||
|
}
|
||||||
|
|
||||||
function readStoredLoginType(): OmsLoginType {
|
function readStoredLoginType(): OmsLoginType {
|
||||||
const raw = getAuthStorage().getItem(LOGIN_TYPE_KEY) ?? localStorage.getItem(LOGIN_TYPE_KEY)
|
const raw = getAuthStorage().getItem(LOGIN_TYPE_KEY) ?? localStorage.getItem(LOGIN_TYPE_KEY)
|
||||||
if (raw === String(OmsLoginType.Customer)) return OmsLoginType.Customer
|
if (raw === String(OmsLoginType.Customer)) return OmsLoginType.Customer
|
||||||
@ -247,8 +263,7 @@ export const useRbacUserStore = defineStore('rbacUser', () => {
|
|||||||
async function hydrateUserAfterLogin(result: LoginResultDto) {
|
async function hydrateUserAfterLogin(result: LoginResultDto) {
|
||||||
const embedded = result.userInfo
|
const embedded = result.userInfo
|
||||||
if (embedded?.id) {
|
if (embedded?.id) {
|
||||||
userInfo.value = embedded
|
setUserInfo(embedded)
|
||||||
getAuthStorage().setItem(USER_INFO_KEY, JSON.stringify(embedded))
|
|
||||||
return embedded
|
return embedded
|
||||||
}
|
}
|
||||||
return getCurrentUser()
|
return getCurrentUser()
|
||||||
@ -262,8 +277,7 @@ export const useRbacUserStore = defineStore('rbacUser', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const data = await AuthService.getRbacAuthGetCurrentUser()
|
const data = await AuthService.getRbacAuthGetCurrentUser()
|
||||||
userInfo.value = data
|
setUserInfo(data)
|
||||||
getAuthStorage().setItem(USER_INFO_KEY, JSON.stringify(data))
|
|
||||||
return data
|
return data
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logout()
|
logout()
|
||||||
@ -275,8 +289,7 @@ export const useRbacUserStore = defineStore('rbacUser', () => {
|
|||||||
async function refreshUserInfo() {
|
async function refreshUserInfo() {
|
||||||
try {
|
try {
|
||||||
const data = await AuthService.getRbacAuthGetCurrentUser()
|
const data = await AuthService.getRbacAuthGetCurrentUser()
|
||||||
userInfo.value = data
|
setUserInfo(data)
|
||||||
getAuthStorage().setItem(USER_INFO_KEY, JSON.stringify(data))
|
|
||||||
return data
|
return data
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
handleApiError(error)
|
handleApiError(error)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user