package models import ( "gorm.io/gorm" ) type RoleMenu struct { RoleId int `gorm:""` MenuId int `gorm:""` RoleName string `gorm:"size:128)"` CreateBy string `gorm:"size:128)"` UpdateBy string `gorm:"size:128)"` } func (RoleMenu) TableName() string { return "sys_role_menu" } type MenuPath struct { Path string `json:"path"` } //func (rm *RoleMenu) Get(tx *gorm.DB) ([]RoleMenu, error) { // var r []RoleMenu // table := tx.Table("sys_role_menu") // if rm.RoleId != 0 { // table = table.Where("role_id = ?", rm.RoleId) // // } // if err := table.Find(&r).Error; err != nil { // return nil, err // } // return r, nil //} func (rm *RoleMenu) GetPermis(tx *gorm.DB) ([]string, error) { var r []Menu table := tx.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id") table = table.Where("role_id = ?", rm.RoleId) table = table.Where("sys_menu.menu_type in('F','C')") if err := table.Find(&r).Error; err != nil { return nil, err } var list []string for i := 0; i < len(r); i++ { list = append(list, r[i].Permission) } return list, nil } func (rm *RoleMenu) GetIDS(tx *gorm.DB) ([]MenuPath, error) { var r []MenuPath table := tx.Select("sys_menu.path").Table("sys_role_menu") table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id") table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id") table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName) if err := table.Find(&r).Error; err != nil { return nil, err } return r, nil } //func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) { // tx := orm.Eloquent.Begin() // defer func() { // if r := recover(); r != nil { // tx.Rollback() // } // }() // // if err := tx.Error; err != nil { // return false, err // } // // if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { // tx.Rollback() // return false, err // } // if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil { // tx.Rollback() // return false, err // } // var role SysRole // if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { // tx.Rollback() // return false, err // } // sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';" // if err := tx.Exec(sql3).Error; err != nil { // tx.Rollback() // return false, err // } // if err := tx.Commit().Error; err != nil { // return false, err // } // // return true, nil // //} // 该方法即将弃用 //func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int) (bool, error) { // tx := orm.Eloquent.Begin() // defer func() { // if r := recover(); r != nil { // tx.Rollback() // } // }() // // if err := tx.Error; err != nil { // return false, err // } // // if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil { // tx.Rollback() // return false, err // } // var role []SysRole // if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil { // tx.Rollback() // return false, err // } // sql := "" // for i := 0; i < len(role); i++ { // sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';" // } // if err := tx.Exec(sql).Error; err != nil { // tx.Rollback() // return false, err // } // if err := tx.Commit().Error; err != nil { // return false, err // } // return true, nil // //} //func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) { // var ( // role SysRole // menu []Menu // casbinRuleQueue []system.CasbinRule // casbinRule 待插入队列 // ) // // // 开始事务 // tx := orm.Eloquent.Begin() // defer func() { // if r := recover(); r != nil { // tx.Rollback() // } // }() // // if err := tx.Error; err != nil { // return false, err // } // // // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db') // if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil { // tx.Rollback() // return false, err // } // if err := tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil { // tx.Rollback() // return false, err // } // //ORM不支持批量插入所以需要拼接 sql 串 // sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES " // casbinRuleSql := "INSERT INTO `sys_casbin_rule` (`p_type`,`v0`,`v1`,`v2`) VALUES " // // for i, m := range menu { // // 拼装'role_menu'表批量插入SQL语句 // sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey) // if i == len(menu)-1 { // sysRoleMenuSql += ";" //最后一条数据 以分号结尾 // } else { // sysRoleMenuSql += "," // } // if m.MenuType == "A" { // // 加入队列 // casbinRuleQueue = append(casbinRuleQueue, // system.CasbinRule{ // V0: role.RoleKey, // V1: m.Path, // V2: m.Action, // }) // } // } // // 执行批量插入sys_role_menu // if err := tx.Exec(sysRoleMenuSql).Error; err != nil { // tx.Rollback() // return false, err // } // // // 拼装'sys_casbin_rule'批量插入SQL语句 // // TODO: casbinRuleQueue队列不为空时才会拼装,否则直接忽略不执行'for'循环 // for i, v := range casbinRuleQueue { // casbinRuleSql += fmt.Sprintf("('p','%s','%s','%s')", v.V0, v.V1, v.V2) // if i == len(casbinRuleQueue)-1 { // casbinRuleSql += ";" // } else { // casbinRuleSql += "," // } // } // // 执行批量插入sys_casbin_rule // if len(casbinRuleQueue) > 0 { // if err := tx.Exec(casbinRuleSql).Error; err != nil { // tx.Rollback() // return false, err // } // } // // if err := tx.Commit().Error; err != nil { // return false, err // } // return true, nil //} //func (rm *RoleMenu) Delete(RoleId string, MenuID string) (bool, error) { // rm.RoleId, _ = tools.StringToInt(RoleId) // table := orm.Eloquent.Table("sys_role_menu").Where("role_id = ?", RoleId) // if MenuID != "" { // table = table.Where("menu_id = ?", MenuID) // } // if err := table.Delete(&rm).Error; err != nil { // return false, err // } // return true, nil // //}