fix: 本店超级管理可显示添加用户并管理本俱乐部角色

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-26 02:15:03 +08:00
parent 975e37411e
commit db386a0953

View File

@@ -381,7 +381,7 @@ import { ref, computed, onMounted, nextTick } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Close } from '@element-plus/icons-vue' import { Plus, Close } from '@element-plus/icons-vue'
import request from '@/utils/request' 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') || '' const username = localStorage.getItem('username') || ''
@@ -392,6 +392,9 @@ const clubNameMap = computed(() => {
return m return m
}) })
const currentViewClubId = computed(() => getAdminClubId())
const isAllClubsView = computed(() => getAdminClubScope() === 'all')
const roleClubLabel = (role) => { const roleClubLabel = (role) => {
if (!role) return '' if (!role) return ''
const cid = role.club_id || '' const cid = role.club_id || ''
@@ -400,24 +403,44 @@ const roleClubLabel = (role) => {
} }
const canAddUser = computed(() => { 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 canManageRolesForClub = (clubId) => {
const cid = 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) return manageableClubIds.value.includes(cid)
} }
const visibleRolesForRow = (row) => { const visibleRolesForRow = (row) => {
const roles = row.roles || [] const roles = row.roles || []
if (canManageClubAssignments.value) return roles if (isAllClubsView.value && canManageClubAssignments.value) return roles
return roles.filter((r) => manageableClubIds.value.includes(r.club_id || '')) const curr = currentViewClubId.value
return roles.filter((r) => {
const cid = r.club_id || ''
return !cid || cid === curr
})
} }
// 权限状态:集团高管 / 俱乐部超管 / 000001 均可访问 // 权限状态:集团高管 / 俱乐部超管 / 000001 均可访问
const hasPermission = ref(true) const hasPermission = ref(true)
const canManageClubAssignments = ref(false) const canManageClubAssignments = ref(false)
const canManageClubUsers = ref(false)
const manageableClubIds = ref([]) const manageableClubIds = ref([])
// 角色列表(用于筛选和添加) // 角色列表(用于筛选和添加)
@@ -467,7 +490,11 @@ const clubAssignForm = ref({ club_id: '', role_code: 'CLUB_ADMIN', is_primary: f
const availableClubsForAssign = computed(() => { const availableClubsForAssign = computed(() => {
const assigned = new Set(currentUserAssignments.value.map((a) => a.club_id)) 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(() => { const availableRolesForUser = computed(() => {
@@ -489,8 +516,17 @@ const roleBindClubOptions = computed(() => {
club_id: a.club_id, club_id: a.club_id,
name: a.club_label || clubNameMap.value[a.club_id] || a.club_id, name: a.club_label || clubNameMap.value[a.club_id] || a.club_id,
})) }))
if (source.length) return source if (source.length) {
return clubOptions.value.filter((c) => canManageRolesForClub(c.club_id)) 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(() => { const clubRoleBlocks = computed(() => {
@@ -532,8 +568,9 @@ const clubRoleBlocks = computed(() => {
const visibleClubRoleBlocks = computed(() => { const visibleClubRoleBlocks = computed(() => {
return clubRoleBlocks.value.filter((b) => { return clubRoleBlocks.value.filter((b) => {
const cid = b.club_id || '' const cid = b.club_id || ''
if (canManageClubAssignments.value) return true if (isAllClubsView.value && canManageClubAssignments.value) return true
return manageableClubIds.value.includes(cid) if (!cid) return true
return cid === currentViewClubId.value && canManageRolesForClub(cid)
}) })
}) })
@@ -549,15 +586,23 @@ const newUserRoleCodes = ref([])
const addingUser = ref(false) const addingUser = ref(false)
// ==================== 接口调用 ==================== // ==================== 接口调用 ====================
// 获取角色列表(集团高层拉全部,俱乐部超管仅本俱乐部) // 获取角色列表:单俱乐部顶栏绝不拉其他店;仅集团汇总视图才允许 all_clubs
const fetchRoleList = async () => { const fetchRoleList = async () => {
try { try {
const res = await request.post('/houtai/hqyhjsgl', { const res = await request.post('/houtai/hqyhjsgl', {
username, username,
all_clubs: canManageClubAssignments.value, all_clubs: isAllClubsView.value && canManageClubAssignments.value,
}) })
if (res.code === 0) { 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 return true
} else if (res.code === 403) { } else if (res.code === 403) {
hasPermission.value = false hasPermission.value = false
@@ -576,14 +621,24 @@ const loadClubOptions = async () => {
try { try {
const res = await request.get(JITUAN_API.clubList, { skipErrorToast: true }) const res = await request.get(JITUAN_API.clubList, { skipErrorToast: true })
if (res.code === 0 && Array.isArray(res.data)) { 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 return
} }
} catch { } catch {
// fallback // fallback
} }
const ctx = getAdminClubContext() 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 || [] userList.value = res.data.list || []
total.value = res.data.total || 0 total.value = res.data.total || 0
canManageClubAssignments.value = !!res.data.can_manage_club_assignments canManageClubAssignments.value = !!res.data.can_manage_club_assignments
canManageClubUsers.value = !!res.data.can_manage_club_users
manageableClubIds.value = res.data.manageable_club_ids || [] 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) { } else if (res.code === 403) {
hasPermission.value = false hasPermission.value = false
} else { } else {
@@ -689,7 +752,13 @@ const openAddRoleForClub = (clubId) => {
} }
const openAddRoleForUser = () => { 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 = () => { const openAddClubDialog = () => {