package model import ( "context" "gorm.io/gorm" ) // RoleMenu 角色-菜单关联 type RoleMenu struct { Id int64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"` RoleId int64 `gorm:"column:role_id;index" json:"roleId"` MenuId int64 `gorm:"column:menu_id;index" json:"menuId"` } func (RoleMenu) TableName() string { return "role_menu" } // RoleMenuFindByRoleId 获取角色的菜单ID列表 func RoleMenuFindByRoleId(ctx context.Context, db *gorm.DB, roleId int64) ([]int64, error) { var menuIds []int64 err := db.WithContext(ctx).Model(&RoleMenu{}).Where("role_id = ?", roleId).Pluck("menu_id", &menuIds).Error return menuIds, err } // RoleMenuFindByRoleIds 获取多个角色的菜单ID列表(去重) func RoleMenuFindByRoleIds(ctx context.Context, db *gorm.DB, roleIds []int64) ([]int64, error) { var menuIds []int64 if len(roleIds) == 0 { return menuIds, nil } err := db.WithContext(ctx).Model(&RoleMenu{}).Where("role_id IN ?", roleIds).Distinct("menu_id").Pluck("menu_id", &menuIds).Error return menuIds, err } // RoleMenuSetForRole 全量设置角色的菜单(先删后插) func RoleMenuSetForRole(ctx context.Context, db *gorm.DB, roleId int64, menuIds []int64) error { return db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { // 删除旧关联 if err := tx.Where("role_id = ?", roleId).Delete(&RoleMenu{}).Error; err != nil { return err } // 插入新关联 if len(menuIds) == 0 { return nil } records := make([]RoleMenu, 0, len(menuIds)) for _, menuId := range menuIds { records = append(records, RoleMenu{RoleId: roleId, MenuId: menuId}) } return tx.Create(&records).Error }) } // RoleMenuDeleteByRoleId 删除角色的所有菜单关联 func RoleMenuDeleteByRoleId(ctx context.Context, db *gorm.DB, roleId int64) error { return db.WithContext(ctx).Where("role_id = ?", roleId).Delete(&RoleMenu{}).Error }