(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