package logic import ( "context" "time" "fusenapi/home-user-auth/internal/svc" "fusenapi/home-user-auth/internal/types" "fusenapi/model" "fusenapi/utils/basic" "github.com/golang-jwt/jwt" "github.com/zeromicro/go-zero/core/logx" ) type UserLoginLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewUserLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UserLoginLogic { return &UserLoginLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *UserLoginLogic) genJwtToken(accessSecret string, accessExpire, nowSec, userid int64) (string, error) { claims := make(jwt.MapClaims) claims["exp"] = nowSec + accessExpire claims["iat"] = nowSec claims["userid"] = userid token := jwt.New(jwt.SigningMethodHS256) token.Claims = claims return token.SignedString([]byte(accessSecret)) } func (l *UserLoginLogic) UserLogin(req *types.RequestUserLogin) (resp *types.Response, jwtToken string) { // 必须返回response, 前端需要的是内部约定的Code码, 处理相关的逻辑. 例子(eg): resp.Set(501, "error") resp = &types.Response{} userModel, err := model.NewFsUserModel(l.svcCtx.MysqlConn).FindOneByEmail(l.ctx, req.Name) // log.Printf("%t %t %v", err, model.ErrNotFound, err == model.ErrNotFound) if err == model.ErrNotFound { logx.Error(err) resp.SetStatusWithMessage(basic.CodeServiceErr, err.Error()) return resp, jwtToken } // jwt 生成 nowSec := time.Now().Unix() jwtToken, err = l.genJwtToken(l.svcCtx.Config.Auth.AccessSecret, l.svcCtx.Config.Auth.AccessExpire, nowSec, userModel.Id) if err != nil { logx.Error(err) resp.SetStatus(basic.CodeUnAuth) return resp, jwtToken } data := &types.DataUserLogin{ Token: userModel.PasswordResetToken.String, JwtToken: jwtToken, } resp.SetStatus(basic.CodeOK, data) return resp, jwtToken }