GAAS GFrame项目web后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.8 KiB

  1. package models
  2. import (
  3. "LAPP_GAAS_GFrame_BACKEND/db"
  4. "LAPP_GAAS_GFrame_BACKEND/utils"
  5. "fmt"
  6. "log"
  7. )
  8. /***
  9. *CreateBy:lou
  10. *Date:2020/5/15
  11. *TableName:角色关联表
  12. **********/
  13. type RoleMenu struct {
  14. RoleId int `xorm:"int(11) pk comment('角色ID')" form:"role_id" json:"role_id"`
  15. MenuId int `xorm:"int(11) pk comment('菜单ID')" form:"menu_id" json:"menu_id"`
  16. RoleName string `xorm:"comment('角色代码') VARCHAR(14)" form:"rolename" json:"rolename"`
  17. Createtime string `xorm:"comment('创建时间') VARCHAR(14)" form:"createtime" json:"createtime"`
  18. Lastmodifytime string `xorm:"comment('最近一次更新时间') VARCHAR(14)" form:"lastmodifytime" json:"lastmodifytime"`
  19. Lastmodify string `xorm:"comment('最近一次更新人员') VARCHAR(40)" form:"lastmodify" json:"lastmodify"`
  20. }
  21. type MenuPath struct {
  22. Path string `json:"path"`
  23. }
  24. func (rm *RoleMenu) TableName() string {
  25. return "role_menu"
  26. }
  27. func (rm *RoleMenu) Get() ([]RoleMenu, error) {
  28. var r []RoleMenu
  29. e := db.Eloquent.Master()
  30. table := e.Table("role_menu")
  31. if rm.RoleId != 0 {
  32. table = table.Where("role_id = ?", rm.RoleId)
  33. }
  34. if _, err := table.Get(&r); err != nil {
  35. return nil, err
  36. }
  37. return r, nil
  38. }
  39. func (rm *RoleMenu) GetPermis() ([]string, error) {
  40. var r []Menu
  41. e := db.Eloquent.Master()
  42. 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)
  43. if err != nil {
  44. return nil, err
  45. }
  46. var list []string
  47. for i := 0; i < len(r); i++ {
  48. list = append(list, r[i].Permission)
  49. }
  50. return list, nil
  51. }
  52. func (rm *RoleMenu) GetIDS() ([]MenuPath, error) {
  53. var r []MenuPath
  54. e := db.Eloquent.Master()
  55. table := e.Select("menu.path").Table("role_menu")
  56. table = table.Join("LEFT", "roletab", "roletab.role_id=role_menu.role_id")
  57. table = table.Join("LEFT", "menu", "menu.id=role_menu.menu_id")
  58. table = table.Where("roletab.role_name = ? and menu.type=1", rm.RoleName)
  59. if err := table.Find(&r); err != nil {
  60. return nil, err
  61. }
  62. return r, nil
  63. }
  64. func (rm *RoleMenu) DeleteRoleMenu(roleId int) (bool, error) {
  65. e := db.Eloquent.Master()
  66. if _, err := e.Table("role_menu").Where("role_id = ?", roleId).Delete(&RoleMenu{}); err != nil {
  67. return false, err
  68. }
  69. var role Roletab
  70. if _, err := e.Table("roletab").Where("role_id = ?", roleId).Get(&role); err != nil {
  71. return false, err
  72. }
  73. //删除casbin_rule
  74. sql3 := "delete from casbin_rule where v0= '" + role.RoleKey + "'"
  75. _, err := e.Exec(sql3)
  76. if err != nil {
  77. return false, err
  78. }
  79. return true, nil
  80. }
  81. func (rm *RoleMenu) BatchDeleteRoleMenu(roleIds []int, rolekeys []string) (bool, error) {
  82. e := db.Eloquent.Master()
  83. roleIds_str := utils.IDsToStringIn(roleIds)
  84. if _, err := e.Table("role_menu").Where("role_id in (" + roleIds_str + ")").Delete(&RoleMenu{}); err != nil {
  85. return false, err
  86. }
  87. //添加到casbin_rule中
  88. str := utils.IDsToStrings(rolekeys)
  89. sql := "delete from casbin_rule where v0 in (" + str + ")"
  90. _, err := e.Exec(sql)
  91. if err != nil {
  92. return false, err
  93. }
  94. return true, nil
  95. }
  96. func (rm *RoleMenu) Insert(roleId int, menuId []int) (bool, error) {
  97. var role Roletab
  98. e := db.Eloquent.Master()
  99. if _, err := e.Table("roletab").Where("role_id = ?", roleId).Get(&role); err != nil {
  100. log.Printf("查询错误err1:%v", err)
  101. return false, err
  102. }
  103. var menu []Menu
  104. menustr := utils.IDsToStringIn(menuId)
  105. log.Println(menustr)
  106. if err := e.SQL("select * from menu where menu_id in (" + menustr + ")").Find(&menu); err != nil {
  107. return false, err
  108. }
  109. //ORM不支持批量插入所以需要拼接 sql 串
  110. sql := "INSERT INTO `role_menu` (`role_id`,`menu_id`,`role_name`) VALUES "
  111. sql2 := "INSERT INTO casbin_rule (`p_type`,`v0`,`v1`,`v2`) VALUES "
  112. for i := 0; i < len(menu); i++ {
  113. if len(menu)-1 == i {
  114. //最后一条数据 以分号结尾
  115. sql += fmt.Sprintf("(%d,%d,'%s')", role.RoleId, menu[i].MenuId, role.RoleKey)
  116. if menu[i].MenuType == "A" {
  117. sql2 += fmt.Sprintf("('p','%s','%s','%s');", role.RoleKey, menu[i].Path, menu[i].Action)
  118. } else {
  119. sql2 = sql2[:len(sql2)- 1]
  120. }
  121. } else {
  122. sql += fmt.Sprintf("(%d,%d,'%s'),", role.RoleId, menu[i].MenuId, role.RoleKey)
  123. if menu[i].MenuType == "A" {
  124. sql2 += fmt.Sprintf("('p','%s','%s','%s'),", role.RoleKey, menu[i].Path, menu[i].Action)
  125. }
  126. }
  127. }
  128. _, err := e.Exec(sql)
  129. if err != nil {
  130. log.Printf("role添加错误:%v", err)
  131. }
  132. _, err = e.Exec(sql2)
  133. if err != nil {
  134. log.Printf("casbin_role添加错误:%v", err)
  135. }
  136. return true, nil
  137. }
  138. func (rm *RoleMenu) Delete(RoleId string, MenuID string) (bool, error) {
  139. e := db.Eloquent.Master()
  140. rm.RoleId = utils.ValueToInt(RoleId, 0)
  141. table := e.Table("role_menu").Where("role_id = ?", RoleId)
  142. if MenuID != "" {
  143. table = table.Where("menu_id = ?", MenuID)
  144. }
  145. if _, err := table.Delete(&rm); err != nil {
  146. return false, err
  147. }
  148. return true, nil
  149. }