使用 gin + gorm + seesion 完成 Laravel 的 make:auth

aen233發表於2019-09-11

demo連結:http://120.27.8.8:3000/page/welcome

go初學者,這篇是筆記,記錄和分享go入門實踐的歷程。
初學一門語言實踐自然從blog開始,個人打算是按照本站laravel教程入門實戰來搭個sample類微博小站。現在才開頭哈。
基礎文件讀完,差不多臉熟了一下go的語法,實踐環節要選框架,我沒多想就是gin+gorm,原因很簡單啊,本站文件裡就有iris、gin、gorm的這3個文件,iris和gin比起來我更傾向gin,因為iris看起來是個大而全的框架,laravel就是個大而全的框架了,學習go我想從小而精的gin開始。

以下是這幾天學習的路程步驟^_^

  1. gin+gorm搭簡單的mvc
  2. html模板
  3. session 登陸,自定義Auth中介軟體
  4. 密碼使用bcrypt加密驗證
  5. 分頁列表
  6. 結構優化,api介面和web動作分組
  7. 部署到阿里雲伺服器

gin+gorm搭簡單的mvc

新建專案,我的專案名叫go-sample
新建main.go,開啟gin的文件,複製“快速開始”的程式碼到這個檔案

package main

import "github.com/gin-gonic/gin"

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // 在 0.0.0.0:8080 上監聽並服務
}

這時候已經可以跑起來了

# 執行 main.go 並在瀏覽器上訪問 0.0.0.0:8080/ping
$ go run main.go

接下來要拆分程式碼了,新建route目錄和apis目錄,這個apis目錄其實就是controller層了,翻了好幾個go專案,叫apis的比較多,我也叫這個吧
新建 router/router.go

package router

import (
    "github.com/gin-gonic/gin"
    "go-sample/apis"
)

// SetupRouter index
func SetupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/welcome", apis.Welcome)
    return r
}

新建 apis/welcome.go

package apis

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func Welcome(c *gin.Context) {
    c.JSON(http.StatusOK, gin.H{
        "code": 1,
        "data": "hello-world",
    })
}

main.go改成

package main

import (
    "go-sample/router"
)

func main() {
    r := router.SetupRouter()
    r.Run(":3000") // 預設在 0.0.0.0:8080 上監聽並服務
}

這時候訪問 127.0.0.1:3000/welcome

使用gin + gorm + seesion 完成 laravel 的 make:auth

然後是gorm,新建models目錄
新建檔案 models/init.go

package models

import (
    "fmt"
    _ "github.com/go-sql-driver/mysql" //載入mysql
    "github.com/jinzhu/gorm"
)

var DB *gorm.DB

func Setup() {
    var err error
    // var user userModel.User
    DB, err = gorm.Open("mysql", "root:12345678@/iu56?charset=utf8&parseTime=True&loc=Local&timeout=10ms")

    if err != nil {
        fmt.Printf("mysql connect error %v", err)
    }

    if DB.Error != nil {
        fmt.Printf("database error %v", DB.Error)
    }
    AutoMigrateAll()
}

func AutoMigrateAll() {
    DB.AutoMigrate(&User{})
}

新建檔案 models/user.go

package models

import (
    "github.com/jinzhu/gorm"
)

type User struct {
    gorm.Model
    Name     string `json:"name"`
    Password string `json:"password"`
    Email    string `json:"email"`
    Gender   string `json:"gender"`
}

main.go改成

package main

import (
    "go-sample/models"
    "go-sample/router"
)

func init() {
    models.Setup()
}

func main() {
    r := router.SetupRouter()
    r.Run(":3000") // 預設在 0.0.0.0:8080 上監聽並服務
}

router/router.go改成

package router

import (
    "github.com/gin-gonic/gin"
    "go-sample/apis"
)

func SetupRouter() *gin.Engine {
    r := gin.Default()
    r.GET("/welcome",apis.Welcome)

    user := r.Group("/user")
    {
        user.GET("/index", apis.UserIndex)
    }

    return r
}

新建 apis/user.go

package apis

import (
    "github.com/gin-gonic/gin"
    "go-sample/models"
    "net/http"
)

func UserIndex(c *gin.Context) {
    var user models.User
    result := models.DB.Take(&user).Value  //開頭就寫最簡單的,獲取一條記錄,不指定排序

    c.JSON(http.StatusOK, gin.H{
        "code": 1,
        "data": result,
    })
}

這時候訪問127.0.0.1:3000/user/index

使用gin + gorm + seesion 完成 laravel 的 make:auth
當前檔案目錄

go-sample/
├── apis
│   └── user.go
├── models
│   ├──  init.go
│   └── user.go
├── router
│   └── router.go
├── main.go

知識點

  1. 要在$GOPATH/src 下新建專案
  2. 要加深對package的理解

--
寫不完了

相關文章