context.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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/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, myerrors.MicroCallError(err.Error())
  35. }
  36. c.Tenant = tenant
  37. c.CxtUser = nil
  38. if !micro_srv.IsAuthExclude(ctx) {
  39. userInfo, err := micro_srv.GetUserInfo(ctx)
  40. if err != nil {
  41. return nil, myerrors.MicroCallError(err.Error())
  42. }
  43. c.CxtUser = &userInfo
  44. }
  45. c.Ctx = context.WithValue(ctx, "contextService", c)
  46. return c, nil
  47. }
  48. // checkDataScopeWhere 检查结构体是否存在创建人字段
  49. func (c *contextService) checkDataScopeWhere(entity interface{}) error {
  50. t := reflect.TypeOf(entity)
  51. if t.Kind() == reflect.Ptr {
  52. t = t.Elem()
  53. }
  54. if _, ok := t.FieldByName("CreatedBy"); !ok {
  55. return gerror.New("结构体不存在创建人字段")
  56. }
  57. return nil
  58. }
  59. // SetDataScopeWhere 设置数据权限
  60. func (c *contextService) SetDataScopeWhere(M *gdb.Model) (*gdb.Model, error) {
  61. where, err := c.GetDataScopeWhere()
  62. if err != nil {
  63. return nil, err
  64. }
  65. if where == nil {
  66. return M, nil
  67. }
  68. M = M.LeftJoin(dao.SysUser.Table, "user", fmt.Sprintf("%v.created_by=`user`.id", c.Table)).Where(where)
  69. return M, nil
  70. }
  71. // GetDataScopeWhere 获取数据权限判断条件
  72. func (c *contextService) GetDataScopeWhere() (where g.Map, err error) {
  73. userSrv := &UserService{
  74. contextService: c,
  75. Dao: dao.NewSysUserDao(c.Tenant),
  76. }
  77. roleSrv := &RoleService{
  78. contextService: c,
  79. Dao: dao.NewSysRoleDao(c.Tenant),
  80. }
  81. deptSrv := &DeptService{
  82. contextService: c,
  83. Dao: dao.NewSysDeptDao(c.Tenant),
  84. }
  85. userInfo := c.CxtUser
  86. whereJustMe := g.Map{} //本人数据权限
  87. //若存在用户id的字段,则生成判断数据权限的条件
  88. //1、获取当前用户所属角色
  89. roles, err := userSrv.GetRolesByUserId(userInfo.Id)
  90. if err != nil {
  91. return nil, err
  92. }
  93. //2获取角色对应数据权限
  94. deptIdArr := gset.New()
  95. for _, role := range roles {
  96. switch role.DataScope {
  97. case "10": //全部数据权限
  98. return nil, nil
  99. case "20": //自定数据权限
  100. deptIds, err := roleSrv.GetRoleDeptTreeselect(gconv.Int64(role.Id))
  101. if err != nil {
  102. return nil, err
  103. }
  104. deptIdArr.Add(gconv.Interfaces(deptIds)...)
  105. case "30": //本部门数据权限
  106. deptIdArr.Add(gconv.Int64(userInfo.DeptId))
  107. case "40": //本部门及以下数据权限
  108. deptIdArr.Add(gconv.Int64(userInfo.DeptId))
  109. //获取正常状态部门数据
  110. depts, err := deptSrv.GetList(&model.SysDeptSearchParams{Status: "10"})
  111. if err != nil {
  112. return nil, err
  113. }
  114. childrenList := deptSrv.FindSonByParentId(depts, userInfo.DeptId)
  115. for _, children := range childrenList {
  116. deptIdArr.Add(gconv.Int64(children.Id))
  117. }
  118. case "50": //仅本人数据权限
  119. whereJustMe = g.Map{"`user`.id": userInfo.Id}
  120. }
  121. }
  122. if deptIdArr.Size() > 0 {
  123. where = g.Map{"`user`.dept_id": deptIdArr.Slice()}
  124. } else if len(whereJustMe) > 0 {
  125. where = whereJustMe
  126. }
  127. return
  128. }
  129. func (c *contextService) GetCxtUserId() int {
  130. if c.CxtUser == nil {
  131. return -1
  132. }
  133. return c.CxtUser.Id
  134. }
  135. func (c *contextService) GetCxtUserUuid() string {
  136. if c.CxtUser == nil {
  137. return "-1"
  138. }
  139. return c.CxtUser.Uuid
  140. }
  141. func (c *contextService) GetCxtUserName() string {
  142. if c.CxtUser == nil {
  143. return "-1"
  144. }
  145. return c.CxtUser.NickName
  146. }
  147. func (c *contextService) GetCxtUserDingtalkId() string {
  148. if c.CxtUser == nil {
  149. return "-1"
  150. }
  151. return c.CxtUser.DingtalkId
  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. }