fix: 修复角色授权和菜单授权Checkbox绑定及菜单树递归展示
This commit is contained in:
@@ -131,6 +131,18 @@ const menuRoleId = ref(0)
|
||||
const menuTree = ref<UserMenu[]>([])
|
||||
const selectedMenuIds = ref<number[]>([])
|
||||
|
||||
/** 递归将 edges.children 转换为 children */
|
||||
function normalizeMenuTree(nodes: any[]): UserMenu[] {
|
||||
if (!nodes?.length) return []
|
||||
return nodes.map(node => {
|
||||
const edgeChildren = node.edges?.children
|
||||
const directChildren = node.children
|
||||
const rawChildren = edgeChildren?.length ? edgeChildren : directChildren
|
||||
const children = rawChildren?.length ? normalizeMenuTree(rawChildren) : undefined
|
||||
return { ...node, children }
|
||||
})
|
||||
}
|
||||
|
||||
async function openMenuAuth(roleId: number) {
|
||||
menuRoleId.value = roleId
|
||||
menuLoading.value = true
|
||||
@@ -140,8 +152,10 @@ async function openMenuAuth(roleId: number) {
|
||||
systemMenuApi.getTree(),
|
||||
systemRoleApi.getMenu(roleId),
|
||||
])
|
||||
menuTree.value = treeRes.data ?? []
|
||||
selectedMenuIds.value = (roleMenuRes.data as number[]) ?? []
|
||||
menuTree.value = normalizeMenuTree(treeRes.data ?? [])
|
||||
// getMenu 返回的是菜单 ID 数组
|
||||
const ids = roleMenuRes.data
|
||||
selectedMenuIds.value = Array.isArray(ids) ? ids : []
|
||||
} catch {
|
||||
toast.error('获取菜单数据失败')
|
||||
} finally {
|
||||
@@ -314,8 +328,8 @@ const MenuTreeCheckbox: ReturnType<typeof defineComponent> = defineComponent({
|
||||
h('div', { class: 'flex items-center gap-2', style: { paddingLeft: `${props.depth * 20}px` } }, [
|
||||
h(Checkbox, {
|
||||
id: `menu-${props.menu.id}`,
|
||||
checked: props.selectedIds.includes(props.menu.id),
|
||||
'onUpdate:checked': () => emit('toggle', props.menu.id),
|
||||
modelValue: props.selectedIds.includes(props.menu.id),
|
||||
'onUpdate:modelValue': () => emit('toggle', props.menu.id),
|
||||
}),
|
||||
h(Label, { for: `menu-${props.menu.id}`, class: 'cursor-pointer text-sm' }, () => props.menu.name || props.menu.label),
|
||||
]),
|
||||
|
||||
@@ -313,8 +313,8 @@ async function fetchUsers(params: PageParams): Promise<PageResponse<any>> {
|
||||
>
|
||||
<Checkbox
|
||||
:id="`role-${role.id}`"
|
||||
:checked="selectedRoleIds.includes(role.id)"
|
||||
@update:checked="toggleRole(role.id)"
|
||||
:model-value="selectedRoleIds.includes(role.id)"
|
||||
@update:model-value="toggleRole(role.id)"
|
||||
/>
|
||||
<Label :for="`role-${role.id}`" class="cursor-pointer">
|
||||
{{ role.name }}
|
||||
|
||||
Reference in New Issue
Block a user