context.go 4.8 KB

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