zoukankan      html  css  js  c++  java
  • 从golang-gin-realworld-example-app项目学写httpapi (一)

    https://wangzitian0.github.io/2013/06/29/zero-to-one-1/

    https://github.com/gothinkster/golang-gin-realworld-example-app

    目录结构

    golang-gin-realworld-example-app/
    ├── articles
    │   ├── doc.go
    │   ├── models.go
    │   ├── routers.go
    │   ├── serializers.go
    │   └── validators.go
    ├── common
    │   ├── database.go
    │   ├── unit_test.go
    │   └── utils.go
    ├── doc.go
    ├── main.go
    ├── scripts
    │   ├── coverage.sh
    │   └── gofmt.sh
    ├── users
    │   ├── doc.go
    │   ├── middlewares.go
    │   ├── models.go
    │   ├── routers.go
    │   ├── serializers.go
    │   ├── unit_test.go
    │   └── validators.go
    └── vendor
        └── vendor.json
    

    https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/common/database.go

    数据库

    package common
    
    import (
    	"github.com/jinzhu/gorm"
    	_ "github.com/jinzhu/gorm/dialects/mysql"
    	_ "github.com/jinzhu/gorm/dialects/sqlite"
    )
    
    // 定义结构体Database
    type Database struct {
    	*gorm.DB
    }
    
    // 定义全局变量DB
    var DB *gorm.DB
    
    // 初始化数据库
    func Init() *gorm.DB {
    	// 连接数据库
    	db, err := gorm.Open("sqlite3", "./../gorm.db")
    	//db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8mb4&parseTime=True&loc=Local")
    
    	if err != nil {
    		fmt.Println("db err: ", err)
    	}
    
    	// 设置闲置的连接数
    	db.DB().SetMaxIdleConns(10)
            // 设置最大打开的连接数
    	db.DB().SetMaxOpenConns(100)
    
    	// 启用Logger,显示详细日志
    	db.LogMode(true)
    
    	DB = db
    	return DB
    } 
    
    // 函数,获取数据库连接,建立连接池
    func GetDB() *gorm.DB {
    	return DB
    }              
    

    https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/common/utils.go

    工具集

    package common
    
    import (
    	"fmt"
    	"math/rand"
    	"time"
    
    	"github.com/dgrijalva/jwt-go"
    	"gopkg.in/go-playground/validator.v8"
    
    	"github.com/gin-gonic/gin/binding"
    	"gopkg.in/gin-gonic/gin.v1"
    )
    
    var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
    
    // 函数 生成随机字符串
    func RandString(n int) string {
    	b := make([]rune, n)
    	for i := range b {
    		b[i] = letters[rand.Intn(len(letters))]
    	}
    	return string(b)
    }
    
    // Keep this two config private, it should not expose to open source
    const NBSecretPassword = "A String Very Very Very Strong!!@##$!@#$"
    const NBRandomPassword = "A String Very Very Very Niubilty!!@##$!@#4"
    
    // 函数 生成请求头使用的jwt_token
    func GenToken(id uint) string {
    	jwt_token := jwt.New(jwt.GetSigningMethod("HS256"))
    	// Set some claims
    	jwt_token.Claims = jwt.MapClaims{
    		"id":  id,
    		"exp": time.Now().Add(time.Hour * 24).Unix(),
    	}
    	// Sign and get the complete encoded token as a string
    	token, _ := jwt_token.SignedString([]byte(NBSecretPassword))
    	return token
    }
    
    // 自定义错误类型
    //  {"database": {"hello":"no such table", error: "not_exists"}}
    type CommonError struct {
    	Errors map[string]interface{} `json:"errors"`
    }
    
    // 一般错误处理
    func NewError(key string, err error) CommonError {
    	res := CommonError{}
    	res.Errors = make(map[string]interface{})
    	res.Errors[key] = err.Error()
    	return res
    }
    
    // gin的validator错误处理
    // https://github.com/go-playground/validator/blob/v9/_examples/translations/main.go
    func NewValidatorError(err error) CommonError {
    	res := CommonError{}
    	res.Errors = make(map[string]interface{})
    	errs := err.(validator.ValidationErrors)
    	for _, v := range errs {
    		// can translate each error one at a time.
    		//fmt.Println("gg",v.NameNamespace)
    		if v.Param != "" {
    			res.Errors[v.Field] = fmt.Sprintf("{%v: %v}", v.Tag, v.Param)
    		} else {
    			res.Errors[v.Field] = fmt.Sprintf("{key: %v}", v.Tag)
    		}
    
    	}
    	return res
    }
    
    // 变更gin-gonic的Bind函数,改变 c.MustBindWith() ->  c.ShouldBindWith().
    func Bind(c *gin.Context, obj interface{}) error {
    	b := binding.Default(c.Request.Method, c.ContentType())
        //return c.MustBindWith(obj, b)
    	return c.ShouldBindWith(obj, b)
    }
    
  • 相关阅读:
    Qt实现模糊搜索
    Qt解析多级xml文件
    insert into
    Git忽略规则(.gitignore配置)不生效原因和解决
    搭建vue开发环境
    表单
    事件处理
    列表渲染
    条件渲染
    class与style绑定
  • 原文地址:https://www.cnblogs.com/liujitao79/p/9965528.html
Copyright © 2011-2022 走看看