天天看點

Go 語言架構 Gin 練習1目錄友情支援

目錄

文章目錄

  • 目錄
    • 1 介紹
    • 源碼下載下傳
    • 2 練習
    • 效果示範
  • 友情支援

1 介紹

Gin是一個golang的微架構,封裝比較優雅,API友好,源碼注釋比較明确,具有快速靈活,容錯友善等特點

對于golang而言,web架構的依賴要遠比Python,Java之類的要小。自身的net/http足夠簡單,性能也非常不錯

借助架構開發,不僅可以省去很多常用的封裝帶來的時間,也有助于團隊的編碼風格和形成規範

源碼下載下傳

下載下傳位址

2 練習

本次練習主要實作一個可以實作使用者注冊的背景。

// main.go
package main

import (
 "log"
 "math/rand"
 "net/http"
 "time"
 "github.com/gin-gonic/gin"
 _ "github.com/go-sql-driver/mysql"
 "github.com/jinzhu/gorm"
)
           

引入區,導入了本次練習使用到的庫。

type User struct {
	gorm.Model
	Name      string `gorm:"type:varchar(20);not null"`
	Telephone string `gorm:"varchar(11);not null"`
	Password  string `gorm:"size:255"`
}
           

全局變量區,定義了使用者的資料結構,主要是姓名,電話号碼和密碼。

func main() {
	//gin.SetMode(gin.ReleaseMode)
	db := InitDB()
	defer db.Close()
	db.AutoMigrate(&User{})
	r := gin.Default()
	r.POST("/api/auth/registers", func(ctx *gin.Context) {
		//擷取參數
		name := ctx.PostForm("name")
		telephone := ctx.PostForm("telephone")
		password := ctx.PostForm("password")
		//資料驗證
		if len(telephone) != 11 {
			ctx.JSON(http.StatusUnprocessableEntity,
				gin.H{"code": 422, "msg": "手機号必須為11位"})
			return
		}
		if len(password) < 6 {
			ctx.JSON(http.StatusUnprocessableEntity,
				gin.H{"code": 422, "msg": "密碼必須大于6位"})
			return
		}
		//
		if len(name) == 0 {
			name = RandomString(10)
		}
		log.Println(name, telephone, password)
		//判斷手機号是否存在
		if IsTelephoneExist(db, telephone) {
			ctx.JSON(http.StatusUnprocessableEntity,
				gin.H{"code": 422, "msg": "該使用者已經注冊"})
			return
		}
		//建立使用者
		newUser := User{
			Name:      name,
			Telephone: telephone,
			Password:  password,
		}
		db.Create(&newUser)

		//傳回結果
		ctx.JSON(200, gin.H{
			"message": "注冊成功",
		})
		return
	})
	panic(r.Run())
	fmt.Println("Hello World!")
}
           

主函數區,整體運作邏輯

func IsTelephoneExist(db *gorm.DB, telephone string) bool {
	var user User
	db.Where("telephone=?", telephone).First(&user)
	if user.ID != 0 {
		return true
	}
	return false
}
           

子函數,判斷電話号碼是否已經注冊

func RandomString(n int) string {
	var letters = []byte("qwertyuiopasdfghjklxzvbnmQQERTYUOIOPASDFGHJKLZXCVBNM")
	result := make([]byte, n)
	rand.Seed(time.Now().Unix())
	for i := range result {
		result[i] = letters[rand.Intn(len(letters))]
	}
	return string(result)
}
           

子函數,如果使用者沒有輸入姓名,可以生成随機字元。

func InitDB() *gorm.DB {
	driverName := "mysql"
	host := "localhost"
	port := "3306"
	database := "test"
	username := "root"
	password := ""
	charset := "utf8"
	args := fmt.Sprintf("%s:%[email protected](%s:%s)/%s?charset=%s&parseTime=true",
		username,
		password,
		host,
		port,
		database,
		charset)
	db, err := gorm.Open(driverName, args)
	if err != nil {
		panic("failed to connect database!,err:" + err.Error())
	}
	return db
}
           

子函數,初始化資料庫,我的mysql沒設定密碼,是以密碼為空。

效果示範

Go 語言架構 Gin 練習1目錄友情支援
Go 語言架構 Gin 練習1目錄友情支援

友情支援

有問題的可以關注公衆号,部落客會在24小時内回複。

Go 語言架構 Gin 練習1目錄友情支援