gin结合gorm实现mysql增删改查

2023年1月19日09:28:22

https://gin-gonic.com/

https://gorm.io/zh_CN/docs/index.html

https://github.com/gin-gonic/gin/

https://github.com/go-gorm/gorm

集成

go mod方式

require (
	github.com/gin-contrib/sessions v0.0.3
	github.com/gin-gonic/gin v1.6.2
	github.com/go-sql-driver/mysql v1.5.0
	gorm.io/driver/mysql v1.0.3
	gorm.io/gorm v1.20.5
)

链接mysql

package core

import (
	"gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func Connection() (*gorm.DB) {
	dsn := "root:123456@tcp(127.0.0.1:3306)/goblog?charset=utf8&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err !=  nil {
		panic(err)
	}
	return db
}

 

使用

model

package models

type Post struct {
	ID         int64 
	CategoryId int64 `form:"category_id"`
	Title      string `form:"title"`
	Image      string `form:"image"`
	Content    string `form:"content"`
	Sort       int `form:"sort"`
	Status     int `form:"status"`
	CreatedAt  int64
	UpdatedAt  int64
}

增删改查

package logics

import (
	"myweb/app/models"
)

func ListPost(datas []models.Post, page int) ([]models.Post, int64, error) {
	var pageSize = 2
	offset := (page - 1) * pageSize
	result := db.Order("id desc").Offset(offset).Limit(pageSize).Find(&datas)
	return datas, result.RowsAffected, result.Error
}

func CreatePost(data models.Post) (int64, error) {
	result := db.Create(&data) 
	return data.ID, result.Error
}

func FindPost(id int64) (models.Post, error) {
	var model models.Post
	result := db.First(&model, id)
	return model, result.Error
}

func UpdatePost(data models.Post, id int64) (int64, error) {
	var model models.Post
	row := db.First(&model, id)
	if row.Error == nil {
		result := db.Model(&model).Updates(&data)
		return model.ID, result.Error
	}
	return 0, row.Error
}

func DeletePost(id int64) (int64, error) {
	var model models.Post
	result := db.Delete(&model, id)
	return result.RowsAffected, result.Error
}

 

congroller

package controllers

import (
    "github.com/gin-gonic/gin"
    "net/http"
    "myweb/app/logics"
		"myweb/app/models"
		"myweb/app/utils"
		"strconv"
		"path"
)


func ListPost(c *gin.Context) {
	page, _ := strconv.Atoi(c.Query("page"))
	if page == 0 {
		page = 1
	}
  var list []models.Post
	res, rows, err := logics.ListPost(list, page)
	if err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=文章错误&href=/home&err=" + err.Error())
  }
	c.HTML(http.StatusOK, "post_list.html", gin.H{"title": "文章列表", "list": res, "pageTotal": rows})
}

func NewPost(c *gin.Context) {
	var list []models.Category
	categories, err := logics.ListCategory(list)
	if err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=分类错误&href=/home&err=" + err.Error())
  }
	c.HTML(http.StatusOK, "post_new.html", gin.H{"title": "新增文章", "categories": categories})
}

func CreatePost(c *gin.Context) {
	var model models.Post
	file, err := c.FormFile("file")
	if err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=请选择文件&href=/posts/new&err=" + err.Error())
	}
	if err := c.Bind(&model); err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=新增文章错误&href=/posts/new&err=" + err.Error())
	}
	if file != nil {
		// 获取后缀
		fileSuffix := path.Ext(file.Filename)
		// 新文件名称
		newFileName := utils.GetRoundName(12) + fileSuffix
		// 创建保存文件夹
		saveDir := utils.GetSaveDir("app/static/upload")
		SaveFile := saveDir + "/" + newFileName
		c.SaveUploadedFile(file, SaveFile)
		model.Image = SaveFile
	}
	
	if _, err := logics.CreatePost(model); err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=新增文章错误&href=/posts/new&err=" + err.Error())
  }
  c.Redirect(http.StatusMovedPermanently, "/posts")
}

