Go/Gin 项目封装拆分步骤

2,401 阅读2分钟

原文链接: Go/Gin 项目封装拆分步骤-八点博客

一个todolist的项目

原始项目

package main

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

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

var(
	DB *gorm.DB
)

func InitMySql() (err error) {
	dsn := "root:root123@tcp(127.0.0.1:3306)/list?charset=utf8mb4&parseTime=True&loc=Local"
	DB1, err := gorm.Open("mysql", dsn)
	if err != nil {
		return
	}
	DB = DB1
	return DB1.DB().Ping()
}

func main(){

    //连接数据库
    err := InitMySql()
	if err != nil{
		panic(err)
	}
	defer DB.Close()

    //定义路由
    r := gin.Default()
	r.Static("/static", "static")
	r.LoadHTMLGlob("templates/*")
	r.GET("/", controller.IndexHandler)
	v1Group := r.Group("v1")
	{
		v1Group.POST("/todo", function(c *gin.Context){ ... })
		v1Group.GET("/todo",  function(c *gin.Context){ ... })
		v1Group.PUT("/todo/:id",  function(c *gin.Context){ ... })
		v1Group.DELETE("/todo/:id",  function(c *gin.Context){ ... })
	}

    r.Run()

}

应拆分成

dao 主要用于数据库等的连接初始化
model 主要用于数据的curd
controller 主要用于路由中绑定的处理过程
router 主要用于封装路由列表

1、dao(dao\mysql.go)主要用于数据库等的连接初始化

package dao

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

var(
	DB *gorm.DB
)

func Close()  {
	DB.Close()
}

func InitMySql() (err error) {
	dsn := "root:root123@tcp(127.0.0.1:3306)/list?charset=utf8mb4&parseTime=True&loc=Local"
	DB1, err := gorm.Open("mysql", dsn)
	if err != nil {
		return
	}
	DB = DB1
	return DB1.DB().Ping()
}

2、model(model\todo.go)

package model

import (
	"list/dao"
)

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

func CreateATodo(todo *Todo) (err error) {
	err = dao.DB.Create(&todo).Error
	return
}

func GetTodoList() (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)  {
	todo = new(Todo)
	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 DeleteATodo(id string) (err error){
	err = dao.DB.Where("id=?" , id).Delete(&Todo{}).Error
	return
}

3、controller(controller\controller.go)

package controller

import (
	"github.com/gin-gonic/gin"
	"list/model"
)

func IndexHandler(c *gin.Context) {
	c.HTML(200, "index.html", nil)
}

func CreateATodo(c *gin.Context) {

	var todo model.Todo
	c.BindJSON(&todo)

	if err := model.CreateATodo(&todo); err != nil{
		c.JSON(200, gin.H{"error": err.Error()})
	}else{
		c.JSON(200, todo)
	}
}

func GetTodoList(c *gin.Context) {
	if todoList, err := model.GetTodoList(); err != nil{
		c.JSON(200, gin.H{"error": err.Error()})
	}else{
		c.JSON(200, todoList)
	}
}

func UpdateATodo(c *gin.Context) {
	id,ok := c.Params.Get("id")
	if !ok{
		c.JSON(200, gin.H{"error":"缺少id"})
		return
	}

	todo,err := model.GetATodo(id)

	if err != nil{
		c.JSON(200, gin.H{"error":"查找失败"})
		return
	}
	c.BindJSON(&todo)

	if err2 := model.UpdateATodo(todo); err2 != nil{
		c.JSON(200, gin.H{"error": err2.Error()})
	}else{
		c.JSON(200, todo)
	}
}

func DeleteATodo(c *gin.Context) {
	id, ok := c.Params.Get("id")
	if !ok {
		c.JSON(200, gin.H{"error":"missing id"})
		return
	}
	if err := model.DeleteATodo(id); err != nil{
		c.JSON(200, gin.H{"error:":err.Error()})
	}else{
		c.JSON(200, gin.H{"msg":"删除成功"})
	}

}

4、router(router\router.go)

package routers

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

func SetUpRoute() *gin.Engine {
	r := gin.Default()

	r.Static("/static", "static")
	r.LoadHTMLGlob("templates/*")
	r.GET("/", controller.IndexHandler)
	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
}

main.go

package main

import(
	"list/dao"
	"list/model"
	"list/routers"
)

func main()  {
	err := dao.InitMySql()
	if err != nil{
		panic(err)
	}

	defer dao.Close()
	dao.DB.AutoMigrate(&model.Todo{})
	r := routers.SetUpRoute()
	r.Run()
}

可以看到main.go代码清爽了很多