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 = () => {