fix(config): add individual menu CRUD endpoints and fix frontend menu data handling

- Add POST /config/menus (create single menu)
- Add PUT /config/menus/{id} (update single menu)
- Add DELETE /config/menus/{id} (soft delete single menu)
- Frontend MenuConfig was calling individual CRUD routes that didn't exist,
  causing 404 errors on all create/update/delete operations
- Fix frontend to correctly handle nested tree response from backend
This commit is contained in:
iven
2026-04-11 14:34:48 +08:00
parent 0d7d3af0a8
commit 4bfd9573db
3 changed files with 95 additions and 11 deletions

View File

@@ -35,6 +35,20 @@ interface MenuItem {
// --- Helpers ---
/** Convert nested menu tree back to flat list */
function flattenMenuTree(tree: MenuItem[]): MenuItem[] {
const result: MenuItem[] = [];
const walk = (items: MenuItem[]) => {
for (const item of items) {
const { children, ...rest } = item;
result.push(rest as MenuItem);
if (children?.length) walk(children);
}
};
walk(tree);
return result;
}
/** Convert flat menu list to tree structure for Table children prop */
function buildMenuTree(items: MenuItem[]): MenuItem[] {
const map = new Map<string, MenuItem>();
@@ -92,9 +106,10 @@ export default function MenuConfig() {
setLoading(true);
try {
const { data: resp } = await client.get('/config/menus');
const list: MenuItem[] = resp.data ?? resp;
setMenus(list);
setMenuTree(buildMenuTree(list));
// 后端返回嵌套树结构,直接使用
const tree: MenuItem[] = resp.data ?? resp;
setMenus(flattenMenuTree(tree));
setMenuTree(tree);
} catch {
message.error('加载菜单失败');
}