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 { 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 = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user