fix: 修复角色授权和菜单授权Checkbox绑定及菜单树递归展示

This commit is contained in:
sugarBecomer
2026-03-24 20:46:32 +08:00
parent 994dc360ae
commit ddcbe65856
2 changed files with 20 additions and 6 deletions
+18 -4
View File
@@ -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),
]),
+2 -2
View File
@@ -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 }}