package logic import ( "context" "errors" "backend/usercenter/orm" "backend/usercenter/rpc/internal/svc" "backend/usercenter/rpc/pb/usercenter" "backend/utils" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/logx" "gorm.io/gorm" ) type LoginLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic { return &LoginLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *LoginLogic) Login(in *usercenter.LoginRequest) (*usercenter.LoginResponse, error) { // 1. 验证用户是否存在,支持用户名和手机号登录 user := new(orm.User) result := l.svcCtx.UsercenterDB.Where("name = ? OR phone = ?", in.Identity, in.Identity).First(&user) if result.Error != nil && result.Error != gorm.ErrRecordNotFound { return nil, result.Error } if result.RowsAffected == 0 { return nil, errors.New("用户不存在") } // 2. 验证密码,使用 utils.bcrypt.CheckPassword 工具类进行比较 if !utils.CheckPassword(user.Password, in.Password) { return nil, errors.New("密码错误") } // 3. 生成token,使用 utils.GenerateToken 工具类生成 jwtUtil := utils.NewJWTUtil(l.svcCtx.Config.AuthRpc.AccessSecret, l.svcCtx.Config.AuthRpc.AccessExpire, l.svcCtx.RedisClient, l.svcCtx.Config.TkStore) token, err := jwtUtil.GenerateToken(l.ctx, cast.ToInt64(user.ID), user.Name) if err != nil { return nil, err } // 4. 返回token return &usercenter.LoginResponse{ UserId: cast.ToString(user.ID), Token: token, Message: "登录成功", }, nil }