page contents

Go/Gin 项目封装拆分步骤

Go/Gin 项目封装拆分步骤 原始项目 package main import(    "github.com/gin-gonic/gin"    "github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql") type Todo struct{ID in...

attachments-2021-07-PnU4DmRC60f4f223b2d1f.png

Go/Gin 项目封装拆分步骤

原始项目

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代码清爽了很多

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

程序员编程交流QQ群:805358732

如果你想用Python开辟副业赚钱,但不熟悉爬虫与反爬虫技术,没有接单途径,也缺乏兼职经验
关注下方微信公众号:Python编程学习圈,获取价值999元全套Python入门到进阶的学习资料以及教程,还有Python技术交流群一起交流学习哦。

attachments-2022-06-bJ8SEqHn62ad415ae1298.jpeg

  • 发表于 2021-07-19 11:35
  • 阅读 ( 592 )
  • 分类:Golang

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章