func EditPost(c *gin.Context) {
  id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
	res, err := logics.FindPost(id)
	if err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=获取文章错误&href=/posts&err=" + err.Error())
  }
	var list []models.Category
	categories, err := logics.ListCategory(list)
	if err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=分类错误&href=/home&err=" + err.Error())
  }
	c.HTML(http.StatusOK, "post_edit.html", gin.H{"title": "修改文章", "id": id, "model": res, "categories": categories})
}

func UpdatePost(c *gin.Context) {
  id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
	var model models.Post
	file, err := c.FormFile("file")
	if err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=请选择文件&href=/posts/new&err=" + err.Error())
  }
	if file != nil {
		// 获取后缀
		fileSuffix := path.Ext(file.Filename)
		// 新文件名称
		newFileName := utils.GetRoundName(12) + fileSuffix
		// 创建保存文件夹
		saveDir := utils.GetSaveDir("app/static/upload")
		SaveFile := saveDir + "/" + newFileName
		c.SaveUploadedFile(file, SaveFile)
		model.Image = SaveFile
	}
	if err := c.Bind(&model); err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=更新文章错误&href=/posts/edit/"+ strconv.FormatInt(id,10) +"&err=" + err.Error())
	}
	if _, err := logics.UpdatePost(model, id); err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=更新文章错误&href=/posts/edit/"+ strconv.FormatInt(id,10) +"&err=" + err.Error())
	}
  c.Redirect(http.StatusMovedPermanently, "/posts")
	return
}

func DeletePost(c *gin.Context) {
  id, _ := strconv.ParseInt(c.Param("id"), 10, 64)
  if _, err := logics.DeletePost(id); err != nil {
    c.Redirect(http.StatusMovedPermanently, "/error?title=删除文章错误&href=/posts&err=" + err.Error())
  }
  c.Redirect(http.StatusMovedPermanently, "/posts")
	return
}

 

路由

package routers

import (
    "github.com/gin-gonic/gin"
    "myweb/app/controllers"
)

func InitRouter() *gin.Engine {

    router := gin.Default()
    router.Static("/static", "app/static")
    router.LoadHTMLGlob("app/templates/*")

    router.GET("/error",controllers.ErrorPage)

    router.GET("/categories",controllers.ListCategory)
    router.GET("/categories/new",controllers.NewCategory)
    router.POST("/categories/create",controllers.CreateCategory)
    router.GET("/categories/edit/:id",controllers.EditCategory)
    router.POST("/categories/update/:id",controllers.UpdateCategory)
    router.GET("/categories/delete/:id",controllers.DeleteCategory)

    router.GET("/posts",controllers.ListPost)
    router.GET("/posts/new",controllers.NewPost)
    router.POST("/posts/create",controllers.CreatePost)
    router.GET("/posts/edit/:id",controllers.EditPost)
    router.POST("/posts/update/:id",controllers.UpdatePost)
    router.GET("/posts/delete/:id",controllers.DeletePost)
    
	
    return router

}

 

列表页面

{{ range .list }}
        <tr>
          <td>{{ .ID }}</td>
          <td>{{ .Title }}</td>
          <td>{{ .Sort }}</td>
          <td>{{ .UpdatedAt }}</td>
          <td>
            <a class="layui-btn layui-btn-xs" lay-event="edit" href="/posts/edit/{{ .ID }}">编辑</a> 
            <a class="layui-btn layui-btn-danger layui-btn-xs" href="/posts/delete/{{ .ID }}">删除</a>
          </td>
        </tr>
        {{end}}

 

入口

package main

import (
	"myweb/app/core"
	"myweb/app/routers"
)

func main() {
	core.Connection()
	router := routers.InitRouter()
	//静态资源
	router.Run(":8081")
}

 

 

项目地址: https://github.com/tang05709/gin-learn

  • 作者:tang05709
  • 原文链接:https://blog.csdn.net/tang05709/article/details/109574062
    更新时间:2023年1月19日09:28:22 ,共 6001 字。