sys_user.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * @desc:用户处理
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu
  5. * @Date: 2022/3/7 9:50
  6. */
  7. package service
  8. import (
  9. "context"
  10. "github.com/gogf/gf/v2/container/gset"
  11. "github.com/gogf/gf/v2/errors/gerror"
  12. "github.com/gogf/gf/v2/frame/g"
  13. "github.com/gogf/gf/v2/os/gtime"
  14. "github.com/mssola/user_agent"
  15. "github.com/tiger1103/gfast/v3/api/v1/system"
  16. "github.com/tiger1103/gfast/v3/internal/app/system/model"
  17. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/dao"
  18. "github.com/tiger1103/gfast/v3/internal/app/system/service/internal/do"
  19. "github.com/tiger1103/gfast/v3/library/libUtils"
  20. "github.com/tiger1103/gfast/v3/library/liberr"
  21. )
  22. type IUser interface {
  23. GetAdminUserByUsernamePassword(ctx context.Context, req *system.UserLoginReq) (user *model.LoginUserRes, err error)
  24. LoginLog(ctx context.Context, params *model.LoginLogParams)
  25. UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error)
  26. NotCheckAuthAdminIds(ctx context.Context) *gset.Set
  27. }
  28. type userImpl struct{}
  29. var (
  30. notCheckAuthAdminIds *gset.Set //无需验证权限的用户id
  31. user = userImpl{}
  32. )
  33. func User() IUser {
  34. return IUser(&user)
  35. }
  36. func (s *userImpl) NotCheckAuthAdminIds(ctx context.Context) *gset.Set {
  37. ids := g.Cfg().MustGet(ctx, "system.notCheckAuthAdminIds")
  38. if !g.IsNil(ids) {
  39. notCheckAuthAdminIds = gset.NewFrom(ids)
  40. }
  41. return notCheckAuthAdminIds
  42. }
  43. func (s *userImpl) GetAdminUserByUsernamePassword(ctx context.Context, req *system.UserLoginReq) (user *model.LoginUserRes, err error) {
  44. err = g.Try(func() {
  45. user, err = s.GetUserByUsername(ctx, req.Username)
  46. liberr.ErrIsNil(ctx, err)
  47. liberr.ValueIsNil(user, "账号密码错误")
  48. //验证密码
  49. if libUtils.EncryptPassword(req.Password, user.UserSalt) != user.UserPassword {
  50. liberr.ErrIsNil(ctx, gerror.New("账号密码错误"))
  51. }
  52. //账号状态
  53. if user.UserStatus == 0 {
  54. liberr.ErrIsNil(ctx, gerror.New("账号已被冻结"))
  55. }
  56. })
  57. return
  58. }
  59. // GetUserByUsername 通过用户名获取用户信息
  60. func (s *userImpl) GetUserByUsername(ctx context.Context, userName string) (user *model.LoginUserRes, err error) {
  61. err = g.Try(func() {
  62. user = &model.LoginUserRes{}
  63. err = dao.SysUser.Ctx(ctx).Fields(user).Where(dao.SysUser.Columns().UserName, userName).Scan(user)
  64. liberr.ErrIsNil(ctx, err, "账号密码错误")
  65. })
  66. return
  67. }
  68. // LoginLog 记录登录日志
  69. func (s *userImpl) LoginLog(ctx context.Context, params *model.LoginLogParams) {
  70. ua := user_agent.New(params.UserAgent)
  71. browser, _ := ua.Browser()
  72. loginData := &do.SysLoginLog{
  73. LoginName: params.Username,
  74. Ipaddr: params.Ip,
  75. LoginLocation: libUtils.GetCityByIp(params.Ip),
  76. Browser: browser,
  77. Os: ua.OS(),
  78. Status: params.Status,
  79. Msg: params.Msg,
  80. LoginTime: gtime.Now(),
  81. Module: params.Module,
  82. }
  83. _, err := dao.SysLoginLog.Ctx(ctx).Insert(loginData)
  84. if err != nil {
  85. g.Log().Error(ctx, err)
  86. }
  87. }
  88. func (s *userImpl) UpdateLoginInfo(ctx context.Context, id uint64, ip string) (err error) {
  89. g.Try(func() {
  90. _, err = dao.SysUser.Ctx(ctx).WherePri(id).Update(g.Map{
  91. dao.SysUser.Columns().LastLoginIp: ip,
  92. dao.SysUser.Columns().LastLoginTime: gtime.Now(),
  93. })
  94. liberr.ErrIsNil(ctx, err, "更新用户登录信息失败")
  95. })
  96. return
  97. }