task-55(账号/权限页面): 实现菜单新增表单

menu-manage-model.ts 增 createMenuForm/flattenMenuNodes/nextSiblingSort;menu-manage-api.ts
增 createMenu POST /api/admin/permission-menus(unwrap+解析落库节点);MenusPage 新增菜单
Dialog(名称/标识/父菜单/路由/排序)校验后提交并刷新。8 用例全过,403 单测 + build 绿。
This commit is contained in:
2026-09-05 15:17:55 +08:00
parent ffb16bea9a
commit aaa943a86d
4 changed files with 192 additions and 4 deletions
@@ -118,6 +118,37 @@ export function buildMenuManageTree(items: MenuManageNode[]): MenuManageNode[] {
return roots
}
/** 展平树为列表(前序),供父级下拉/统计复用。 */
export function flattenMenuNodes(nodes: MenuManageNode[]): MenuManageNode[] {
const out: MenuManageNode[] = []
const walk = (list: MenuManageNode[]) => {
for (const node of list) {
out.push(node)
if (node.children?.length) walk(node.children)
}
}
walk(nodes)
return out
}
/** 同级建议排序:该父下最大 sortOrder + 1;无同级返回 0。 */
export function nextSiblingSort(items: MenuManageNode[], parentId: number | null): number {
let max = -1
for (const item of items) {
if (item.parentId === parentId && item.sortOrder > max) max = item.sortOrder
}
return max + 1
}
/** 新建菜单表单工厂:指定父节点与建议排序,其余默认(menuType=admin)。 */
export function createMenuForm(parentId: number | null, sortOrder: number): MenuManageForm {
return {
...emptyMenuManageForm(),
parentId: typeof parentId === 'number' ? parentId : null,
sortOrder: normalizeMenuSort(sortOrder),
}
}
/** 新建/编辑表单空值工厂:默认菜单类型为 admin、排序 0、根父节点。 */
export function emptyMenuManageForm(): MenuManageForm {
return { name: '', columnKey: '', parentId: null, menuType: ADMIN_MENU_TYPE, routePath: '', sortOrder: 0 }