package models import ( "LAPP_GAAS_GFrame_BACKEND/db" "LAPP_GAAS_GFrame_BACKEND/utils" "fmt" "log" ) /*** *CreateBy:lou *Date:2020/5/15 *TableName:角色关联表 **********/ type RoleMenu struct { RoleId int `xorm:"int(11) pk comment('角色ID')" form:"role_id" json:"role_id"` MenuId int `xorm:"int(11) pk comment('菜单ID')" form:"menu_id" json:"menu_id"` RoleName string `xorm:"comment('角色代码') VARCHAR(14)" form:"rolename" json:"rolename"` Createtime string `xorm:"comment('创建时间') VARCHAR(14)" form:"createtime" json:"createtime"` Lastmodifytime string `xorm:"comment('最近一次更新时间') VARCHAR(14)" form:"lastmodifytime" json:"lastmodifytime"` Lastmodify string `xorm:"comment('最近一次更新人员') VARCHAR(40)" form:"lastmodify" json:"lastmodify"` } type MenuPath struct { Path string `json:"path"` } func (rm *RoleMenu) TableName() string { return "role_menu" } func (rm *RoleMenu) Get() ([]RoleMenu, error) { var r []RoleMenu e := db.Eloquent.Master() table := e.Table("role_menu") if rm.RoleId != 0 { table = table.Where("role_id = ?", rm.RoleId) } if _, err := table.Get(&r); err != nil { return nil, err } return r, nil } func (rm *RoleMenu) GetPermis() ([]string, error) { var r []Menu e := db.Eloquent.Master() err := e.SQL("select menu.permission from menu left join role_menu on role_menu.menu_id=menu.menu_id where role_menu.role_id=? and menu.menu_type in ('F','C')", rm.RoleId).Find(&r) if 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() ([]MenuPath, error) { var r []MenuPath e := db.Eloquent.Master() table := e.Select("menu.path").Table("role_menu") table = table.Join("LEFT", "roletab", "roletab.role_id=role_menu.role_id") table = table.Join("LEFT", "menu", "menu.id=role_menu.menu_id") table = table.Where("roletab.role_name = ? and menu.type=1", rm.RoleName) if err := table.Find(&r); err != nil { return nil, err } return r, nil } func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) { e := db.Eloquent.Master() if _, err := e.Table("role_menu").Where("role_id = ?", roleId).Delete(&RoleMenu{}); err != nil { return false, err } var role Roletab if _, err := e.Table("roletab").Where("role_id = ?", roleId).Get(&role); err != nil { return false, err } //删除casbin_rule sql3 := "delete from casbin_rule where v0= '" + role.RoleKey + "'" _, err := e.Exec(sql3) if err != nil { return false, err } return true, nil } func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int, rolekeys []string) (bool, error) { e := db.Eloquent.Master() roleIds_str := utils.IDsToStringIn(roleIds) if _, err := e.Table("role_menu").Where("role_id in (" + roleIds_str + ")").Delete(&RoleMenu{}); err != nil { return false, err } //添加到casbin_rule中 str := utils.IDsToStrings(rolekeys) sql := "delete from casbin_rule where v0 in (" + str + ")" _, err := e.Exec(sql) if err != nil { return false, err } return true, nil } func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) { var role Roletab e := db.Eloquent.Master() if _, err := e.Table("roletab").Where("role_id = ?", roleId).Get(&role); err != nil { log.Printf("查询错误err1:%v", err) return false, err } var menu []Menu menustr := utils.IDsToStringIn(menuId) log.Println(menustr) if err := e.SQL("select * from menu where menu_id in (" + menustr + ")").Find(&menu); err != nil { return false, err } //ORM不支持批量插入所以需要拼接 sql 串 sql := "INSERT INTO `role_menu` (`role_id`,`menu_id`,`role_name`) VALUES " sql2 := "INSERT INTO casbin_rule (`p_type`,`v0`,`v1`,`v2`) VALUES " for i := 0; i < len(menu); i++ { if len(menu)-1 == i { //最后一条数据 以分号结尾 sql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, menu[i].MenuId, role.RoleKey) if menu[i].MenuType == "A" { sql2 += fmt.Sprintf("('p','%s','%s','%s');", role.RoleKey, menu[i].Path, menu[i].Action) } else { sql2 = sql2[:len(sql2)- 1] } } else { sql += fmt.Sprintf("(%d,%d,'%s'),", role.RoleId, menu[i].MenuId, role.RoleKey) if menu[i].MenuType == "A" { sql2 += fmt.Sprintf("('p','%s','%s','%s'),", role.RoleKey, menu[i].Path, menu[i].Action) } } } _, err := e.Exec(sql) if err != nil { log.Printf("role添加错误:%v", err) } _, err = e.Exec(sql2) if err != nil { log.Printf("casbin_role添加错误:%v", err) } return true, nil } func (rm *RoleMenu) Delete(RoleId string, MenuID string) (bool, error) { e := db.Eloquent.Master() rm.RoleId = utils.ValueToInt(RoleId, 0) table := e.Table("role_menu").Where("role_id = ?", RoleId) if MenuID != "" { table = table.Where("menu_id = ?", MenuID) } if _, err := table.Delete(&rm); err != nil { return false, err } return true, nil }