这是个小案例返回一个图书列表,用到了gin和gorm
Go版本:1.13,Go modules
目录结构
├── App
│ ├── ServiceHelp.go
│ └── services
│ ├── BookEndpoint.go
│ ├── BookService.go
│ └── BookTransport.go
├── AppInit
│ ├── Config.go
│ └── DBInit.go
├── Models
│ └── Books.go
├── gin.ini
├── gin.log
├── go.mod
├── go.sum
└── main.go
main.Go
package main
import (
"github.com/gin-gonic/gin"
"io"
"os"
"src/App"
"src/App/services"
. "src/AppInit"
)
func main() {
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
router:=gin.Default()
bookserviceListEndpoint := services.BookListEndPoint(&services.BookService{})
bookListHandler:=App.RegisterHandler(bookserviceListEndpoint,
services.CreateBookListRequest(),
services.CreateBookListResponse(),
)
v1:=router.Group("v1")
{
v1.Handle(HTTP_METHOD_GET,"/prods", bookListHandler)
}
router.Run(SERVER_ADDRESS)
}
定义模型 Book.go
package Models
type Books struct{
BookID int `gorm:"column:book_id;AUTO_INCREMENT;PRIMARY_KEY"`
BookName string `gorm:"column:book_name;type:varchar(50)"`
BookIntr string `gorm:"column:book_intr;type:text"`
BookPrice1 float64 `gorm:"column:book_price1;type:decimal"`
BookPrice2 float64 `gorm:"column:book_price2;type:decimal"`
BookAuthor string `gorm:"column:book_author;type:varchar(50)"`
BookPress string `gorm:"column:book_press;type:varchar(50)"`
BookDate string `gorm:"column:book_date;type:varchar(50)"`
BookKind int `gorm:"column:book_kind;type:int"`
BookKindStr string `gorm:"column:book_kind_str;type:varchar(20)"`
}
type BookList []*Books
定义Handler函数
package App
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
)
//业务最终函数原型
type Endpoint func(ctx context.Context,request interface{}) ( response interface{},err error)
//怎么取参数
type EndcodeRequestFunc func(*gin.Context)(interface{},error)
//怎么处理业务结果
type DecodeResponseFunc func(*gin.Context,interface{}) error
func RegisterHandler(endpoint Endpoint,endcodeFunc EndcodeRequestFunc,decodeFunc DecodeResponseFunc) func(context *gin.Context) {
return func(context *gin.Context) {
defer func() {
if r:=recover();r!=nil{
context.JSON(500,gin.H{"error:":fmt.Sprintf("fatal error:s%",r)})
}
}()
//参数:=怎么取参数(context)
//业务结果,error:=业务最终函数(context,参数)
//
//
//怎么处理业务结果(业务结果)
req,err:=endcodeFunc(context)//获取参数
if err!=nil{
context.JSON(400,gin.H{"error:":" param error"+err.Error()})
return
}
rsp,err:=endpoint(context,req)
if err!=nil{
fmt.Fprintln(gin.DefaultWriter,"response error:",err)
context.JSON(400,gin.H{"error:":" response error"+err.Error()})
return
}
err=decodeFunc(context,rsp)
if err!=nil{
context.JSON(500,gin.H{"error:":" response error"+err.Error()})
return
}
}
}
定义BookEndpoint.go
package services
import (
"context"
"src/App"
"src/Models"
)
type BookListRequest struct {
Size int `form:"size" binding:"required,gt=0,max=200"`
}
type BookListResponse struct {
Result *Models.BookList
}
func BookListEndPoint(book *BookService)App.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req:=request.(*BookListRequest)
result,err:=book.LoadBookList(req)
return &BookListResponse{Result:result},err
}
}
BookService.go
package services
import (
"fmt"
"src/AppInit"
"src/Models"
)
type BookService struct {
}
func (this *BookService)LoadBookList(req *BookListRequest)(*Models.BookList ,error) {
prods:=&Models.BookList{}
err:=AppInit.GetDB().Limit(req.Size).Order("book_id desc").Find(prods).Error
if err!=nil{
return nil,err
}
return prods,nil
}
BookTransport.go
package services
import (
"fmt"
"github.com/gin-gonic/gin"
"src/App"
)
func CreateBookListRequest() App.EndcodeRequestFunc {
return func(context *gin.Context) (i interface{}, e error) {
bReq:= &BookListRequest{}
//err:=context.BindQuery(bReq)
err:=context.ShouldBindQuery(bReq)
fmt.Println(bReq)
if err!=nil{
return nil,err
}
return bReq,nil
}
}
func CreateBookListResponse() App.DecodeResponseFunc{
return func(context *gin.Context, i interface{}) error {
res:= i.(*BookListResponse)
context.JSON(200,res)
return nil
}
}
初始化配置Config.go
package AppInit
import (
"github.com/go-ini/ini"
"log"
)
const (
HTTP_METHOD_GET="GET"
)
var(
SERVER_ADDRESS=":8080"
MYSQL_DSN=""
MYSQL_MAXIDLE=10
MYSQL_MAXCONN=50
)
func init(){
cfg,err:=ini.Load("gin.ini")
if err!=nil{
log.Fatal(" config err")
}
//muststring 带默认值
SERVER_ADDRESS=cfg.Section("server").Key("port").MustString(":8080")
//数据库连接字符串
MYSQL_DSN=cfg.Section("mysql").Key("dsn").String()
//最大空闲连接
MYSQL_MAXIDLE=cfg.Section("mysql").Key("maxidle").MustInt(10)
//最大连接数
MYSQL_MAXCONN=cfg.Section("mysql").Key("maxconn").MustInt(50)
}
数据库
package AppInit
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
)
var db *gorm.DB
func init() {
var err error
db, err = gorm.Open("mysql",
MYSQL_DSN)
if err != nil {
log.Fatal(err)
}
db.SingularTable(true)
db.DB().SetMaxIdleConns(MYSQL_MAXIDLE)
db.DB().SetMaxOpenConns(MYSQL_MAXCONN)
fmt.Println("当前连接池",MYSQL_MAXCONN,MYSQL_MAXIDLE)
db.LogMode(true)
}
func GetDB() *gorm.DB {
return db
}
配置文件gin.ini
[server]
address=":8080"
[mysql]
dsn="user:pwd@tcp(host:3306)/book?charset=utf8mb4&parseTime=True&loc=Local"
maxidle=10
maxconn=509
数据表结构
CREATE TABLE `books` (
`book_id` int(11) NOT NULL AUTO_INCREMENT,
`book_name` varchar(500) DEFAULT NULL COMMENT '图书名称',
`book_intr` text COMMENT '图书简介',
`book_price1` decimal(10,2) DEFAULT NULL COMMENT '图书价格1',
`book_price2` decimal(10,2) DEFAULT NULL COMMENT '图书价格2',
`book_author` varchar(50) DEFAULT NULL COMMENT '图书作者',
`book_press` varchar(50) DEFAULT NULL COMMENT '出版社',
`book_date` varchar(100) DEFAULT NULL COMMENT '出版时间',
`book_kind_str` varchar(20) DEFAULT NULL COMMENT '分类名',
`book_kind` int(11) DEFAULT NULL COMMENT '分类ID',
`dd_id` int(11) DEFAULT NULL,
PRIMARY KEY (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
项目运行
设置gopath
项目根目录下go mod init ,go mod tidy
go run main.go
访问 localhost:8080/v1/prods
数据库,数据表,测试数据自行添加
网友评论