快速開始api開發(三)第一個介面-註冊

wuyan94zl發表於2022-08-19

本文需要介紹 gotools 工具

需要使用的工具命令:gotools handler -h
程式碼地址:github.com/wuyan94zl/gotools

註冊介面

生成

執行 gotools handler --dir users --method POST --name register

以上會生成一個路由 POST /users/register

檔案目錄如下

app
    |-- handler
        |-- usersregister.go
    |-- logic
        |-- users
            |-- register.go // 介面邏輯處理
    |-- types
        |-- users.go // 入參出參設定檔案

設定介面出入參

修改 app/types/users.go

type UsersRegisterRequest struct {
    Nickname string `json:"nickname" validate:"required" tip:"使用者暱稱不能為空"`
    LoginID  string `json:"login_id" validate:"required,gte=6,lte=32" tip:"使用者登入名長度介於6-32位"`
    Password string `json:"password" validate:"required,gte=6,lte=32" tip:"使用者密碼長度介於6-32位"`
}

type UsersRegisterResponse struct {
    ExpTime interface{} `json:"exp_time"` // 增加程式碼
    Token   interface{} `json:"token"`    // 增加程式碼
}

編寫註冊邏輯

修改 app/logic/users/register.go

package users

import (
    "errors"
    "github.com/gin-gonic/gin"
    "github.com/wuyan94zl/example-api/container"
    "github.com/wuyan94zl/example-api/models/user"
    "github.com/wuyan94zl/gotools/jwt"
    "github.com/wuyan94zl/gotools/utils"
    "gorm.io/gorm"

    "github.com/wuyan94zl/example-api/app/types"
)

func RegisterLogic(c *gin.Context, req *types.UsersRegisterRequest) (*types.UsersRegisterResponse, error) {
    _, err := container.Instance().UserModel.FindByLoginID(c.Copy(), req.LoginID)
    if err == nil {
        return nil, errors.New("該登入名已註冊")
    }
    if err != gorm.ErrRecordNotFound {
        return nil, err
    }

    u := user.Users{
        Nickname: req.Nickname,
        LoginID:  req.LoginID,
        Password: utils.Md5ByString(req.Password + req.LoginID),
    }
    insert, err := container.Instance().UserModel.Insert(c.Copy(), &u)
    if err != nil {
        return nil, err
    }
    data := make(map[string]interface{})
    data["ID"] = insert.ID
    data["Nickname"] = insert.Nickname
    token, err := jwt.GenToken(container.Instance().JwtConfig, data)
    if err != nil {
        return nil, err
    }
    return &types.UsersRegisterResponse{
        ExpTime: token["expTime"],
        Token:   token["token"],
    }, nil
}

增加 model FindByLoginID 方法
修改 models/users/model.go

package user

import (
    "context"
    "gorm.io/gorm"
)

type (
    UsersModel interface {
        usersModel
        FindByLoginID(ctx context.Context, loginID string) (*Users, error) // 增加程式碼
    }
    customUsersModel struct {
        *defaultUsersModel
    }
)

func NewUsersModel(gormDb *gorm.DB) UsersModel {
    return &customUsersModel{
        defaultUsersModel: newUsersModel(gormDb),
    }
}
// 增加方法
func (c *customUsersModel) FindByLoginID(ctx context.Context, loginID string) (*Users, error) {
    info := new(Users)
    err := c.Conn.WithContext(ctx).Where("login_id = ?", loginID).First(info).Error
    return info, err
}

結束

以上註冊介面就完成了,步驟如下:

  • 使用 gotools handler --dir users --method POST --name register 生成檔案
  • 設定介面入參出參 app/types/users.go
  • 編寫業務邏輯 app/logic/users/register.go
  • 啟動go run main.go

下節登入與認證

本作品採用《CC 協議》,轉載必須註明作者和本文連結
沒有造飛機的格局,怎麼能擰得好螺絲。

相關文章