bus_permission.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package service
  2. import (
  3. "dy-admin/internal/pcmserver/global"
  4. "dy-admin/internal/pcmserver/pkg/code"
  5. "dy-admin/internal/pcmserver/sys/model"
  6. "dy-admin/internal/pcmserver/sys/service"
  7. "dy-admin/pkg/rescode"
  8. "github.com/gin-gonic/gin"
  9. "gorm.io/gorm"
  10. "strconv"
  11. )
  12. // BusPermission 业务上的数据权限
  13. // 只针对这个柜子系统。柜子系统业务表上都有部门id。根据部门id来判断数据权限
  14. type BusPermission struct {
  15. DataScope int
  16. DeptIDs []int
  17. UserID int
  18. }
  19. func NewBusPermission(c *gin.Context) (*BusPermission, error) {
  20. // 获取用户信息
  21. userInfo := global.JWT.GetUserInfo(c)
  22. // 找到角色对应的数据权限
  23. var roles []model.Role
  24. err := global.DB.Where("role_id in (?)", userInfo.RoleIDs).Find(&roles).Error
  25. if err != nil {
  26. return nil, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  27. }
  28. bp := &BusPermission{DataScope: 5, DeptIDs: make([]int, 0)}
  29. for _, role := range roles {
  30. roleDataScope, err := strconv.Atoi(role.DataScope)
  31. if err != nil {
  32. return nil, err
  33. }
  34. if roleDataScope >= bp.DataScope {
  35. // 数值越大,权限越小。按权限比较大的为准
  36. continue
  37. }
  38. bp.DataScope = roleDataScope
  39. switch role.DataScope {
  40. case "1":
  41. // 全部权限
  42. case "2":
  43. // 自定义数据权限
  44. deptIds, err := service.ServicesGroupApp.RoleService.GetRoleDeptIDs(role.RoleID)
  45. if err != nil {
  46. return bp, err
  47. }
  48. bp.DeptIDs = append(bp.DeptIDs, deptIds...)
  49. case "3":
  50. // 本部门数据权限
  51. bp.DeptIDs = append(bp.DeptIDs, userInfo.DeptID)
  52. case "4":
  53. // 本部门及以下数据权限
  54. sons, err := service.ServicesGroupApp.DeptService.GetSonDeptIds(userInfo.DeptID)
  55. if err != nil {
  56. return bp, err
  57. }
  58. bp.DeptIDs = append(bp.DeptIDs, sons...)
  59. case "5":
  60. // 仅本人数据权限
  61. bp.UserID = userInfo.UserID
  62. default:
  63. return nil, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDataPermissionCode])
  64. }
  65. }
  66. return bp, nil
  67. }
  68. func Permission(tableName string, p *BusPermission) func(db *gorm.DB) *gorm.DB {
  69. return func(db *gorm.DB) *gorm.DB {
  70. switch p.DataScope {
  71. case 2, 3, 4:
  72. return db.Where(tableName+".department_id in (?)", p.DeptIDs)
  73. case 5:
  74. return db.Where(tableName+".create_by = ?", p.UserID)
  75. default:
  76. return db
  77. }
  78. }
  79. }