loginlogic.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package logic
  2. import (
  3. "context"
  4. "slowwild/internal/svc"
  5. "slowwild/internal/errorx"
  6. "slowwild/internal/model"
  7. "slowwild/internal/utils"
  8. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserver"
  9. "github.com/zeromicro/go-zero/core/logx"
  10. )
  11. type LoginLogic struct {
  12. ctx context.Context
  13. svcCtx *svc.ServiceContext
  14. logx.Logger
  15. }
  16. func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic {
  17. return &LoginLogic{
  18. ctx: ctx,
  19. svcCtx: svcCtx,
  20. Logger: logx.WithContext(ctx),
  21. }
  22. }
  23. // 用户登录
  24. func (l *LoginLogic) Login(in *slowwildserver.LoginReq) (*slowwildserver.LoginAndRegisterRsp, error) {
  25. if in.Phone == "" {
  26. return nil, errorx.ErrInvalidParam
  27. }
  28. var user *model.User
  29. var err error
  30. // 查询用户是否存在
  31. user, err = l.svcCtx.UserModel.FindOneByPhone(l.ctx, in.Phone)
  32. if err == model.ErrNotFound {
  33. return nil, errorx.ErrUserNotFound
  34. }
  35. if err != nil {
  36. return nil, errorx.ErrUserQueryFailed
  37. }
  38. // 根据登录方式验证
  39. if in.LoginType == 1 { // 验证码登录
  40. if in.Code == "" {
  41. return nil, errorx.ErrInvalidParam
  42. }
  43. // TODO: 验证验证码
  44. // if !verifyCode(in.Phone, in.Code) {
  45. // return nil, errorx.NewCodeError(10004, "验证码错误")
  46. // }
  47. } else if in.LoginType == 2 { // 密码登录
  48. if in.Password == "" {
  49. return nil, errorx.ErrInvalidParam
  50. }
  51. // 验证密码
  52. if !verifyPassword(user.Password, user.Salt, in.Password) {
  53. return nil, errorx.NewCodeError(10005, "密码错误")
  54. }
  55. } else {
  56. return nil, errorx.ErrInvalidParam
  57. }
  58. // 生成token
  59. token, err := utils.GenerateToken(user.ID)
  60. if err != nil {
  61. return nil, errorx.NewCodeError(10006, "生成token失败")
  62. }
  63. // 更新最后登录IP
  64. err = l.svcCtx.UserModel.UpdateLoginIP(l.ctx, user.ID, in.LoginIp)
  65. if err != nil {
  66. l.Logger.Errorf("更新登录IP失败: %v", err)
  67. }
  68. return &slowwildserver.LoginAndRegisterRsp{
  69. Token: token,
  70. }, nil
  71. }
  72. // 验证密码
  73. func verifyPassword(dbPassword, salt, inputPassword string) bool {
  74. return dbPassword == utils.EncryptPassword(inputPassword, salt)
  75. }