gin框架小项目案例demo

摘自github

1、项目文件目录:
在这里插入图片描述
2、main.go

import (
	"awesomeProject/bubble/dao"
	"awesomeProject/bubble/models"
	"awesomeProject/bubble/routes"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

// 遇事不决 注释先行
func main() {
	//1. 连接MySql数据库
	err := dao.InitMySQL()
	if err!= nil{
		panic(err)
	}
	defer dao.Close()
	//2. 自动迁移  把结构体和数据表进行对应
	dao.DB.AutoMigrate(&models.Todo{})
	// 3.注册路由
	r := routes.SetupRouter()
	r.Run()
}

3、注册路由:

import (
	"awesomeProject/bubble/controller"
	"github.com/gin-gonic/gin"
)

func SetupRouter() *gin.Engine{
	r := gin.Default()
	// 告诉gin框架模板文件引用的静态文件去哪里找
	r.Static("/static", "static")
	// 告诉gin框架去哪里找模板文件
	r.LoadHTMLGlob("templates/*")
	r.GET("/", controller.IndexHandler)

	// v1
	v1Group := r.Group("v1")
	{
		// 待办事项
		// 添加
		v1Group.POST("/todo", controller.CreateATodo)
		// 查看所有的待办事项
		v1Group.GET("/todo", controller.GetTodoList)
		// 修改某一个待办事项
		v1Group.PUT("/todo/:id", controller.UpdateATodo)
		// 删除某一个待办事项
		v1Group.DELETE("/todo/:id", controller.DeleteATodo)
	}
	return r
}

4、controller:

import (
	"awesomeProject/bubble/models"
	"github.com/gin-gonic/gin"
	"net/http"
)
/*
正常流程:  url-> controller -> logic -> model 模型层的crud
 */

func IndexHandler(c *gin.Context)  {
	c.HTML(http.StatusOK, "index.html", nil)
}
func CreateATodo(c *gin.Context) {
	// 1.请求中取数据
	var todo models.Todo
	c.BindJSON(&todo)

	//2.存储数据 3.返回响应
	err := models.CreateATodo(&todo)
	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": 2000,
							"msg": "success",
							"data": todo,
		})*/
	}
}
func GetTodoList(c *gin.Context) {
	todoList, err := models.GetAllTodo()
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"error": err.Error()})
	}else {
		c.JSON(http.StatusOK, todoList)
	}
}
func UpdateATodo(c *gin.Context) {
	id, ok := c.Params.Get("id")  //获取请求参数
	if !ok {
		c.JSON(http.StatusOK, gin.H{"error": "id不存在"})
		return
	}

	// 根据id查询待修改实体
	todo, err := models.GetATodo(id)
	if err != nil {
		c.JSON(http.StatusOK, gin.H{"error": err.Error()})
		return
	}

	c.BindJSON(&todo)
	if err = models.UpdateATodo(todo); err != nil{
		c.JSON(http.StatusOK, gin.H{"error": err.Error()})
	}else {
		c.JSON(http.StatusOK, todo)
	}
}
func DeleteATodo(c *gin.Context) {
	id, ok := c.Params.Get("id")
	if !ok {
		c.JSON(http.StatusOK, gin.H{"error":"无效的id"})
		return
	}
	if err := models.DeleteTodo(id); err!=nil{
		c.JSON(http.StatusOK,gin.H{"error": err.Error()})
	}else {
		c.JSON(http.StatusOK, gin.H{id: "deleted"})
	}
}

5、模型层

import "awesomeProject/bubble/dao"

type Todo struct {
	ID int `json:"id"`  //和前端做交互 使用的是json数据
	Title string `json:"title"`
	Status bool	`json:"status"`
}
/*
下面是Todo这个Model的crud操作
 */

func CreateATodo(todo *Todo)(err error)  {
	if err = dao.DB.Create(&todo).Error; err != nil {
		return err
	}
	return
}
func GetAllTodo() (todoList []*Todo, err error) {
	if err := dao.DB.Find(&todoList).Error; err != nil{
		return nil, err
	}
	return
}
func GetATodo(id string)(todo *Todo, err error)  {
	if err = dao.DB.Where("id=?", id).First(todo).Error; err != nil{
		return nil, err
	}
	return
}
func UpdateATodo(todo *Todo)(err error)  {
	err = dao.DB.Save(todo).Error
	return
}
func DeleteTodo(id string)(err error)  {
	err = dao.DB.Where("id=?", id).Delete(&Todo{}).Error
	return
}


6、mysql.go

import "github.com/jinzhu/gorm"
var (
	DB *gorm.DB
)
func InitMySQL()(err error)  {
	dsn := "root:root@(xxx.xxx:3306)/gormDemo?charset=utf8&parseTime=True&loc=Local"
	DB, err  = gorm.Open("mysql", dsn)
	if err!= nil{
		panic(err)
	}
	return DB.DB().Ping()
}
func Close()  {
	DB.Close()
}
发布了100 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_37767455/article/details/104806542