diff --git a/src/utils/club-context.js b/src/utils/club-context.js index 2c70752..cb838ea 100644 --- a/src/utils/club-context.js +++ b/src/utils/club-context.js @@ -3,7 +3,7 @@ const CLUB_SCOPE_KEY = 'admin_club_scope'; const CLUB_CONTEXT_KEY = 'admin_club_context'; const MENU_ACCESS_KEY = 'kefu_menu_access'; const MENU_SESSION_KEY = 'kefu_menu_session_v'; -const MENU_SESSION_VERSION = '21'; +const MENU_SESSION_VERSION = '22'; const DEFAULT_CLUB_ID = 'xq'; let menuAccessInflight = null; @@ -162,6 +162,7 @@ const KEFU_MENU_ROWS = [ ]; const KEFU_MENU_PARENT_IDS = { + admin: ['admin.role', 'admin.data-scope', 'admin.club-config', 'admin.user', 'admin.operation-log'], finance: ['finance.bankuai', 'finance.data'], assessment: ['assessment.examiner', 'assessment.config', 'assessment.record'], order: ['order.platform', 'order.merchant'], @@ -214,9 +215,37 @@ export function canShowMenuPage(pageId) { if (!access) return false; const ids = access?.visible_page_ids; if (!Array.isArray(ids) || ids.length === 0) return false; + + const row = KEFU_MENU_ROWS.find((r) => r.page_id === pageId); + if (row?.path && row.perm_codes?.length) { + if (!ids.includes(pageId)) return false; + return hasPermCode(access, ...row.perm_codes); + } + if (ids.includes(pageId)) return true; const children = KEFU_MENU_PARENT_IDS[pageId]; - return children ? children.some((id) => ids.includes(id)) : false; + return children ? children.some((id) => canShowMenuPage(id)) : false; +} + +/** 写入菜单缓存,并同步服务端校正后的 effective_club_id */ +export function applyMenuAccessPayload(data) { + if (!data) return null; + const scope = getAdminClubScope(); + const expectedClub = getAdminClubId(); + if ( + data.effective_club_id && + scope !== 'all' && + data.effective_club_id !== expectedClub + ) { + const ctx = getAdminClubContext() || {}; + setAdminClubContext({ + ...ctx, + club_id: data.effective_club_id, + scope: 'SINGLE_CLUB', + }); + } + setMenuAccess(data); + return data; } export function getFirstVisiblePath() { @@ -281,11 +310,13 @@ export async function ensureMenuAccess(fetcher, { force = false } = {}) { menuAccessInflight = (async () => { try { const data = await fetcher(); - if (data) setMenuAccess(data); - return data; + if (data) return applyMenuAccessPayload(data); + if (force) clearMenuAccess(); + return null; } catch (e) { console.error('ensureMenuAccess failed:', e); - return getMenuAccess(); + if (force) clearMenuAccess(); + return null; } finally { menuAccessInflight = null; } diff --git a/src/views/Welcome.vue b/src/views/Welcome.vue index 300fa3a..e87e97c 100644 --- a/src/views/Welcome.vue +++ b/src/views/Welcome.vue @@ -3,9 +3,11 @@