flipped-aurora/gin-vue-admin · error
父菜单已被其他角色的首页占用,请先释放父菜单的首页权限
Error message
父菜单已被其他角色的首页占用,请先释放父菜单的首页权限
What it means
In AddBaseMenu, when adding a child under a parent menu, the service checks whether any role (SysAuthority) already uses the parent menu's name as its default_router (homepage). If so, reparenting/adding under it would conflict with role homepages, so the transaction aborts with this error.
Source
Thrown at server/service/system/sys_menu.go:170
}
// 检查父菜单下现有子菜单数量
var existingChildrenCount int64
err := tx.Model(&system.SysBaseMenu{}).Where("parent_id = ?", menu.ParentId).Count(&existingChildrenCount).Error
if err != nil {
return err
}
// 如果父菜单原本是叶子菜单(没有子菜单),现在要变成枝干菜单,需要清空其权限分配
if existingChildrenCount == 0 {
// 检查父菜单是否被其他角色设置为首页
var defaultRouterCount int64
err := tx.Model(&system.SysAuthority{}).Where("default_router = ?", parentMenu.Name).Count(&defaultRouterCount).Error
if err != nil {
return err
}
if defaultRouterCount > 0 {
return errors.New("父菜单已被其他角色的首页占用,请先释放父菜单的首页权限")
}
// 清空父菜单的所有权限分配
err = tx.Where("sys_base_menu_id = ?", menu.ParentId).Delete(&system.SysAuthorityMenu{}).Error
if err != nil {
return err
}
}
}
// 创建菜单
return tx.Create(&menu).Error
})
}
//@author: [piexlmax](https://github.com/piexlmax)
//@function: getBaseMenuTreeMap
//@description: 获取路由总树mapView on GitHub (pinned to 3136500ef3)
Solutions
- Find the blocking role: SELECT authority_id FROM sys_authority WHERE default_router = '<parentName>'.
- Change or clear that role's default_router (role homepage setting) and retry the add.
- Choose a different parent menu that is not used as any role's homepage.
Example fix
// before
await addMenu({ name: 'subPage', parentId: parentMenu.ID }) // parent is some role's default_router
// after
await updateAuthority({ authorityId, defaultRouter: '' }) // release homepage first
await addMenu({ name: 'subPage', parentId: parentMenu.ID }) Defensive patterns
Strategy: validation
Validate before calling
// ask backend or check role settings before adding a child under parentMenu
const roles = (await authorityApi.getAuthorityList()).data.list
const conflict = roles.some(r => r.defaultRouter === parentMenu.name)
if (conflict) {
alert('父菜单正被用作角色首页,请先在角色设置中释放 default_router')
return
} Try / catch
try {
await menuApi.addMenu(newMenu)
} catch (e) {
if (String(e.msg).includes('父菜单已被其他角色的首页占用')) {
showReleaseHomepageDialog(parentMenu) // guide admin to clear default_router
} else throw e
} Prevention
- Track which menus are referenced by sys_authority.default_router before restructuring the tree.
- Clear a role's homepage setting before moving/removing its menu.
- Audit default_router values after environment copies for stale names.
When it happens
Trigger: Adding a menu whose ParentId points to a parent menu whose Name equals some role's default_router value in sys_authority.
Common situations: An admin set a parent menu as a role's homepage (default_router), then tries to restructure the tree by hanging new children under it; environment copies where default_router still references an old menu name.
Related errors
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/d3af440e9af6d2f4.
Report an issue: GitHub.