flipped-aurora/gin-vue-admin · error

sys_base_menus父级菜单初始化失败!

Error message

sys_base_menus父级菜单初始化失败!

What it means

Thrown by the menu initializer (initMenu.InitializeData) when the batch insert of the top-level (ParentId=0) seed menus into sys_base_menus fails. The error wraps the GORM error and names the table plus the phase (父级菜单), distinguishing it from the later child-menu insert failure.

Source

Thrown at server/source/system/menu.go:73

	allMenus := []SysBaseMenu{
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "dashboard", Name: "dashboard", Component: "view/dashboard/index.vue", Sort: 1, Meta: Meta{Title: "仪表盘", Icon: "odometer"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "permission", Name: "permission", Component: "view/routerHolder.vue", Sort: 2, Meta: Meta{Title: "权限管理", Icon: "perm-gva"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "org", Name: "org", Component: "view/routerHolder.vue", Sort: 3, Meta: Meta{Title: "组织管理", Icon: "share"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "systemConfig", Name: "systemConfig", Component: "view/routerHolder.vue", Sort: 4, Meta: Meta{Title: "系统设置", Icon: "config-gva"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "monitor", Name: "monitor", Component: "view/routerHolder.vue", Sort: 5, Meta: Meta{Title: "运维监控", Icon: "monitor-gva"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "media", Name: "media", Component: "view/routerHolder.vue", Sort: 6, Meta: Meta{Title: "媒体管理", Icon: "folder-opened"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "systemTools", Name: "systemTools", Component: "view/routerHolder.vue", Sort: 7, Meta: Meta{Title: "编程辅助", Icon: "cpu"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "ai", Name: "ai", Component: "view/routerHolder.vue", Sort: 8, Meta: Meta{Title: "AI 工坊", Icon: "ai-gva"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "example", Name: "example", Component: "view/example/index.vue", Sort: 9, Meta: Meta{Title: "示例文件", Icon: "example-gva"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "plugin", Name: "plugin", Component: "view/routerHolder.vue", Sort: 10, Meta: Meta{Title: "插件系统", Icon: "cherry"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "https://www.gin-vue-admin.com", Name: "https://www.gin-vue-admin.com", Component: "/", Sort: 11, Meta: Meta{Title: "官方网站", Icon: "customer-gva"}},
		{MenuLevel: 0, Hidden: false, ParentId: 0, Path: "about", Name: "about", Component: "view/about/index.vue", Sort: 12, Meta: Meta{Title: "关于我们", Icon: "office-building"}},
		{MenuLevel: 0, Hidden: true, ParentId: 0, Path: "person", Name: "person", Component: "view/person/person.vue", Sort: 13, Meta: Meta{Title: "个人信息", Icon: "postcard"}},
	}

	// 先创建父级菜单(ParentId = 0 的菜单)
	if err = db.Create(&allMenus).Error; err != nil {
		return ctx, errors.Wrap(err, SysBaseMenu{}.TableName()+"父级菜单初始化失败!")
	}

	// 建立菜单映射 - 通过Name查找已创建的菜单及其ID
	menuNameMap := make(map[string]uint)
	for _, menu := range allMenus {
		menuNameMap[menu.Name] = menu.ID
	}

	// 定义子菜单,并设置正确的ParentId
	childMenus := []SysBaseMenu{
		// 权限管理
		{MenuLevel: 1, Hidden: false, ParentId: menuNameMap["permission"], Path: "authority", Name: "authority", Component: "view/superAdmin/authority/authority.vue", Sort: 1, Meta: Meta{Title: "角色管理", Icon: "role-gva"}},
		{MenuLevel: 1, Hidden: false, ParentId: menuNameMap["permission"], Path: "menu", Name: "menu", Component: "view/superAdmin/menu/menu.vue", Sort: 2, Meta: Meta{Title: "菜单管理", Icon: "tickets", KeepAlive: true}},
		{MenuLevel: 1, Hidden: false, ParentId: menuNameMap["permission"], Path: "api", Name: "api", Component: "view/superAdmin/api/api.vue", Sort: 3, Meta: Meta{Title: "api管理", Icon: "api-gva", KeepAlive: true}},
		{MenuLevel: 1, Hidden: false, ParentId: menuNameMap["permission"], Path: "apiToken", Name: "apiToken", Component: "view/systemTools/apiToken/index.vue", Sort: 4, Meta: Meta{Title: "API Token", Icon: "key"}},

		// 组织管理
		{MenuLevel: 1, Hidden: false, ParentId: menuNameMap["org"], Path: "user", Name: "user", Component: "view/superAdmin/user/user.vue", Sort: 1, Meta: Meta{Title: "用户管理", Icon: "user"}},

View on GitHub (pinned to 3136500ef3)

Solutions

  1. Inspect the wrapped GORM error for the exact SQL failure (duplicate key, missing table, etc.)
  2. AutoMigrate SysBaseMenu (and related casbin/menu models) before running the menu initializer
  3. Clear sys_base_menus (or the whole DB) and re-run initialization so seed inserts start clean
  4. Run initialization only once — guard with DataInserted(ctx) / the init flag in system config
  5. Verify DB credentials and writability before invoking the init flow

Example fix

// before: re-running init on seeded DB duplicates menus
ctx, err = initMenu{}.InitializeData(ctx)
// after: only init when not already inserted
if !(initMenu{}).DataInserted(ctx) {
    if err := db.AutoMigrate(&system.SysBaseMenu{}); err != nil { return err }
    ctx, err = initMenu{}.InitializeData(ctx)
}
Defensive patterns

Strategy: validation

Validate before calling

if !db.Migrator().HasTable(&system.SysBaseMenu{}) {
    if err := db.AutoMigrate(&system.SysBaseMenu{}); err != nil { return err }
}
var count int64
if err := db.Model(&system.SysBaseMenu{}).Count(&count).Error; err != nil { return err }
if count > 0 { return nil } // menus already seeded

Type guard

func hasDB(ctx context.Context) (*gorm.DB, bool) {
    db, ok := ctx.Value("db").(*gorm.DB)
    return db, ok && db != nil
}

Try / catch

ctx, err = initMenu{}.InitializeData(ctx)
if err != nil {
    log.Printf("menu seed failed: %v (cause: %v)", err, errors.Cause(err))
    return err
}

Prevention

When it happens

Trigger: db.Create(&allMenus) fails: sys_base_menus table not migrated, duplicate unique key (path/name) from a previous partial init, constraint violation on menu columns, or DB connectivity loss during insert.

Common situations: Re-running initialization on an already-seeded database (duplicate menu Name/Path); partially created menus from an earlier crashed init; model column mismatch after version upgrade changed the menu schema; DB in read-only mode during deploy.

Related errors


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