go从0到1项目实战体系二十九:演示案列实例一

(1). BsyErp\Contract\main.go:

import (
	. "api.employee.com/Init"
	"api.employee.com/Lib"
	"api.employee.com/Models"
	"api.employee.com/Service/book"
)

func main() {
    router := gin.Default()
    // 版本号:未来API升级了,为了兼容老版本或都版本号的区分,可以通过网关来搞定.
	v1 := router.Group("/v1")
	{
		bookHandler := Lib.RegisterHandler(book.CreateBookListRequest(),
			book.BookListEndpoint(&book.BookService{}),
			book.CreateBookListResponse())
		v1.Handle(HTTP_METHOD_GET, "/admin/books", bookHandler)
	}
	router.Run(SERVER_ADDRESS)
}

(2). bookModel(BsyErp\Contract\Models\Books.go):

package Models

type AdminLogs struct {
	Id        int    `json:"id" gorm:"column:book_id;AUTO_INCREMENT;PRIMARY_KEY"`
	UserId    int    `gorm:"column:user_id;type:int"`
	Ip        string `gorm:"column:ip;type:varchar(45)"`
	SayMore   string `gorm:"column:syamore;type:varchar(255)"`
	Type      int    `gorm:"column:type;type:int"`
	CreatedAt string `gorm:"column:created_at;type:varchar(255)"`
}

type AdminLoges []*AdminLogs

(3). BsyErp\Contract\App\Services\BookEndpoint.go:

可以通过proto文件来生成.

package book
import (
	"api.employee.com/Lib"
	"api.employee.com/Models"
)
type BookListRequest struct {
	Page int
	Size int `form:"size"`
}
type BookListResponse struct {
	Result *Models.AdminLoges
}
// 业务最终函数
// 其实就是把service中的struct的方法的过程,用func来做一层包装
// 为了将最终执行的结果与框架进行结耦,确保通用模型中的RegisterHandler与框架、业务无关
func BookListEndpoint(book *BookService) Lib.Endpoint {
	return func(ctx *gin.Context, request interface{}) (interface{}, error) {
		req := request.(*BookListRequest)
		return &BookListResponse{Result: book.getList(req)}, nil
	}
}

(4). BsyErp\Contract\App\Services\BookService.go:

package book
import (
	"api.employee.com/Init"
	"api.employee.com/Models"
)
type BookService struct {
}
// 这是上次struct的方法(类似一个类的方法),在通用模型中是识别不了类方法的.
// 通用模型中的业务最终函数,是一个函数,并不是某个具体的struct或struct具体的方法,否则又耦合了.
func(this *BookService) getList(req *BookListRequest) *Models.AdminLoges {
	// 如果这里不写&,在下面Find那里传&books
	books := &Models.AdminLoges{}
	// 请求多少条,是从req参数中获取的size,至于size怎么去取,与这个类没有任何关系,代码就结耦了
	Init.GetDB().Limit(req.Size).Order("id desc").Find(books)
	return books
}

(5). BsyErp\Contract\App\Services\BookTransport.go:

package book
import (
	"api.employee.com/Lib"
)

// 返回类型是一个函数,与框架是有关的
func CreateBookListRequest() Lib.EncodeRequestFunc {
	return func(ctx *gin.Context) (i interface{}, e error) {
		req := &BookListRequest{}
		if err := ctx.BindQuery(req); err != nil {
			return nil, err
		}
		return req, nil
	}
}

// 返回类型也是一个函数,与框架是有关的
func CreateBookListResponse() Lib.DecodeResponseFunc {
	return func(cxt *gin.Context, i interface{}) error {
		res := i.(*BookListResponse) // 断言
		cxt.JSON(200, res)
		return nil
	}
}

(6). 请求访问:

. 列表:
    GET http://localhost/v1/books?size=1

你可能感兴趣的:(golang,开发语言,后端,gin,系统架构,性能优化)