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技术交流群一起交流学习哦。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!