Gin實戰

os: wsl ubuntu18.04

mysql

sudo apt-get install mysql-server

首先需要改變MySQL的配置,執行sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

將找到 bind-address = 127.0.0.1 並註釋掉 → # bind-address = 127.0.0.1 (如下圖)

service mysql restart

mysql

create database go_db;

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';

go

1、開啓GO111MODULE並修改Go代理(用下面兩個命令把下圖中標出的兩個地方修改成跟我一樣的配置)
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct(修改這個是因爲原有的谷歌代理在國內不行)
2、安裝Gin(在GoLand工具命令行下執行以下命令)
 
go get -u github.com/gin-gonic/gin
【注意:這一步執行完後,它會自動在go.mod文件中引入響應的依賴】
3、安裝Gorm
go get -u gorm.io/gorm
4、安裝mysql數據庫驅動
go get -u gorm.io/driver/mysql

main.go

package main

import (
	"fmt"
	"log"
	"math/rand"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	gorm.Model
	//'gorm:"type:varchar(20);not null"'
	Name     string
	Phone    string
	Password string
}

func main() {
	db := InitDB()
	//傳統的Web服務寫法
	//http.HandleFunc("/hello", sayHello)
	//err := http.ListenAndServe(":9090", nil)
	//if err != nil {
	//    fmt.Printf("http server faile,err:%v\n", err)
	//    return
	//}
	//fmt.Println("項目啓動成功")

	//利用Gin框架的web寫法,來源於gin官網
	r := gin.Default()
	r.POST("/api/auth/register", func(c *gin.Context) {
		//獲取參數
		name := c.PostForm("name")
		phone := c.PostForm("phone")
		password := c.PostForm("password")
		//數據驗證
		if len(phone) != 11 {
			c.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "手機號格式不正確"})
			return
		}

		if len(password) < 6 {
			c.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "密碼不能少於6位"})
			return
		}
		if len(name) == 0 {
			name = RandomString(10)
			return
		}
		log.Print(name, phone, password)

		//判斷手機號是否存在
		if isPhoneExist(db, phone) {
			c.JSON(http.StatusUnprocessableEntity, gin.H{"code": 422, "msg": "用戶已存在,不能註冊"})
			return
		}

		//創建新用戶  //第一步把傳過來的數據變成類
		newUser := User{
			Name:     name,
			Phone:    phone,
			Password: password,
		}
		db.Create(&newUser) // 交給gnorm來運行.

		//返回結果
		c.JSON(200, gin.H{
			"message": "註冊成功",
		})
	})
	_ = r.Run() // listen and serve on 0.0.0.0:8080
	panic(r.Run())

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

// 隨機產生英文字符,可設定長度
func RandomString(n int) string {
	var letters = []byte("asdfghjklzxcvbnmqwertyuiopASDFGHJKLZXCVBNMQWERTYUIOP")
	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 { //前提是你要先在本機用Navicat創建一個名爲go_db的數據庫
	host := "localhost"
	port := "3306"
	database := "go_db"
	username := "root"
	password := "123456"
	charset := "utf8"
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
		username,
		password,
		host,
		port,
		database,
		charset) //這裏 gorm.Open()函數與之前版本的不一樣,大家注意查看官方最新gorm版本的用法
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("Error to Db connection, err: " + err.Error())
	}
	//這個是gorm自動創建數據表的函數。它會自動在數據庫中創建一個名爲users的數據表
	_ = db.AutoMigrate(&User{}) //這個地方也非常方便, 直接給類即可.
	return db
}

效果圖

image

確實太方便了.都不需要自己建立表.

並且經過實驗, 這個建表他是隻建一次,以後存在了就自動跳過建表, 符合我們的需求邏輯.非常好,簡單實用.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章