user.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package service
  2. import (
  3. "github.com/go-nunu/nunu-layout-advanced/internal/dao"
  4. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  5. "github.com/go-nunu/nunu-layout-advanced/pkg/helper/convert"
  6. "github.com/golang-jwt/jwt/v5"
  7. "github.com/pkg/errors"
  8. "golang.org/x/crypto/bcrypt"
  9. "time"
  10. )
  11. type RegisterRequest struct {
  12. Username string `json:"username" binding:"required"`
  13. Password string `json:"password" binding:"required"`
  14. Email string `json:"email" binding:"required,email"`
  15. }
  16. type LoginRequest struct {
  17. Username string `json:"username" binding:"required"`
  18. Password string `json:"password" binding:"required"`
  19. }
  20. type UpdateProfileRequest struct {
  21. Nickname string `json:"nickname"`
  22. Email string `json:"email" binding:"required,email"`
  23. Avatar string `json:"avatar"`
  24. }
  25. type ChangePasswordRequest struct {
  26. OldPassword string `json:"oldPassword" binding:"required"`
  27. NewPassword string `json:"newPassword" binding:"required"`
  28. }
  29. type UserService struct {
  30. userDao *dao.UserDao
  31. *Service
  32. }
  33. func NewUserService(service *Service, userDao *dao.UserDao) *UserService {
  34. return &UserService{
  35. userDao: userDao,
  36. Service: service,
  37. }
  38. }
  39. func (s *UserService) Register(req *RegisterRequest) error {
  40. // 生成用户ID
  41. userId, err := s.generateUserId()
  42. if err != nil {
  43. return errors.Wrap(err, "failed to generate user ID")
  44. }
  45. // 检查用户名是否已存在
  46. if user, err := s.userDao.GetUserByUsername(req.Username); err == nil && user != nil {
  47. return errors.New("username already exists")
  48. }
  49. hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
  50. if err != nil {
  51. return errors.Wrap(err, "failed to hash password")
  52. }
  53. // 创建用户
  54. user := &model.User{
  55. UserId: userId,
  56. Username: req.Username,
  57. Password: string(hashedPassword),
  58. Email: req.Email,
  59. }
  60. if err = s.userDao.CreateUser(user); err != nil {
  61. return errors.Wrap(err, "failed to create user")
  62. }
  63. return nil
  64. }
  65. func (s *UserService) Login(req *LoginRequest) (string, error) {
  66. user, err := s.userDao.GetUserByUsername(req.Username)
  67. if err != nil || user == nil {
  68. return "", errors.Wrap(err, "failed to get user by username")
  69. }
  70. err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password))
  71. if err != nil {
  72. return "", errors.Wrap(err, "failed to hash password")
  73. }
  74. // 生成JWT token
  75. token, err := s.generateToken(user.UserId)
  76. if err != nil {
  77. return "", errors.Wrap(err, "failed to generate JWT token")
  78. }
  79. return token, nil
  80. }
  81. func (s *UserService) GetProfile(userId string) (*model.User, error) {
  82. user, err := s.userDao.GetUserById(userId)
  83. if err != nil {
  84. return nil, errors.Wrap(err, "failed to get user by ID")
  85. }
  86. return user, nil
  87. }
  88. func (s *UserService) UpdateProfile(userId string, req *UpdateProfileRequest) error {
  89. user, err := s.userDao.GetUserById(userId)
  90. if err != nil {
  91. return errors.Wrap(err, "failed to get user by ID")
  92. }
  93. user.Email = req.Email
  94. user.Nickname = req.Nickname
  95. if err = s.userDao.UpdateUser(user); err != nil {
  96. return errors.Wrap(err, "failed to update user")
  97. }
  98. return nil
  99. }
  100. func (s *UserService) generateUserId() (string, error) {
  101. // 生成分布式ID
  102. id, err := s.sonyflake.NextID()
  103. if err != nil {
  104. return "", errors.Wrap(err, "failed to generate sonyflake ID")
  105. }
  106. // 将ID转换为字符串
  107. return convert.IntToBase62(int(id)), nil
  108. }
  109. func (s *UserService) generateToken(userId string) (string, error) {
  110. // 生成JWT token
  111. s.jwt.GenToken(userId, time.Now().Add(time.Hour*24*90))
  112. token, err := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
  113. "userId": userId,
  114. "exp": time.Now().Add(time.Hour * 24).Unix(),
  115. }).SignedString([]byte("secret"))
  116. if err != nil {
  117. return "", errors.Wrap(err, "failed to generate JWT token")
  118. }
  119. return token, nil
  120. }