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