Files
go-user-service/service/user_service.go
2025-09-12 18:25:06 +08:00

124 lines
3.5 KiB
Go

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
}