From db386a0953eaeb176a9023e78f0010074a2f3556 Mon Sep 17 00:00:00 2001 From: XingQue Date: Sun, 26 Jul 2026 02:15:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=AC=E5=BA=97=E8=B6=85=E7=BA=A7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8F=AF=E6=98=BE=E7=A4=BA=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=B9=B6=E7=AE=A1=E7=90=86=E6=9C=AC=E4=BF=B1?= =?UTF-8?q?=E4=B9=90=E9=83=A8=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/views/admin/AdminUser.vue | 101 ++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 16 deletions(-) diff --git a/src/views/admin/AdminUser.vue b/src/views/admin/AdminUser.vue index 8b384d3..e4529e4 100644 --- a/src/views/admin/AdminUser.vue +++ b/src/views/admin/AdminUser.vue @@ -381,7 +381,7 @@ import { ref, computed, onMounted, nextTick } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { Plus, Close } from '@element-plus/icons-vue' import request from '@/utils/request' -import { JITUAN_API, getAdminClubContext } from '@/utils/club-context' +import { JITUAN_API, getAdminClubContext, getAdminClubId, getAdminClubScope } from '@/utils/club-context' const username = localStorage.getItem('username') || '' @@ -392,6 +392,9 @@ const clubNameMap = computed(() => { return m }) +const currentViewClubId = computed(() => getAdminClubId()) +const isAllClubsView = computed(() => getAdminClubScope() === 'all') + const roleClubLabel = (role) => { if (!role) return '' const cid = role.club_id || '' @@ -400,24 +403,44 @@ const roleClubLabel = (role) => { } const canAddUser = computed(() => { - return canManageClubAssignments.value || manageableClubIds.value.length > 0 + // 本店超级管理:manageableClubIds 含当前店,或后端显式 can_manage_club_users + if (canManageClubUsers.value) return true + if (canManageClubAssignments.value) return true + const curr = currentViewClubId.value + if (curr && manageableClubIds.value.includes(curr)) return true + return manageableClubIds.value.length > 0 }) const canManageRolesForClub = (clubId) => { const cid = clubId || '' - if (canManageClubAssignments.value) return true + // 单俱乐部顶栏:只允许操作当前店(即使账号有集团任职管理权) + if (!isAllClubsView.value && cid && cid !== currentViewClubId.value) { + return false + } + // 全局角色(club_id 空):仅集团汇总视图下的集团账号可管 + if (!cid) { + return isAllClubsView.value && canManageClubAssignments.value + } + if (canManageClubAssignments.value && isAllClubsView.value) return true + if (canManageClubAssignments.value && cid === currentViewClubId.value) return true + if (canManageClubUsers.value && cid === currentViewClubId.value) return true return manageableClubIds.value.includes(cid) } const visibleRolesForRow = (row) => { const roles = row.roles || [] - if (canManageClubAssignments.value) return roles - return roles.filter((r) => manageableClubIds.value.includes(r.club_id || '')) + if (isAllClubsView.value && canManageClubAssignments.value) return roles + const curr = currentViewClubId.value + return roles.filter((r) => { + const cid = r.club_id || '' + return !cid || cid === curr + }) } // 权限状态:集团高管 / 俱乐部超管 / 000001 均可访问 const hasPermission = ref(true) const canManageClubAssignments = ref(false) +const canManageClubUsers = ref(false) const manageableClubIds = ref([]) // 角色列表(用于筛选和添加) @@ -467,7 +490,11 @@ const clubAssignForm = ref({ club_id: '', role_code: 'CLUB_ADMIN', is_primary: f const availableClubsForAssign = computed(() => { const assigned = new Set(currentUserAssignments.value.map((a) => a.club_id)) - return clubOptions.value.filter((c) => !assigned.has(c.club_id)) + let opts = clubOptions.value.filter((c) => !assigned.has(c.club_id)) + if (!isAllClubsView.value) { + opts = opts.filter((c) => c.club_id === currentViewClubId.value) + } + return opts }) const availableRolesForUser = computed(() => { @@ -489,8 +516,17 @@ const roleBindClubOptions = computed(() => { club_id: a.club_id, name: a.club_label || clubNameMap.value[a.club_id] || a.club_id, })) - if (source.length) return source - return clubOptions.value.filter((c) => canManageRolesForClub(c.club_id)) + if (source.length) { + if (!isAllClubsView.value) { + return source.filter((c) => c.club_id === currentViewClubId.value) + } + return source + } + let opts = clubOptions.value.filter((c) => canManageRolesForClub(c.club_id)) + if (!isAllClubsView.value) { + opts = opts.filter((c) => c.club_id === currentViewClubId.value) + } + return opts }) const clubRoleBlocks = computed(() => { @@ -532,8 +568,9 @@ const clubRoleBlocks = computed(() => { const visibleClubRoleBlocks = computed(() => { return clubRoleBlocks.value.filter((b) => { const cid = b.club_id || '' - if (canManageClubAssignments.value) return true - return manageableClubIds.value.includes(cid) + if (isAllClubsView.value && canManageClubAssignments.value) return true + if (!cid) return true + return cid === currentViewClubId.value && canManageRolesForClub(cid) }) }) @@ -549,15 +586,23 @@ const newUserRoleCodes = ref([]) const addingUser = ref(false) // ==================== 接口调用 ==================== -// 获取角色列表(集团高层拉全部,俱乐部超管仅本俱乐部) +// 获取角色列表:单俱乐部顶栏绝不拉其他店;仅集团汇总视图才允许 all_clubs const fetchRoleList = async () => { try { const res = await request.post('/houtai/hqyhjsgl', { username, - all_clubs: canManageClubAssignments.value, + all_clubs: isAllClubsView.value && canManageClubAssignments.value, }) if (res.code === 0) { - roleList.value = res.data.roles || [] + let roles = res.data.roles || [] + if (!isAllClubsView.value) { + const curr = currentViewClubId.value + const clubRoles = roles.filter((r) => (r.club_id || '') === curr) + roles = clubRoles.length + ? clubRoles + : roles.filter((r) => !(r.club_id || '')) + } + roleList.value = roles return true } else if (res.code === 403) { hasPermission.value = false @@ -576,14 +621,24 @@ const loadClubOptions = async () => { try { const res = await request.get(JITUAN_API.clubList, { skipErrorToast: true }) if (res.code === 0 && Array.isArray(res.data)) { - clubOptions.value = res.data.map((c) => ({ club_id: c.club_id, name: c.name })) + let opts = res.data.map((c) => ({ club_id: c.club_id, name: c.name })) + if (!isAllClubsView.value) { + const curr = currentViewClubId.value + opts = opts.filter((c) => c.club_id === curr) + } + clubOptions.value = opts return } } catch { // fallback } const ctx = getAdminClubContext() - clubOptions.value = ctx?.clubs || [] + let opts = ctx?.clubs || [] + if (!isAllClubsView.value) { + const curr = currentViewClubId.value + opts = opts.filter((c) => c.club_id === curr) + } + clubOptions.value = opts } // 获取用户列表 @@ -608,7 +663,15 @@ const fetchUserList = async () => { userList.value = res.data.list || [] total.value = res.data.total || 0 canManageClubAssignments.value = !!res.data.can_manage_club_assignments + canManageClubUsers.value = !!res.data.can_manage_club_users manageableClubIds.value = res.data.manageable_club_ids || [] + // 兜底:列表成功且当前店在 manageable / 有 000001 语义时允许管本店用户 + if ( + !canManageClubUsers.value + && manageableClubIds.value.includes(currentViewClubId.value) + ) { + canManageClubUsers.value = true + } } else if (res.code === 403) { hasPermission.value = false } else { @@ -689,7 +752,13 @@ const openAddRoleForClub = (clubId) => { } const openAddRoleForUser = () => { - openAddRoleForClub(roleBindClubOptions.value[0]?.club_id || clubOptions.value[0]?.club_id || '') + const curr = currentViewClubId.value + const preferred = + roleBindClubOptions.value.find((c) => c.club_id === curr)?.club_id + || roleBindClubOptions.value[0]?.club_id + || curr + || '' + openAddRoleForClub(preferred) } const openAddClubDialog = () => {