fix: 本店超级管理可显示添加用户并管理本俱乐部角色
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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 = () => {
|
||||
|
||||
Reference in New Issue
Block a user