package service import ( "errors" "time" "github.com/golang-jwt/jwt/v5" "github.com/gouki/lunar-server/internal/config" "github.com/gouki/lunar-server/internal/model" "gorm.io/gorm" ) // UserService 用户服务 type UserService struct { db *gorm.DB } // NewUserService 创建用户服务 func NewUserService() *UserService { return &UserService{ db: config.GetDB(), } } // GetUserByOpenID 根据OpenID获取用户 func (s *UserService) GetUserByOpenID(openID string) (*model.User, error) { var user model.User if err := s.db.Where("open_id = ?", openID).First(&user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return nil, err } return &user, nil } // GetUserByID 根据ID获取用户 func (s *UserService) GetUserByID(id uint) (*model.User, error) { var user model.User if err := s.db.First(&user, id).Error; err != nil { return nil, err } return &user, nil } // CreateUser 创建用户 func (s *UserService) CreateUser(user *model.User) error { return s.db.Create(user).Error } // UpdateUser 更新用户 func (s *UserService) UpdateUser(user *model.User) error { return s.db.Save(user).Error } // UpdateUserProfile 更新用户资料 func (s *UserService) UpdateUserProfile(profile *model.UserProfile) error { return s.db.Save(profile).Error } // GetUserProfile 获取用户资料 func (s *UserService) GetUserProfile(userID uint) (*model.UserProfile, error) { var profile model.UserProfile if err := s.db.Where("user_id = ?", userID).First(&profile).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } return nil, err } return &profile, nil } // GenerateToken 生成JWT Token func (s *UserService) GenerateToken(userID uint, secret string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, "exp": time.Now().Add(time.Hour * 24 * 7).Unix(), // 7天过期 "iat": time.Now().Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(secret)) } // ParseToken 解析JWT Token func (s *UserService) ParseToken(tokenString, secret string) (uint, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { return []byte(secret), nil }) if err != nil { return 0, err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { userID := uint(claims["user_id"].(float64)) return userID, nil } return 0, errors.New("invalid token") }