package service import ( "context" "go-user-service/config" "go-user-service/libs" "go-user-service/models" userpb "go-user-service/proto/gen" "go-user-service/utils" "log" "sync" "time" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) type UserService struct { userpb.UnimplementedUserServiceServer mu sync.RWMutex } // 登录 func (u *UserService) Login(ctx context.Context, req *userpb.LoginRequest) (*userpb.LoginResponse, error) { appConfig, _ := config.LoadConfig() Snowflake, _ := utils.NewSnowflake(appConfig.WorkerID, appConfig.DatacenterID) u.mu.RLock() defer u.mu.RUnlock() // 查询是否有这个用户名 var user models.User db := libs.GetDB() db.Model(&models.User{}).Where("username = ?", req.Username).First(&user) if user.Username != "" { // 验证密码 var crypto utils.Crypto log.Println(req.Password + user.Salt) verify := crypto.PasswordVerify(user.Password, req.Password+user.Salt) if verify { token, _ := crypto.GenerateStateToken(32) tokenId := Snowflake.NextID() db.Create(&models.UserToken{ ID: tokenId, UserId: user.ID, Token: token, ExpirationTime: time.Now().Add(24 * time.Hour), CreatedAt: time.Now(), UpdatedAt: time.Now(), }) return &userpb.LoginResponse{ UserId: user.ID, Username: user.Username, Email: user.Email, AccessToken: token, ExpiresIn: 86400, // 24小时 }, nil } return nil, status.Errorf(codes.Unauthenticated, "密码错误") } return nil, status.Errorf(codes.NotFound, "用户不存在") } // 注册 func (u *UserService) Register(ctx context.Context, req *userpb.RegisterRequest) (*userpb.RegisterResponse, error) { appConfig, _ := config.LoadConfig() Snowflake, _ := utils.NewSnowflake(appConfig.WorkerID, appConfig.DatacenterID) var crypto utils.Crypto u.mu.RLock() defer u.mu.RUnlock() // 查询是否有这个用户名 var user models.User db := libs.GetDB() db.Model(&models.User{}).Where("username = ?", req.Username).First(&user) if user.Username == req.Username { return nil, status.Errorf(codes.AlreadyExists, "用户名已存在") } db.Model(&models.User{}).Where("email = ?", req.Email).First(&user) if user.Email == req.Email { return nil, status.Errorf(codes.AlreadyExists, "邮箱已存在") } userId := Snowflake.NextID() salt := crypto.GetRandString(10) log.Println(req.Password + salt) hashPassword, _ := crypto.PasswordEncryption(req.Password + salt) db.Create(&models.User{ ID: userId, Nickname: req.Nickname, Username: req.Username, Password: hashPassword, Email: req.Email, Phone: req.Phone, Status: 1, Salt: salt, CreatedAt: time.Now(), UpdatedAt: time.Now(), }) return &userpb.RegisterResponse{ UserId: userId, Username: req.Username, Email: req.Email, }, nil } // 验证token信息 func (u *UserService) ValidateToken(ctx context.Context, req *userpb.ValidateTokenRequest) (*userpb.ValidateTokenResponse, error) { u.mu.RLock() defer u.mu.RUnlock() // 查询是否有这个用户名 var userToken models.UserToken var user models.User db := libs.GetDB() db.Model(&models.UserToken{}).Where("token = ? and expiration_time>?", req.AccessToken, time.Now()).First(&userToken) if userToken.Token != req.AccessToken { return &userpb.ValidateTokenResponse{ IsValid: false, }, nil } db.Model(&models.User{}).Where("id = ?", userToken.UserId).First(&user) return &userpb.ValidateTokenResponse{ UserId: int64(userToken.UserId), IsValid: true, }, nil }