Gin+Gorm小项目

Posted zisefeizhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gin+Gorm小项目相关的知识,希望对你有一定的参考价值。

Gin+Gorm小项目

创建项目

技术图片
技术图片

E:gostudentginubble>go mod tidy      //增加缺失的包,移除没用的包
package main

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

func main() {
   r := gin.Default()
   //告诉gin框架去哪里找模板文件
   r.LoadhtmlGlob("templates/*")
   r.GET("/", func(c *gin.Context) {
      c.HTML(http.StatusOK, "index.html", nil)
   })
   r.Run(":9090")
}

技术图片

引用静态文件

技术图片
技术图片
技术图片

搭建架子

package main

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

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

func main() {
   //创建数据库
   //sql: CREATE DATABASE bubble;
   //连接数据库
   //遇事不决写注释
   r := gin.Default()
   //告诉gin框架模板文件引用的静态文件去哪里找
   r.Static("/static","static")
   //告诉gin框架去哪里找模板文件
   r.LoadHTMLGlob("templates/*")
   r.GET("/", func(c *gin.Context) {
      c.HTML(http.StatusOK, "index.html", nil)
   })

   //v1 api
   v1Group := r.Group("v1")
   {
      //待办事项
      //添加
      v1Group.POST("/todo", func(c *gin.Context) {

      })
      //查看所有的代办事项
      v1Group.GET("/todo", func(c *gin.Context) {

      })
      //查看某一个代办事项
      v1Group.GET("/todo/:id", func(c *gin.Context) {

      })
      //修改某一个待办事项
      v1Group.PUT("/todo/:id", func(c *gin.Context) {

      })
      //删除
      v1Group.DELETE("/todo/:id", func(c *gin.Context) {

      })
   }
   
   r.Run(":9090")
}

创建数据库

技术图片

func initmysql()  (err error)  {
   dsn := "root:123456@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
   DB, err = gorm.Open("mysql",dsn)
   //测试连通性
   err = DB.DB().Ping()
   return
   //return DB.DB().Ping()
}

func main() {
   //创建数据库
   //sql: CREATE DATABASE bubble;
   //连接数据库
   err := initMySQL()
   if err != nil {
      //可以搞个日志
      panic(err)
   }
   //模型绑定
   DB.AutoMigrate(&Tode{})   //todos
   defer DB.Close()  //程序退出,关闭数据库

添加功能

      //待办事项
      //添加
      v1Group.POST("/todo", func(c *gin.Context) {
         //前端页面填写待办事项,点击提交,会发请求到这里
         //1. 从请求中把数据拿出来
         var todo Tode
         c.BindJSON(&todo)
         //2. 存入数据库
         err = DB.Create(&todo).Error
         //3. 返回响应
         if err != nil {
            c.JSON(http.StatusOK,gin.H{"error": err.Error()})
         }else {
            c.JSON(http.StatusOK, todo)
            //c.JSON(http.StatusOK, gin.H{
            // "code": 200,
            // "msg" : "success",
            // "data": todo,
            //})
         }
        

技术图片
技术图片

查找功能

//查看所有的代办事项
v1Group.GET("/todo", func(c *gin.Context) {
   //查询todo这个表里的所有数据
   var todeList []Tode
   err := DB.Find(&todeList).Error
   if err != nil {
      c.JSON(http.StatusOK, gin.H{"error": err.Error()})
   }else {
      c.JSON(http.StatusOK, todeList)
   }
})
    //查看某一个代办事项
      v1Group.GET("/todo/:id", func(c *gin.Context) {

      })

技术图片

修改功能

 //修改某一个待办事项
      v1Group.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
         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)
         }
      })

删除功能

   //删除
      v1Group.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"})
         }
      })

总代码

package main

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

var (
   DB *gorm.DB
)

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

func initMySQL()  (err error)  {
   dsn := "root:123456@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
   DB, err = gorm.Open("mysql",dsn)
   //测试连通性
   err = DB.DB().Ping()
   return
   //return DB.DB().Ping()
}

func main() {
   //创建数据库
   //sql: CREATE DATABASE bubble;
   //连接数据库
   err := initMySQL()
   if err != nil {
      //可以搞个日志
      panic(err)
   }
   //模型绑定
   DB.AutoMigrate(&Todo{})   //todos
   defer DB.Close()  //程序退出,关闭数据库
   //遇事不决写注释
   r := gin.Default()
   //告诉gin框架模板文件引用的静态文件去哪里找
   r.Static("/static","static")
   //告诉gin框架去哪里找模板文件
   r.LoadHTMLGlob("templates/*")
   r.GET("/", func(c *gin.Context) {
      c.HTML(http.StatusOK, "index.html", nil)
   })

   //v1 api
   v1Group := r.Group("v1")
   {
      //待办事项
      //添加
      v1Group.POST("/todo", func(c *gin.Context) {
         //前端页面填写待办事项,点击提交,会发请求到这里
         //1. 从请求中把数据拿出来
         var todo Todo
         c.BindJSON(&todo)
         //2. 存入数据库
         err := DB.Create(&todo).Error
         if err != nil {
            c.JSON(http.StatusOK,gin.H{"error": err.Error()})
         }else {
            c.JSON(http.StatusOK, todo)
            //c.JSON(http.StatusOK, gin.H{
            // "code": 200,
            // "msg" : "success",
            // "data": todo,
            //})
         }
         //3. 返回响应

      })
      //查看所有的代办事项
      v1Group.GET("/todo", func(c *gin.Context) {
         //查询todo这个表里的所有数据
         var todeList []Todo
         err := DB.Find(&todeList).Error
         if err != nil {
            c.JSON(http.StatusOK, gin.H{"error": err.Error()})
         }else {
            c.JSON(http.StatusOK, todeList)
         }
      })
      //查看某一个代办事项
      v1Group.GET("/todo/:id", func(c *gin.Context) {

      })
      //修改某一个待办事项
      v1Group.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
         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)
         }
      })
      //删除
      v1Group.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(":9090")
}

以上是关于Gin+Gorm小项目的主要内容,如果未能解决你的问题,请参考以下文章

Go实战Gin + Gorm 基于RESTful API 的简单备忘录 | 含接口文档

如何使用 Gin 和 Gorm 搭建一个简单的 API 服务

gin框架学习-Gin框架和Gorm框架搭建一个简单的API微服务

gin+gorm 用户服务

Gin实现简单接口

Casbin + Gin + Gorm 学习探索