From ddcbe65856204d910910757c8432bf38683788ba Mon Sep 17 00:00:00 2001 From: sugarBecomer Date: Tue, 24 Mar 2026 20:46:32 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E5=92=8C=E8=8F=9C=E5=8D=95=E6=8E=88=E6=9D=83?= =?UTF-8?q?Checkbox=E7=BB=91=E5=AE=9A=E5=8F=8A=E8=8F=9C=E5=8D=95=E6=A0=91?= =?UTF-8?q?=E9=80=92=E5=BD=92=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/system/RoleManage.vue | 22 ++++++++++++++++++---- src/views/system/UserManage.vue | 4 ++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/views/system/RoleManage.vue b/src/views/system/RoleManage.vue index 7c59069..741cc35 100644 --- a/src/views/system/RoleManage.vue +++ b/src/views/system/RoleManage.vue @@ -131,6 +131,18 @@ const menuRoleId = ref(0) const menuTree = ref([]) const selectedMenuIds = ref([]) +/** 递归将 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 = 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), ]), diff --git a/src/views/system/UserManage.vue b/src/views/system/UserManage.vue index f6ee0d1..379e830 100644 --- a/src/views/system/UserManage.vue +++ b/src/views/system/UserManage.vue @@ -313,8 +313,8 @@ async function fetchUsers(params: PageParams): Promise> { >