GO_bubble_list

文章目录

        • 流程
        • API
        • 代码

Q1mi老师的小清单程序的练习和注释

学习资料:https://www.liwenzhou.com/posts/Go/go_menu/
hexo链接:https://woaixiaoyuyu.github.io/2020/03/22/bubble-list/#more

前端的事情咱就不管了233,直接把static和template文件夹拷贝下来

流程

1. create database
2. connect databse   // defer db.Close()
3. AutoMigrate struct table
4. gin static
5. gin templates
6. gin get url
7. operate ORM
8. gin Run

API

1. 用POST检测API
2. 绑定参数用params.get
3. 获取信息竟可能绑定成JSON // bindjson
4. 是不是用.error判断数据库的交互是否正确

代码

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var (
	db *gorm.DB // 为了方便调用
)

// Todo Model
type Todo struct {
	ID     int    `json:"id"`
	Title  string `json:"title"`
	Status bool   `json:"status"`
}

func initMysql() (err error) {
	db, err = gorm.Open("mysql", "root:xiaoyuyu@/bubble?charset=utf8&parseTime=True&loc=Local")
	return err
}

func main() {
	// 连接数据库
	err := initMysql()
	if err != nil {
		panic(err)
	}
	defer db.Close()
	// 模型Model绑定
	db.AutoMigrate(&Todo{})

	r := gin.Default()
	// 解析静态文件Static
	r.Static("/static", "static")
	// 解析templates
	r.LoadHTMLGlob("templates/*")
	r.GET("/", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	// POST可以检测到增删改查是放在v1路径后
	// v1
	v1Group := r.Group("v1")
	{
		// 待办事项
		// 增
		v1Group.POST("/todo", func(c *gin.Context) {
			// 从请求中拿出数据
			var todo Todo
			c.BindJSON(&todo)
			// 存入数据库
			err = db.Create(&todo).Error
			// 返回响应
			if err != nil {
				c.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
			} else {
				c.JSON(http.StatusOK, todo)
			}
		})

		// 删单个待办事项
		v1Group.DELETE("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{
					"error": "invalid 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",
				})
			}
		})

		// 改单个待办事项
		v1Group.PUT("/todo/:id", func(c *gin.Context) {
			id, ok := c.Params.Get("id")
			if !ok {
				c.JSON(http.StatusOK, gin.H{
					"error": "invalid id",
				})
				return
			}
			var todo Todo
			// 查询对应字段
			if err = db.Where("id=?", id).First(&todo).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
			}
			// 绑定目前状态
			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)
			}
		})
		// // 查单个待办事项
		// v1Group.GET("/todo/:id", func(c *gin.Context) {

		// })

		// 查所有待办事项
		v1Group.GET("/todo", func(c *gin.Context) {
			// 查询todos表中所有数据
			var todoList []Todo
			if err = db.Find(&todoList).Error; err != nil {
				c.JSON(http.StatusOK, gin.H{
					"error": err.Error(),
				})
			} else {
				c.JSON(http.StatusOK, todoList)
			}
		})
	}

	r.Run(":9090")
}

你可能感兴趣的:(GO,golang,go,mysql)