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: 获取路由总树map

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Find the blocking role: SELECT authority_id FROM sys_authority WHERE default_router = '<parentName>'.
  2. Change or clear that role's default_router (role homepage setting) and retry the add.
  3. 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

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.