sys_login.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * @desc:登录
  3. * @company:云南奇讯科技有限公司
  4. * @Author: yixiaohu
  5. * @Date: 2022/4/27 21:52
  6. */
  7. package controller
  8. import (
  9. "context"
  10. "github.com/gogf/gf/v2/crypto/gmd5"
  11. "github.com/gogf/gf/v2/errors/gerror"
  12. "github.com/gogf/gf/v2/frame/g"
  13. "github.com/gogf/gf/v2/util/gconv"
  14. "github.com/gogf/gf/v2/util/gmode"
  15. "github.com/tiger1103/gfast/v3/api/v1/system"
  16. commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
  17. "github.com/tiger1103/gfast/v3/internal/app/system/model"
  18. "github.com/tiger1103/gfast/v3/internal/app/system/service"
  19. "github.com/tiger1103/gfast/v3/library/libUtils"
  20. )
  21. var (
  22. Login = loginController{}
  23. )
  24. type loginController struct {
  25. BaseController
  26. }
  27. func (c *loginController) Login(ctx context.Context, req *system.UserLoginReq) (res *system.UserLoginRes, err error) {
  28. var (
  29. user *model.LoginUserRes
  30. token string
  31. permissions []string
  32. menuList []*model.UserMenus
  33. )
  34. //判断验证码是否正确
  35. debug := gmode.IsDevelop()
  36. if !debug {
  37. if !commonService.Captcha().VerifyString(req.VerifyKey, req.VerifyCode) {
  38. err = gerror.New("验证码输入错误")
  39. return
  40. }
  41. }
  42. ip := libUtils.GetClientIp(ctx)
  43. userAgent := libUtils.GetUserAgent(ctx)
  44. user, err = service.SysUser().GetAdminUserByUsernamePassword(ctx, req)
  45. if err != nil {
  46. // 保存登录失败的日志信息
  47. service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{
  48. Status: 0,
  49. Username: req.Username,
  50. Ip: ip,
  51. UserAgent: userAgent,
  52. Msg: err.Error(),
  53. Module: "系统后台",
  54. })
  55. return
  56. }
  57. err = service.SysUser().UpdateLoginInfo(ctx, user.Id, ip)
  58. if err != nil {
  59. return
  60. }
  61. // 报存登录成功的日志信息
  62. service.SysLoginLog().Invoke(ctx, &model.LoginLogParams{
  63. Status: 1,
  64. Username: req.Username,
  65. Ip: ip,
  66. UserAgent: userAgent,
  67. Msg: "登录成功",
  68. Module: "系统后台",
  69. })
  70. key := gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword)
  71. if g.Cfg().MustGet(ctx, "gfToken.multiLogin").Bool() {
  72. key = gconv.String(user.Id) + "-" + gmd5.MustEncryptString(user.UserName) + gmd5.MustEncryptString(user.UserPassword+ip+userAgent)
  73. }
  74. user.UserPassword = ""
  75. token, err = service.GfToken().GenerateToken(ctx, key, user)
  76. if err != nil {
  77. g.Log().Error(ctx, err)
  78. err = gerror.New("登录失败,后端服务出现错误")
  79. return
  80. }
  81. //获取用户菜单数据
  82. menuList, permissions, err = service.SysUser().GetAdminRules(ctx, user.Id)
  83. if err != nil {
  84. return
  85. }
  86. res = &system.UserLoginRes{
  87. UserInfo: user,
  88. Token: token,
  89. MenuList: menuList,
  90. Permissions: permissions,
  91. }
  92. //用户在线状态保存
  93. service.SysUserOnline().Invoke(ctx, &model.SysUserOnlineParams{
  94. UserAgent: userAgent,
  95. Uuid: gmd5.MustEncrypt(token),
  96. Token: token,
  97. Username: user.UserName,
  98. Ip: ip,
  99. })
  100. return
  101. }
  102. // LoginOut 退出登录
  103. func (c *loginController) LoginOut(ctx context.Context, req *system.UserLoginOutReq) (res *system.UserLoginOutRes, err error) {
  104. err = service.GfToken().RemoveToken(ctx, service.GfToken().GetRequestToken(g.RequestFromCtx(ctx)))
  105. return
  106. }