context.go 4.6 KB

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