context.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package service
  2. import (
  3. "context"
  4. "dashoo.cn/micro/app/dao"
  5. "dashoo.cn/micro/app/model"
  6. "dashoo.cn/opms_libary/micro_srv"
  7. "dashoo.cn/opms_libary/request"
  8. "fmt"
  9. "github.com/gogf/gf/container/gset"
  10. "github.com/gogf/gf/database/gdb"
  11. "github.com/gogf/gf/errors/gerror"
  12. "github.com/gogf/gf/frame/g"
  13. "github.com/gogf/gf/os/glog"
  14. "github.com/gogf/gf/util/gconv"
  15. "reflect"
  16. )
  17. // Context 上下文管理服务
  18. type contextService struct {
  19. Tenant string `json:"tenant"`
  20. Table string `json:"table"`
  21. CxtUser *request.UserInfo `json:"cxtUser"`
  22. }
  23. // Init 初始化上下文对象指针到上下文对象中,以便后续的请求流程中可以修改。
  24. func (c *contextService) Init(ctx context.Context) (*contextService, error) {
  25. c = new(contextService)
  26. // 获取租户码
  27. tenant, err := micro_srv.GetTenant(ctx)
  28. if err != nil {
  29. return nil, err
  30. }
  31. reqMethod, _ := micro_srv.GetReqMethod(ctx)
  32. glog.Info("Received " + reqMethod + " request @ " + tenant)
  33. c.Tenant = tenant
  34. c.CxtUser = nil
  35. if !micro_srv.IsAuthExclude(ctx) {
  36. userInfo, err := micro_srv.GetUserInfo(ctx)
  37. if err != nil {
  38. return nil, err
  39. }
  40. c.CxtUser = &userInfo
  41. }
  42. return c, nil
  43. }
  44. // checkDataScopeWhere 检查结构体是否存在创建人字段
  45. func (c *contextService) checkDataScopeWhere(entity interface{}) error {
  46. t := reflect.TypeOf(entity)
  47. if t.Kind() == reflect.Ptr {
  48. t = t.Elem()
  49. }
  50. if _, ok := t.FieldByName("CreatedBy"); !ok {
  51. return gerror.New("结构体不存在创建人字段")
  52. }
  53. return nil
  54. }
  55. // SetDataScopeWhere 设置数据权限
  56. func (c *contextService) SetDataScopeWhere(M *gdb.Model) (*gdb.Model, error) {
  57. where, err := c.GetDataScopeWhere()
  58. if err != nil {
  59. return nil, err
  60. }
  61. if where == nil {
  62. return M, nil
  63. }
  64. M = M.LeftJoin(dao.SysUser.Table, "user", fmt.Sprintf("%v.created_by=`user`.id", c.Table)).Where(where)
  65. return M, nil
  66. }
  67. // GetDataScopeWhere 获取数据权限判断条件
  68. func (c *contextService) GetDataScopeWhere() (where g.Map, err error) {
  69. userSrv := &userService{
  70. contextService: c,
  71. Dao: dao.NewSysUserDao(c.Tenant),
  72. }
  73. roleSrv := &roleService{
  74. contextService: c,
  75. Dao: dao.NewSysRoleDao(c.Tenant),
  76. }
  77. deptSrv := &deptService{
  78. contextService: c,
  79. Dao: dao.NewSysDeptDao(c.Tenant),
  80. }
  81. userInfo := c.CxtUser
  82. whereJustMe := g.Map{} //本人数据权限
  83. //若存在用户id的字段,则生成判断数据权限的条件
  84. //1、获取当前用户所属角色
  85. roles, err := userSrv.GetRolesByUserId(userInfo.Id)
  86. if err != nil {
  87. return nil, err
  88. }
  89. //2获取角色对应数据权限
  90. deptIdArr := gset.New()
  91. for _, role := range roles {
  92. switch role.DataScope {
  93. case "10": //全部数据权限
  94. return nil, nil
  95. case "20": //自定数据权限
  96. deptIds, err := roleSrv.GetRoleDeptTreeselect(gconv.Int64(role.Id))
  97. if err != nil {
  98. return nil, err
  99. }
  100. deptIdArr.Add(gconv.Interfaces(deptIds)...)
  101. case "30": //本部门数据权限
  102. deptIdArr.Add(gconv.Int64(userInfo.DeptId))
  103. case "40": //本部门及以下数据权限
  104. deptIdArr.Add(gconv.Int64(userInfo.DeptId))
  105. //获取正常状态部门数据
  106. depts, err := deptSrv.GetList(&model.SysDeptSearchParams{Status: "10"})
  107. if err != nil {
  108. return nil, err
  109. }
  110. childrenList := deptSrv.FindSonByParentId(depts, userInfo.DeptId)
  111. for _, children := range childrenList {
  112. deptIdArr.Add(gconv.Int64(children.Id))
  113. }
  114. case "50": //仅本人数据权限
  115. whereJustMe = g.Map{"`user`.id": userInfo.Id}
  116. }
  117. }
  118. if deptIdArr.Size() > 0 {
  119. where = g.Map{"`user`.dept_id": deptIdArr.Slice()}
  120. } else if len(whereJustMe) > 0 {
  121. where = whereJustMe
  122. }
  123. return
  124. }
  125. func (c *contextService) GetCxtUserId() int {
  126. if c.CxtUser == nil {
  127. return -1
  128. }
  129. return c.CxtUser.Id
  130. }
  131. func (c *contextService) GetCxtUserUuid() string {
  132. if c.CxtUser == nil {
  133. return "-1"
  134. }
  135. return c.CxtUser.Uuid
  136. }
  137. func (c *contextService) GetCxtUserName() string {
  138. if c.CxtUser == nil {
  139. return "-1"
  140. }
  141. return c.CxtUser.UserName
  142. }
  143. func (c *contextService) GetCxtUserDeptId() int {
  144. if c.CxtUser == nil {
  145. return -1
  146. }
  147. return c.CxtUser.DeptId
  148. }