From 041d65566e34efdd9ae0b231958d6572bede4096 Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Thu, 27 Aug 2026 10:26:12 +0800 Subject: [PATCH] fix: correct menu activation status display --- .../src/lib/system-resource.test.ts | 25 ++++++++++++++++++- .../src/lib/system-resource.ts | 14 ++++++++++- .../src/pages/SystemResourcePage.vue | 7 +++--- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/WonderQ-Admin-UI-Vue/src/lib/system-resource.test.ts b/WonderQ-Admin-UI-Vue/src/lib/system-resource.test.ts index 6830fa5..8b9ec2d 100644 --- a/WonderQ-Admin-UI-Vue/src/lib/system-resource.test.ts +++ b/WonderQ-Admin-UI-Vue/src/lib/system-resource.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; -import { buildSystemTree, dataScopeLabel, filterSystemTree } from "@/lib/system-resource"; +import { buildSystemTree, dataScopeLabel, filterSystemTree, hydrateMenuTree } from "@/lib/system-resource"; +import type { SystemMenuItem, SystemMenuTreeItem } from "@/types"; describe("system resource tree helpers", () => { const items = [ @@ -21,6 +22,28 @@ describe("system resource tree helpers", () => { ]); }); + it("hydrates menu tree nodes with status fields from the flat response", () => { + const flatItems = [{ + id: "dashboard", + name: "仪表盘", + type: "page", + parentId: null, + sortOrder: 10, + isVisible: true, + isActive: true, + }] as SystemMenuItem[]; + const tree = [{ + id: "dashboard", + name: "仪表盘", + type: "page", + parentId: null, + sortOrder: 10, + children: [], + }] as unknown as SystemMenuTreeItem[]; + + expect(hydrateMenuTree(tree, flatItems)[0]).toMatchObject({ isVisible: true, isActive: true }); + }); + it("uses RuoYi-compatible Chinese labels for data scope", () => { expect(dataScopeLabel("all")).toBe("全部数据"); expect(dataScopeLabel("dept_and_children")).toBe("本部门及以下"); diff --git a/WonderQ-Admin-UI-Vue/src/lib/system-resource.ts b/WonderQ-Admin-UI-Vue/src/lib/system-resource.ts index 30809a0..568ceab 100644 --- a/WonderQ-Admin-UI-Vue/src/lib/system-resource.ts +++ b/WonderQ-Admin-UI-Vue/src/lib/system-resource.ts @@ -1,6 +1,6 @@ import { ref, watch, type Ref } from "vue"; import { getSystemResource } from "@/api/client"; -import type { SystemRoleItem } from "@/types"; +import type { SystemMenuItem, SystemMenuTreeItem, SystemRoleItem } from "@/types"; export type SystemResourceResponse = { items: unknown[] }; export type SystemResourceFetcher = (resource: string) => Promise; @@ -25,6 +25,18 @@ export function buildSystemTree(items: T[]): Array [item.id, item])); + const hydrate = (nodes: SystemMenuTreeItem[]): SystemMenuTreeItem[] => nodes.map((node) => { + const item = itemMap.get(node.id); + return { + ...(item ? { ...item, ...node } : node), + children: hydrate(node.children ?? []), + }; + }); + return hydrate(tree); +} + export function filterSystemTree(nodes: Array>, keyword: string): Array> { const normalized = keyword.trim().toLowerCase(); if (!normalized) return nodes; diff --git a/WonderQ-Admin-UI-Vue/src/pages/SystemResourcePage.vue b/WonderQ-Admin-UI-Vue/src/pages/SystemResourcePage.vue index 4ab75ec..766ac62 100644 --- a/WonderQ-Admin-UI-Vue/src/pages/SystemResourcePage.vue +++ b/WonderQ-Admin-UI-Vue/src/pages/SystemResourcePage.vue @@ -23,7 +23,7 @@ import { import LayoutIcon from "@/components/layout/LayoutIcon.vue"; import SystemResourceEditor, { type SystemEditorSavePayload, type SystemResourceName } from "@/components/system/SystemResourceEditor.vue"; import { getMenuIconName } from "@/lib/menu-display"; -import { buildSystemTree, dataScopeLabel, filterSystemTree } from "@/lib/system-resource"; +import { buildSystemTree, dataScopeLabel, filterSystemTree, hydrateMenuTree } from "@/lib/system-resource"; import type { SystemDeptCreate, SystemDeptItem, @@ -144,7 +144,8 @@ async function loadResource() { if (resource.value === "menus") { const result = await getSystemMenus(); menuItems.value = result.items; - menuTree.value = result.tree?.length ? result.tree : buildMenuTree(result.items); + const responseTree = result.tree?.length ? result.tree : buildMenuTree(result.items); + menuTree.value = hydrateMenuTree(responseTree, result.items); items.value = result.items; } if (resource.value === "depts") { @@ -412,7 +413,7 @@ onMounted(loadResource); - +