gin框架CRUD小栗子

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
	"net/http"
)

type Todo struct {
	ID int `json:"id"`  //和前端做交互 使用的是json數據
	Title string `json:"title"`
	Status bool	`json:"status"`
}

func initMySQL()(err error)  {
	dsn := "root:123456@(xxxxx:3306)/database_name?charset=utf8&parseTime=True&loc=Local"
	db, err  := gorm.Open("mysql", dsn)
	if err!= nil{
		panic(err)
	}
	return db.DB().Ping()
}

// 遇事不決 註釋先行
func main() {

	//err := initMySQL()
	//if err!= nil{
	//	panic(err)
	//}

	//1. 連接MySql數據庫
	db, err  := gorm.Open("mysql", "root:123456@(xxxxxx/gormDemo?charset=utf8&parseTime=True&loc=Local")
	if err!= nil{
		panic(err)
	}
	defer db.Close()

	//2. 自動遷移  把結構體和數據表進行對應
	db.AutoMigrate(&Todo{})

	r := gin.Default()
	//聲明 模板文件引用的靜態文件去哪找  以/static 訪問的請求 到static目錄下找靜態文件
	r.Static("/static", "static")

	// 告訴gin框架去哪裏找index.html
	r.LoadHTMLGlob("templates/*")

	r.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	//route1
	route1Group := r.Group("v1")
	{
		//待辦事項
		//添加
		route1Group.POST("/todo", func(c *gin.Context) {

			// 1.請求中取數據
			var todo Todo
			c.BindJSON(&todo)

			// 2.存儲數據
			//err = db.Create(&todo).Error
			//if err != nil {  這幾行簡寫爲下面的格式
			//
			//}

			//2.存儲數據 3.返回響應
			if err = db.Create(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
			}else {
				c.JSON(http.StatusOK, todo)
				/*統一響應格式c.JSON(http.StatusOK, gin.H{
									"code": 2000,
									"msg": "success",
									"data": todo,
				})*/
			}

			t1 := Todo{ID: 2, Title: "native", Status:true}
			db.Create(&t1)
		})

		//find all
		route1Group.GET("/todo", func(c *gin.Context) {
			var todoList []Todo
			err = db.Find(&todoList).Error
			if err != nil {
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
			}else {
				c.JSON(http.StatusOK, todoList)
			}
		})

		// find one
		route1Group.GET("/todo/:id", func(c *gin.Context) {
			var t = new(Todo)
			db.First(t)
			fmt.Printf("%#v\n", t)
		})

		//修改  某一個
		route1Group.PUT("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")  //獲取請求參數
			if !ok {
				c.JSON(http.StatusOK, gin.H{"error": "id不存在"})
				return
			}
			var todo Todo
			// 根據id查詢待修改實體
			if err = db.Where("id=?", id).First(&todo).Error; err != nil{
				c.JSON(http.StatusOK,gin.H{"error": err.Error()})
				return
			}
			c.BindJSON(&todo)
			if err = db.Save(&todo).Error; err != nil{
				c.JSON(http.StatusOK, gin.H{"error": err.Error()})
			}else {
				c.JSON(http.StatusOK, todo)
			}


		})

		//刪除 某一個
		route1Group.DELETE("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{"error":"無效的id"})
				return
			}
			if err = db.Where("id=?", id).Delete(Todo{}).Error; err!=nil{
				c.JSON(http.StatusOK,gin.H{"error": err.Error()})
			}else {
				c.JSON(http.StatusOK, gin.H{id: "deleted"})
			}
		})
	}

	r.Run()

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