role.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. package models
  2. import (
  3. "github.com/pkg/errors"
  4. "gorm.io/gorm"
  5. orm "device-manage/common/global"
  6. "device-manage/tools"
  7. )
  8. type SysRole struct {
  9. RoleId int `json:"roleId" gorm:"primary_key;AUTO_INCREMENT"` // 角色编码
  10. RoleName string `json:"roleName" gorm:"size:128;"` // 角色名称
  11. Status string `json:"status" gorm:"size:4;"` //
  12. RoleKey string `json:"roleKey" gorm:"size:128;"` //角色代码
  13. RoleSort int `json:"roleSort" gorm:""` //角色排序
  14. Flag string `json:"flag" gorm:"size:128;"` //
  15. CreateBy string `json:"createBy" gorm:"size:128;"` //
  16. UpdateBy string `json:"updateBy" gorm:"size:128;"` //
  17. Remark string `json:"remark" gorm:"size:255;"` //备注
  18. Admin bool `json:"admin" gorm:"size:4;"`
  19. DataScope string `json:"dataScope" gorm:"size:128;"`
  20. BaseModel
  21. Params string `json:"params" gorm:"-"`
  22. MenuIds []int `json:"menuIds" gorm:"-"`
  23. DeptIds []int `json:"deptIds" gorm:"-"`
  24. }
  25. func (SysRole) TableName() string {
  26. return "sys_role"
  27. }
  28. type MenuIdList struct {
  29. MenuId int `json:"menuId"`
  30. }
  31. func (role *SysRole) GetById(tx *gorm.DB, id interface{}) error {
  32. return tx.First(role, id).Error
  33. }
  34. func (role *SysRole) GetPage(pageSize int, pageIndex int) ([]SysRole, int, error) {
  35. var doc []SysRole
  36. table := orm.Eloquent.Table("sys_role")
  37. if role.RoleId != 0 {
  38. table = table.Where("role_id = ?", role.RoleId)
  39. }
  40. if role.RoleName != "" {
  41. table = table.Where("role_name = ?", role.RoleName)
  42. }
  43. if role.Status != "" {
  44. table = table.Where("status = ?", role.Status)
  45. }
  46. if role.RoleKey != "" {
  47. table = table.Where("role_key = ?", role.RoleKey)
  48. }
  49. // 数据权限控制
  50. dataPermission := new(DataPermission)
  51. dataPermission.UserId, _ = tools.StringToInt(role.DataScope)
  52. table, err := dataPermission.GetDataScope("sys_role", table)
  53. if err != nil {
  54. return nil, 0, err
  55. }
  56. var count int64
  57. if err := table.Order("role_sort").Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {
  58. return nil, 0, err
  59. }
  60. //table.Where("`deleted_at` IS NULL").Count(&count)
  61. return doc, int(count), nil
  62. }
  63. func (role *SysRole) Get() (SysRole SysRole, err error) {
  64. table := orm.Eloquent.Table("sys_role")
  65. if role.RoleId != 0 {
  66. table = table.Where("role_id = ?", role.RoleId)
  67. }
  68. if role.RoleName != "" {
  69. table = table.Where("role_name = ?", role.RoleName)
  70. }
  71. if err = table.First(&SysRole).Error; err != nil {
  72. return
  73. }
  74. return
  75. }
  76. func (role *SysRole) GetList() (SysRole []SysRole, err error) {
  77. table := orm.Eloquent.Table("sys_role")
  78. if role.RoleId != 0 {
  79. table = table.Where("role_id = ?", role.RoleId)
  80. }
  81. if role.RoleName != "" {
  82. table = table.Where("role_name = ?", role.RoleName)
  83. }
  84. if err = table.Order("role_sort").Find(&SysRole).Error; err != nil {
  85. return
  86. }
  87. return
  88. }
  89. // 获取角色对应的菜单ids
  90. func (role *SysRole) GetRoleMeunId() ([]int, error) {
  91. menuIds := make([]int, 0)
  92. menuList := make([]MenuIdList, 0)
  93. if err := orm.Eloquent.Table("sys_role_menu").Select("sys_role_menu.menu_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_menu.menu_id not in(select sys_menu.parent_id from sys_role_menu LEFT JOIN sys_menu on sys_menu.menu_id=sys_role_menu.menu_id where role_id =? and parent_id is not null)", role.RoleId).Find(&menuList).Error; err != nil {
  94. return nil, err
  95. }
  96. for i := 0; i < len(menuList); i++ {
  97. menuIds = append(menuIds, menuList[i].MenuId)
  98. }
  99. return menuIds, nil
  100. }
  101. func (role *SysRole) Insert() (id int, err error) {
  102. var i int64
  103. orm.Eloquent.Table(role.TableName()).Where("role_name=? or role_key = ?", role.RoleName, role.RoleKey).Count(&i)
  104. if i > 0 {
  105. return 0, errors.New("角色名称或者角色标识已经存在!")
  106. }
  107. role.UpdateBy = ""
  108. result := orm.Eloquent.Table(role.TableName()).Create(&role)
  109. if result.Error != nil {
  110. err = result.Error
  111. return
  112. }
  113. id = role.RoleId
  114. return
  115. }
  116. type DeptIdList struct {
  117. DeptId int `json:"DeptId"`
  118. }
  119. func (role *SysRole) GetRoleDeptId() ([]int, error) {
  120. deptIds := make([]int, 0)
  121. deptList := make([]DeptIdList, 0)
  122. if err := orm.Eloquent.Table("sys_role_dept").Select("sys_role_dept.dept_id").Joins("LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id").Where("role_id = ? ", role.RoleId).Where(" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )", role.RoleId).Find(&deptList).Error; err != nil {
  123. return nil, err
  124. }
  125. for i := 0; i < len(deptList); i++ {
  126. deptIds = append(deptIds, deptList[i].DeptId)
  127. }
  128. return deptIds, nil
  129. }
  130. //修改
  131. func (role *SysRole) Update(id int) (update SysRole, err error) {
  132. if err = orm.Eloquent.Table(role.TableName()).First(&update, id).Error; err != nil {
  133. return
  134. }
  135. if role.RoleName != "" && role.RoleName != update.RoleName {
  136. return update, errors.New("角色名称不允许修改!")
  137. }
  138. if role.RoleKey != "" && role.RoleKey != update.RoleKey {
  139. return update, errors.New("角色标识不允许修改!")
  140. }
  141. //参数1:是要修改的数据
  142. //参数2:是修改的数据
  143. if err = orm.Eloquent.Table(role.TableName()).Model(&update).Updates(&role).Error; err != nil {
  144. return
  145. }
  146. return
  147. }
  148. //批量删除
  149. func (role *SysRole) BatchDelete(id []int) (Result bool, err error) {
  150. tx := orm.Eloquent.Begin()
  151. defer func() {
  152. if r := recover(); r != nil {
  153. tx.Rollback()
  154. }
  155. }()
  156. if err := tx.Error; err != nil {
  157. return false, err
  158. }
  159. // 查询角色
  160. var roles []SysRole
  161. if err := tx.Table("sys_role").Where("role_id in (?)", id).Find(&roles).Error; err != nil {
  162. tx.Rollback()
  163. return false, err
  164. }
  165. var count int64
  166. if err := tx.Table("sys_user").Where("role_id in (?)", id).Count(&count).Error; err != nil {
  167. tx.Rollback()
  168. return false, err
  169. }
  170. if count > 0 {
  171. tx.Rollback()
  172. return false, errors.New("存在绑定用户,请解绑后重试")
  173. }
  174. // 删除角色
  175. if err = tx.Table(role.TableName()).Where("role_id in (?)", id).Unscoped().Delete(&SysRole{}).Error; err != nil {
  176. tx.Rollback()
  177. return false, err
  178. }
  179. // 删除角色菜单
  180. if err := tx.Table("sys_role_menu").Where("role_id in (?)", id).Delete(&RoleMenu{}).Error; err != nil {
  181. tx.Rollback()
  182. return false, err
  183. }
  184. // 删除casbin配置
  185. for i := 0; i < len(roles); i++ {
  186. if err := tx.Table("sys_casbin_rule").Where("v0 in (?)", roles[0].RoleKey).Delete(&CasbinRule{}).Error; err != nil {
  187. tx.Rollback()
  188. return false, err
  189. }
  190. }
  191. if err := tx.Commit().Error; err != nil {
  192. return false, err
  193. }
  194. return true, nil
  195. }