flipped-aurora/gin-vue-admin · error
为普通用户分配菜单失败
Error message
为普通用户分配菜单失败
What it means
initMenuAuthority assigns the basic menu set to the normal-user role (authorities[1], ID 8881) via Association Replace on SysBaseMenus. The GORM operation failed and was wrapped with this message, leaving role 8881 without menu bindings.
Source
Thrown at server/source/system/authorities_menus.go:75
// 为不同角色分配不同权限
// 1. 超级管理员角色(888) - 拥有所有菜单权限
if err = db.Model(&authorities[0]).Association("SysBaseMenus").Replace(allMenus); err != nil {
return next, errors.Wrap(err, "为超级管理员分配菜单失败")
}
// 2. 普通用户角色(8881) - 仅拥有基础功能菜单
// 仅选择部分父级菜单及其子菜单
var menu8881 []sysModel.SysBaseMenu
// 添加仪表盘、关于我们和个人信息菜单
for _, menu := range allMenus {
if menu.ParentId == 0 && (menu.Name == "dashboard" || menu.Name == "about" || menu.Name == "person" || menu.Name == "state") {
menu8881 = append(menu8881, menu)
}
}
if err = db.Model(&authorities[1]).Association("SysBaseMenus").Replace(menu8881); err != nil {
return next, errors.Wrap(err, "为普通用户分配菜单失败")
}
// 3. 测试角色(9528) - 拥有部分菜单权限
var menu9528 []sysModel.SysBaseMenu
// 添加所有父级菜单
for _, menu := range allMenus {
if menu.ParentId == 0 {
menu9528 = append(menu9528, menu)
}
}
// 添加部分子菜单 - 系统工具、示例文件等模块的子菜单
for _, menu := range allMenus {
parentName := ""
if menu.ParentId > 0 && menuMap[menu.ParentId].Name != "" {
parentName = menuMap[menu.ParentId].Name
}View on GitHub (pinned to 3136500ef3)
Solutions
- Inspect the wrapped cause (unknown column, FK failure, access denied).
- Re-run a clean InitDB on an empty database so authority/menu seeds and join rows stay consistent.
- Confirm AutoMigrate created sys_authorities_menus with the current version's schema.
- Ensure initAuthority produced all 4 seeded roles so authorities[1] is the expected 8881 role.
- Verify DB write permissions and retry init.
Defensive patterns
Strategy: try-catch
Validate before calling
// guard index and table existence before Replace
if len(authorities) < 2 { return errors.New("authority seed incomplete") }
if !db.Migrator().HasTable("sys_authorities_menus") { return errors.New("join table missing") } Try / catch
if err := db.Model(&authorities[1]).Association("SysBaseMenus").Replace(menu8881); err != nil {
return fmt.Errorf("role 8881 menu binding failed: %w", err)
} Prevention
- Verify initAuthority seeded all expected roles before this step
- Avoid re-init over partially written join rows - re-init from empty DB
- Keep AutoMigrate enabled so join-table schema matches
- Check driver error via errors.Unwrap for FK/privilege issues
When it happens
Trigger: Replace on the sys_authorities_menus join table fails for authority 8881 - missing/stale join table schema, FK violation because seeded menus or the authority row are absent, connection failure, or write privilege denied.
Common situations: Re-init on a DB where sys_authorities were seeded differently (fewer than 3 roles, so authorities[1] is the wrong row); interrupted previous init leaving partial join rows; older schema after upgrading gin-vue-admin.
Related errors
- 为超级管理员分配菜单失败
- 为测试角色分配菜单失败
- media.FileUploadAndDownload表数据初始化失败!
- sys_apis表数据初始化失败!
- sys_ignore_apis表数据初始化失败!
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/00173bf6b9620a83.
Report an issue: GitHub.