rolemenu.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package models
  2. import (
  3. "fmt"
  4. orm "device-manage/common/global"
  5. "device-manage/tools"
  6. )
  7. type RoleMenu struct {
  8. RoleId int `gorm:""`
  9. MenuId int `gorm:""`
  10. RoleName string `gorm:"size:128)"`
  11. CreateBy string `gorm:"size:128)"`
  12. UpdateBy string `gorm:"size:128)"`
  13. }
  14. func (RoleMenu) TableName() string {
  15. return "sys_role_menu"
  16. }
  17. type MenuPath struct {
  18. Path string `json:"path"`
  19. }
  20. func (rm *RoleMenu) Get() ([]RoleMenu, error) {
  21. var r []RoleMenu
  22. table := orm.Eloquent.Table("sys_role_menu")
  23. if rm.RoleId != 0 {
  24. table = table.Where("role_id = ?", rm.RoleId)
  25. }
  26. if err := table.Find(&r).Error; err != nil {
  27. return nil, err
  28. }
  29. return r, nil
  30. }
  31. func (rm *RoleMenu) GetPermis() ([]string, error) {
  32. var r []Menu
  33. table := orm.Eloquent.Select("sys_menu.permission").Table("sys_menu").Joins("left join sys_role_menu on sys_menu.menu_id = sys_role_menu.menu_id")
  34. table = table.Where("role_id = ?", rm.RoleId)
  35. table = table.Where("sys_menu.menu_type in('F','C')")
  36. if err := table.Find(&r).Error; err != nil {
  37. return nil, err
  38. }
  39. var list []string
  40. for i := 0; i < len(r); i++ {
  41. list = append(list, r[i].Permission)
  42. }
  43. return list, nil
  44. }
  45. func (rm *RoleMenu) GetIDS() ([]MenuPath, error) {
  46. var r []MenuPath
  47. table := orm.Eloquent.Select("sys_menu.path").Table("sys_role_menu")
  48. table = table.Joins("left join sys_role on sys_role.role_id=sys_role_menu.role_id")
  49. table = table.Joins("left join sys_menu on sys_menu.id=sys_role_menu.menu_id")
  50. table = table.Where("sys_role.role_name = ? and sys_menu.type=1", rm.RoleName)
  51. if err := table.Find(&r).Error; err != nil {
  52. return nil, err
  53. }
  54. return r, nil
  55. }
  56. func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) {
  57. tx := orm.Eloquent.Begin()
  58. defer func() {
  59. if r := recover(); r != nil {
  60. tx.Rollback()
  61. }
  62. }()
  63. fmt.Println("delete role id:%s", roleId)
  64. fmt.Println("delete role id:%s", roleId)
  65. if err := tx.Error; err != nil {
  66. return false, err
  67. }
  68. if err := tx.Table("sys_role_dept").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
  69. tx.Rollback()
  70. return false, err
  71. }
  72. if err := tx.Table("sys_role_menu").Where("role_id = ?", roleId).Delete(&rm).Error; err != nil {
  73. tx.Rollback()
  74. return false, err
  75. }
  76. var role SysRole
  77. if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
  78. tx.Rollback()
  79. return false, err
  80. }
  81. sql3 := "delete from sys_casbin_rule where v0= '" + role.RoleKey + "';"
  82. if err := tx.Exec(sql3).Error; err != nil {
  83. tx.Rollback()
  84. return false, err
  85. }
  86. if err := tx.Commit().Error; err != nil {
  87. return false, err
  88. }
  89. return true, nil
  90. }
  91. // 该方法即将弃用
  92. func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int) (bool, error) {
  93. tx := orm.Eloquent.Begin()
  94. defer func() {
  95. if r := recover(); r != nil {
  96. tx.Rollback()
  97. }
  98. }()
  99. if err := tx.Error; err != nil {
  100. return false, err
  101. }
  102. if err := tx.Table("sys_role_menu").Where("role_id in (?)", roleIds).Delete(&rm).Error; err != nil {
  103. tx.Rollback()
  104. return false, err
  105. }
  106. var role []SysRole
  107. if err := tx.Table("sys_role").Where("role_id in (?)", roleIds).Find(&role).Error; err != nil {
  108. tx.Rollback()
  109. return false, err
  110. }
  111. sql := ""
  112. for i := 0; i < len(role); i++ {
  113. sql += "delete from sys_casbin_rule where v0= '" + role[i].RoleName + "';"
  114. }
  115. if err := tx.Exec(sql).Error; err != nil {
  116. tx.Rollback()
  117. return false, err
  118. }
  119. if err := tx.Commit().Error; err != nil {
  120. return false, err
  121. }
  122. return true, nil
  123. }
  124. func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) {
  125. var (
  126. role SysRole
  127. menu []Menu
  128. casbinRuleQueue []CasbinRule // casbinRule 待插入队列
  129. )
  130. // 开始事务
  131. tx := orm.Eloquent.Begin()
  132. defer func() {
  133. if r := recover(); r != nil {
  134. tx.Rollback()
  135. }
  136. }()
  137. if err := tx.Error; err != nil {
  138. return false, err
  139. }
  140. // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db')
  141. if err := tx.Table("sys_role").Where("role_id = ?", roleId).First(&role).Error; err != nil {
  142. tx.Rollback()
  143. return false, err
  144. }
  145. if err := tx.Table("sys_menu").Where("menu_id in (?)", menuId).Find(&menu).Error; err != nil {
  146. tx.Rollback()
  147. return false, err
  148. }
  149. //ORM不支持批量插入所以需要拼接 sql 串
  150. sysRoleMenuSql := "INSERT INTO `sys_role_menu` (`role_id`,`menu_id`,`role_name`) VALUES "
  151. casbinRuleSql := "INSERT INTO `sys_casbin_rule` (`p_type`,`v0`,`v1`,`v2`) VALUES "
  152. for i, m := range menu {
  153. // 拼装'role_menu'表批量插入SQL语句
  154. sysRoleMenuSql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, m.MenuId, role.RoleKey)
  155. if i == len(menu)-1 {
  156. sysRoleMenuSql += ";" //最后一条数据 以分号结尾
  157. } else {
  158. sysRoleMenuSql += ","
  159. }
  160. if m.MenuType == "A" {
  161. // 加入队列
  162. casbinRuleQueue = append(casbinRuleQueue,
  163. CasbinRule{
  164. V0: role.RoleKey,
  165. V1: m.Path,
  166. V2: m.Action,
  167. })
  168. }
  169. }
  170. // 执行批量插入sys_role_menu
  171. if err := tx.Exec(sysRoleMenuSql).Error; err != nil {
  172. tx.Rollback()
  173. return false, err
  174. }
  175. // 拼装'sys_casbin_rule'批量插入SQL语句
  176. // TODO: casbinRuleQueue队列不为空时才会拼装,否则直接忽略不执行'for'循环
  177. for i, v := range casbinRuleQueue {
  178. casbinRuleSql += fmt.Sprintf("('p','%s','%s','%s')", v.V0, v.V1, v.V2)
  179. if i == len(casbinRuleQueue)-1 {
  180. casbinRuleSql += ";"
  181. } else {
  182. casbinRuleSql += ","
  183. }
  184. }
  185. // 执行批量插入sys_casbin_rule
  186. if len(casbinRuleQueue) > 0 {
  187. if err := tx.Exec(casbinRuleSql).Error; err != nil {
  188. tx.Rollback()
  189. return false, err
  190. }
  191. }
  192. if err := tx.Commit().Error; err != nil {
  193. return false, err
  194. }
  195. return true, nil
  196. }
  197. func (rm *RoleMenu) Delete(RoleId string, MenuID string) (bool, error) {
  198. rm.RoleId, _ = tools.StringToInt(RoleId)
  199. table := orm.Eloquent.Table("sys_role_menu").Where("role_id = ?", RoleId)
  200. if MenuID != "" {
  201. table = table.Where("menu_id = ?", MenuID)
  202. }
  203. if err := table.Delete(&rm).Error; err != nil {
  204. return false, err
  205. }
  206. return true, nil
  207. }