目錄
文章目錄
- 目錄
-
- 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沒設定密碼,是以密碼為空。
效果示範
友情支援
有問題的可以關注公衆号,部落客會在24小時内回複。