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.

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)

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.