From 0c08243a37ef0a9d6aebcf1f888c61bdf9a2f94a Mon Sep 17 00:00:00 2001 From: XingQue Date: Mon, 6 Jul 2026 19:21:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=8F=9C=E5=8D=95=E4=B8=8EAPI=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=A0=81=E5=8F=8C=E9=87=8D=E6=A0=A1=E9=AA=8C=EF=BC=8C?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=BF=B1=E4=B9=90=E9=83=A8=E5=90=8E=E4=B8=8D?= =?UTF-8?q?=E5=86=8D=E5=B1=95=E7=A4=BA=E6=97=A0=E6=9D=83=E9=99=90=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/club-context.js | 41 +++++++++++++++++++++++++++---- src/views/Welcome.vue | 33 ++++++++++++++++++++----- src/views/order/MerchantOrder.vue | 5 +++- src/views/order/PlatformOrder.vue | 5 +++- 4 files changed, 71 insertions(+), 13 deletions(-) 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 @@