flipped-aurora/gin-vue-admin · error

为超级管理员分配菜单失败

Error message

为超级管理员分配菜单失败

What it means

After collecting all seeded menus, initMenuAuthority assigns every menu to the super-admin role (authorities[0], ID 888) via the SysBaseMenus association Replace. The GORM association operation failed and was wrapped with this message. The role-menu binding for 888 is then missing, so that role sees no menus.

Solutions

  1. Read the wrapped driver error to find the concrete failure (missing table, constraint, access denied).
  2. Ensure sys_authorities_menus exists with the current schema - let AutoMigrate run during InitDB.
  3. Wipe and re-init the database so authority and menu seeds are consistent.
  4. Verify the authorities context data is complete (3 roles) before the association step.
  5. Check DB connectivity/privileges for the join table and re-run init.
Defensive patterns

Strategy: try-catch

Validate before calling

// ensure prerequisite tables exist before association Replace
for _, t := range []string{"sys_authorities", "sys_base_menus", "sys_authorities_menus"} {
    if !db.Migrator().HasTable(t) { return fmt.Errorf("missing table %s", t) }
}

Try / catch

if err := db.Model(&authorities[0]).Association("SysBaseMenus").Replace(allMenus); err != nil {
    log.Printf("super-admin menu Replace failed: %v", errors.Unwrap(err))
    return err
}

Prevention

When it happens

Trigger: INSERT/UPDATE on sys_authorities_menus (or referenced rows) fails during Replace - e.g. sys_authorities_menus table missing (AutoMigrate skipped), stale schema, FK/constraint violation, dropped connection, or authorities slice being empty/mismatched so Association targets a zero-value authority.

Common situations: Partial re-init where authorities exist but the join table doesn't; older DB with different join-table schema; DB user without write access to join table; running init with an incomplete context so authorities[0] is not role 888.

Related errors


AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31). Data as JSON: /api/errors/fe44359542f2a909. Report an issue: GitHub.

Appendix: source

Thrown at server/source/system/authorities_menus.go:60

		return ctx, errors.Wrap(system.ErrMissingDependentContext, "创建 [菜单-权限] 关联失败, 未找到权限表初始化数据")
	}

	allMenus, ok := ctx.Value(new(initMenu).InitializerName()).([]sysModel.SysBaseMenu)
	if !ok {
		return next, errors.Wrap(errors.New(""), "创建 [菜单-权限] 关联失败, 未找到菜单表初始化数据")
	}
	next = ctx

	// 构建菜单ID映射,方便快速查找
	menuMap := make(map[uint]sysModel.SysBaseMenu)
	for _, menu := range allMenus {
		menuMap[menu.ID] = menu
	}

	// 为不同角色分配不同权限
	// 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) - 拥有部分菜单权限

View on GitHub (pinned to 3136500ef3)