簡單Gin模板
創建數據庫
mysql -uroot -p密碼
create database 數據庫名稱;
show databases;
use 數據庫名稱;
show tables;
GROM框架
// 一. 數據庫方面 / GROM框架
// 1. 創建數據庫 --- 在命令行里搞定,如上
// mysql -uroot -p密碼
// create database 數據庫名稱
// 2. 定義結構體 / 模型 / 數據表
type User struct {
gorm.Model // 約定參數
Age int
Name string `gorm:"default:'無名氏'"`
Num int `gorm:"AUTO_INCREMENT"` // 自增
}
// 3. 初始化全局變量 / 也可以在函數內定義
var (
DB *gorm.DB
)
// 4. 連接數據庫 / 一般采用函數形式
func initMySQL()(err error) {
dsn := "root:密碼@tcp(127.0.0.1:3306)/數據庫名稱?charset=utf8mb4&parseTime=True&loc=Local"
DB, err = gorm.Open("mysql", dsn)
if err != nil {
log.Fatalln("數據庫連接錯誤:", err.Error())
}
return DB.DB().Ping()
}
// 連接
err := initMySQL()
if err != nil {
panic(err)
}
// 5. 模型綁定 / 即將模型(結構體)與數據庫中的表相對應 / 即根據之前User結構體在數據庫內創建一個表users
DB.AutoMigrate(&User{})
// 6. 延時關閉數據庫
defer DB.Close()
// 7. 開始在進行CURD操作 / 在此之前先初始化一個gin框架,如下
Gin框架
// 二. Web后端框架方面 / Gin框架
// 1. 創建路由(使用中間件)
r := gin.Default()
// 2. 加載靜態文件 / css、js、圖片等
r.Static("/static", "static")
// 3. 解析 / 解析項目根目錄下templates文件中所有文件 / ** 表示所有文件夾 * 表示所有文件
r.LoadHTMLGlob("./templates/*")
// 4. 渲染 / index.html文件
r.GET("/", func(c *gin.Context) {
c.HTML(http.StatusOK, "index.html", nil)
})
// 5. 路由組 --- gin結合gorm-mysql數據庫為例 ---
userGroup := r.Group("xiashe")
{
// 添加 - 前端添加數據至數據庫
userGroup.POST("/user", func(c *gin.Context) {
// 前端界面填寫數據,點擊提交會發請求到這里
// 1. 將數據從請求中取出至user中
var user User
c.BindJSON(&user)
// 2. 將數據存入數據庫
err = DB.Create(&user).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{
"error": err.Error(),
})
} else {
// 3. 數據返回前端 / 返回響應
c.JSON(http.StatusOK, user)
}
})
// 查看 --- 數據庫所有數據
userGroup.GET("/user", func(c *gin.Context) {
// 1. 從數據庫中查詢user表里所有數據
var userList []User
err = DB.Find(&userList).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
} else {
// 2. 數據返回前端 / 返回響應
c.JSON(http.StatusOK, userList)
}
})
// 修改
userGroup.PUT("/user/:id", func(c *gin.Context) {
// 1. 獲取URL路徑參數
id, ok := c.Params.Get("id")
if !ok {
c.JSON(http.StatusOK, gin.H{"error": "無效id"})
return
}
// 2. 在數據庫中查詢id對應行(數據)
var user User
err = DB.Where("id=?", id).First(&user).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{"error":err.Error()})
return
}
// 3. 參數綁定,自動提取user中數據
c.ShouldBind(&user)
// 4. 更新user對象中所有字段 / 即更新數據庫
err = DB.Save(&user).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
return
} else {
c.JSON(http.StatusOK, user)
}
})
// 刪除
userGroup.DELETE("/user/:id", func(c *gin.Context) {
// 1. 獲取URL路徑參數
id, ok := c.Params.Get("id")
if !ok {
c.JSON(http.StatusOK, gin.H{"error": "無效id"})
}
// 2. 在數據庫中刪除對應字段
err = DB.Where("id=?", id).Delete(User{}).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{"error": err.Error()})
} else {
c.JSON(http.StatusOK, gin.H{id: "delete"})
}
})
}
// 6. 啟動HTTP服務,默認在127.0.0.1:3000開啟服務
r.Run(:3000) //
項目結構拆分
基本結構
獲取url請求 -> 控制器(controller) -> 業務邏輯(logic) -> 模型層的增刪改查(model)
main函數一覽
package main
import (
_ "github.com/jinzhu/gorm/dialects/mysql"
"log"
"simpleProject/dao" // 連接數據庫
"simpleProject/modols" // 模型層 / 數據增刪改查
"simpleProject/routers" // 路由層 / 注冊路由
)
func main() {
// 連接數據庫
err := dao.InitMySQL()
if err != nil {
log.Println("數據庫連接錯誤:", err)
return
}
// 模型綁定 / 將模型與數據庫中的表相對應
dao.DB.AutoMigrate(&modols.Todo{})
// 關閉數據庫鏈接
defer dao.DB.Close()
// 注冊路由 -> 獲取url請求 -> 控制器 —> 分配業務邏輯 -> 模型層的增刪改查
r := routers.SetRouter()
r.Run()
}
參考: