go-zero教程——User rpc - Register

1,657 阅读2分钟

API Gateway 代码调用 user rpc 服务

有了前面文章的介绍,接下去我们将加快开发速度了。

编辑 api/internal/handler 下的 registerhandler.go 文件,新增如下代码

func RegisterHandler(ctx *svc.ServiceContext) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		var req types.RegisterRequest
		if err := httpx.Parse(r, &req); err != nil {
			httpx.OkJson(w, ningxi.FailureResponse(nil,err.Error(),1000))
			return
		}

		l := logic.NewRegisterLogic(r.Context(), ctx)
		resp, err := l.Register(req)
		if err != nil {
			httpx.OkJson(w, ningxi.FailureResponse(nil,err.Error(),1000))
		} else {
			httpx.OkJson(w, ningxi.SuccessResponse(resp,"注册成功"))
		}
	}
}

编辑 api/internal/logic 下的 registerlogic.go 文件,新增如下代码

func (l *RegisterLogic) Register(req types.RegisterRequest) (*types.RegisterResponse, error) {
	
	resp,err := l.svcCtx.User.Register(l.ctx,&user.RegisterRequest{
		Username: req.Username,
		Email: req.Email,
		Password: req.Password,
	})
	
	if err != nil {
		return nil, err
	}

	token := types.JwtToken{
		AccessToken: resp.AccessToken,
		AccessExpire: resp.AccessExpire,
		RefreshAfter: resp.RefreshAfter,
	}

	response := types.UserReply{
		Id: resp.Id,
		Email: resp.Email,
		JwtToken: token,
	}

	return &types.RegisterResponse{
		response,
	},nil
}

rpc 代码调用 crud+cache 代码

编辑 rpc/user/internal/logic 下的 registerlogic.go 文件,新增如下代码

func (l *RegisterLogic) Register(in *user.RegisterRequest) (*user.Response, error) {

	_, err := l.svcCtx.Model.FindOneByEmail(in.Email)
	if err == model.ErrNotFound {
		newuser := model.User{
			Name: in.Username,
			Email: in.Email,
			Password: ningxi.PasswordEncrypt(l.svcCtx.Config.Salt,in.Password),
		}
		
		if result ,err := l.svcCtx.Model.Insert(newuser); err != nil {
			return nil, err
		} else  {
			newuser.Id , err = result.LastInsertId()
			if err != nil {
				return nil, err
			} else {
					now := time.Now().Unix()
					accessExpire := l.svcCtx.Config.AccessExpire
					jwtToken, err := ningxi.GetJwtToken(l.svcCtx.Config.AccessSecret, now, accessExpire, newuser.Id)
					if err != nil {
						return nil, err
					}
					response := user.Response{
						Email: newuser.Email,
						Id: newuser.Id,
						AccessToken: jwtToken,
						AccessExpire: now + accessExpire,
						RefreshAfter: now + accessExpire/2,
					}
					return &response, nil
			}
		}
	} else if err == nil {
		return nil, errors.New("该用户已存在")
	}  else {
		return nil, err
	}
}

GetJwtToken 方法是个常用的方法,于是我们把他写到了 ningxi.go 里面

package ningxi

import (
	"fmt"
	"github.com/dgrijalva/jwt-go"
	"golang.org/x/crypto/scrypt"
)

type HttpResponse struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Result interface{} `json:"result"`
}

func SuccessResponse(resData interface{},message string) HttpResponse {
	return HttpResponse{Code:1,Message: message,Result: resData}
}

func FailureResponse(resData interface{},message string,code int) HttpResponse {
	return HttpResponse{Code:code,Message: message,Result: resData}
}

func PasswordEncrypt(salt,password string) string {
	dk,_ := scrypt.Key([]byte(password), []byte(salt), 32768, 8, 1, 32)
	return fmt.Sprintf("%x",string(dk))
}

func GetJwtToken(secretKey string, iat, seconds, userId int64) (string, error) {
	claims := make(jwt.MapClaims)
	claims["exp"] = iat + seconds
	claims["iat"] = iat
	claims["userId"] = userId
	token := jwt.New(jwt.SigningMethodHS256)
	token.Claims = claims
	return token.SignedString([]byte(secretKey))
}

启动服务

启动服务,注意 在启动服务前,需要确保 先前文章用到的 ningxi-compose 正常运行起来。

启动 user rpc 服务, 运行成功后,user rpc 则运行在本机的 8080 端口

➜  FoodGuides git:(master) ✗ go run usermanage/rpc/user/user.go -f usermanage/rpc/user/etc/user.yaml
Starting rpc server at 127.0.0.1:8080...

启动 user api 服务, 运行成功后,user api 则运行在本机的 8888 端口

➜  FoodGuides git:(master) ✗ go run usermanage/api/user.go -f usermanage/api/etc/user-api.yaml
Starting server at 0.0.0.0:8888...

api 测试 得到如下数据则说明 服务运行正常

➜  ~ curl http://localhost:8888/users/register -X POST -d '{"username": "ningxi3","email": "ningxi3@ningxi.com","password": "ningixi3"}' --header "Content-Type: application/json"
{"code":1,"message":"注册成功","result":{"id":3,"username":"","email":"ningxi3@ningxi.com","accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTE1NTM5MjAsImlhdCI6MTYxMTQ2NzUyMCwidXNlcklkIjozfQ.exhP3C79W35OlSHL4JFsCgpWdebtuCQzxJGsYQWI3xo","accessExpire":1611553920,"refreshAfter":1611510720}}%
➜  ~

这样,User rpc - Register就开发完成了。

上一篇《go-zero教程——User rpc - Login》

下一篇《go-zero教程——User rpc - Userinfo》