• 企业级项目结构拆分


    目录结构


    controller:与控制器相关

    dao:与数据库相关

    logic:与业务逻辑相关

    model:模型层的增删改查

    routers:路由层

    static:静态文件层

    templates:模板层

    main.go:入口层

    例子

    package main
    
    import (
       "github.com/gin-gonic/gin"
       "github.com/jinzhu/gorm"
       _ "github.com/jinzhu/gorm/dialects/mysql"
       "net/http"
    )
    
    var (
       DB *gorm.DB
    )
    
    //Tode Model
    type Todo struct {
       ID int `json:"id"`
       Title string `json:"title"`
       Status bool `json:"status"`
    }
    
    func initMySQL()  (err error)  {
       dsn := "root:123456@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
       DB, err = gorm.Open("mysql",dsn)
       //测试连通性
       err = DB.DB().Ping()
       return
       //return DB.DB().Ping()
    }
    
    func main() {
       //创建数据库
       //sql: CREATE DATABASE bubble;
       //连接数据库
       err := initMySQL()
       if err != nil {
          //可以搞个日志
          panic(err)
       }
       //模型绑定
       DB.AutoMigrate(&Todo{})   //todos
       defer DB.Close()  //程序退出,关闭数据库
       //遇事不决写注释
       r := gin.Default()
       //告诉gin框架模板文件引用的静态文件去哪里找
       r.Static("/static","static")
       //告诉gin框架去哪里找模板文件
       r.LoadHTMLGlob("templates/*")
       r.GET("/", func(c *gin.Context) {
          c.HTML(http.StatusOK, "index.html", nil)
       })
    
       //v1 api
       v1Group := r.Group("v1")
       {
          //待办事项
          //添加
          v1Group.POST("/todo", func(c *gin.Context) {
             //前端页面填写待办事项,点击提交,会发请求到这里
             //1. 从请求中把数据拿出来
             var todo Todo
             c.BindJSON(&todo)
             //2. 存入数据库
             err := DB.Create(&todo).Error
             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": 200,
                // "msg" : "success",
                // "data": todo,
                //})
             }
             //3. 返回响应
    
          })
          //查看所有的代办事项
          v1Group.GET("/todo", func(c *gin.Context) {
             //查询todo这个表里的所有数据
             var todeList []Todo
             err := DB.Find(&todeList).Error
             if err != nil {
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
             }else {
                c.JSON(http.StatusOK, todeList)
             }
          })
          //查看某一个代办事项
          v1Group.GET("/todo/:id", func(c *gin.Context) {
    
          })
          //修改某一个待办事项
          v1Group.PUT("/todo/:id", func(c *gin.Context) {
             id, ok := c.Params.Get("id")
             if !ok {
                c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
                return
             }
             var todo Todo
             if err = DB.Where("id=?", id).First(&todo).Error; err!=nil{
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
                return
             }
             c.BindJSON(&todo)
             if err = DB.Save(&todo).Error; err!= nil{
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
             }else{
                c.JSON(http.StatusOK, todo)
             }
          })
          //删除
          v1Group.DELETE("/todo/:id", func(c *gin.Context) {
             id, ok := c.Params.Get("id")
             if !ok {
                c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
                return
             }
             if err = DB.Where("id=?", id).Delete(Todo{}).Error;err!=nil{
                c.JSON(http.StatusOK, gin.H{"error": err.Error()})
             }else{
                c.JSON(http.StatusOK, gin.H{id:"deleted"})
             }
          })
       }
       r.Run(":9090")
    }
    
    拆分

    main.go

    package main
    
    import (
    	"bubble/dao"
      "bubble/models"
    	"bubble/routers"
    )
    
    func main() {
    	//创建数据库
    	//sql: CREATE DATABASE bubble;
    	//连接数据库
    	err := dao.InitMySQL()
    	if err != nil {
    		//可以搞个日志
    		panic(err)
    	}
    	defer dao.Close()  //程序退出,关闭数据库
    	//模型绑定
    	//dao.DB.AutoMigrate(&models.Todo{})   //todos
    	dao.InitModel()
      //注册路由
    	r := routers.SetUpRouter()
    	r.Run(":9090")
    }
    

    routers.go

    package routers
    
    import (
    	"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 api
    	v1Group := r.Group("v1")
    	{
    		//待办事项
    		//添加
    		v1Group.POST("/todo", controller.CreateTodo)
    		//查看所有的代办事项
    		v1Group.GET("/todo", controller.GetTodoList)
    		//查看某一个代办事项
    		v1Group.GET("/todo/:id", func(c *gin.Context) {
    			//暂时没有用到
    		})
    		//修改某一个待办事项
    		v1Group.PUT("/todo/:id", controller.UpdateATode)
    		//删除
    		v1Group.DELETE("/todo/:id", controller.DeleATode)
    	}
    	return r
    }
    

    todo.go

    package models
    
    import (
    	"bubble/dao"
    )
    
    //Tode Model
    type Todo struct {
    	ID int `json:"id"`
    	Title string `json:"title"`
    	Status bool `json:"status"`
    }
    
    //todo model的增删改查
    //createATodo创建todo
    func CreateATodo(todo *Todo) (err error) {
    	if err = dao.DB.Create(&todo).Error;err != nil {
    		return err
    	}
    	return
    }
    
    func GetAllTodoList() (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 DeleATodo(id string) (err error)  {
    	err = dao.DB.Where("id = ?", id).Delete(&Todo{}).Error
    }
    

    mysql.go

    package dao
    
    import (
    	"bubble/models"
    	"github.com/jinzhu/gorm"
    	_ "github.com/jinzhu/gorm/dialects/mysql"
    )
    var (
    	DB *gorm.DB
    )
    
    
    func InitMySQL()  (err error)  {
    	dsn := "root:123456@tcp(127.0.0.1:3306)/bubble?charset=utf8mb4&parseTime=True&loc=Local"
    	DB, err = gorm.Open("mysql",dsn)
    	//测试连通性
    	if err != nil {
    		return
    	}
    	return DB.DB().Ping()
    	//return DB.DB().Ping()
    }
    func InitModel()  {
    	DB.AutoMigrate(&models.Todo{})
    }
    
    func Close()  {
    	DB.Close()
    }
    

    controller.go

    package controller
    
    import (
       "bubble/models"
       "github.com/gin-gonic/gin"
       "net/http"
    )
    
    /*
       url    --> controller  -->logic      --> model
       请求   --> 控制器      --> 业务逻辑  --> 模型层的增删改查
     */
    
    func IndexHandler(c *gin.Context) {
       c.HTML(http.StatusOK, "index.html", nil)
    }
    
    func CreateTodo(c *gin.Context) {
       //前端页面填写待办事项,点击提交,会发请求到这里
       //1. 从请求中把数据拿出来
       var todo models.Todo
       c.BindJSON(&todo)
       //2. 存入数据库
       //err := DB.Create(&todo).Error
       //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": 200,
          // "msg" : "success",
          // "data": todo,
          //})
       }
    }
    
    func GetTodoList(c *gin.Context) {
       //查询todo这个表里的所有数据
       //var todeList []Todo
       todoList, err := models.GetAllTodoList()
       if err != nil {
          c.JSON(http.StatusOK, gin.H{"error": err.Error()})
       }else {
          c.JSON(http.StatusOK, todoList)
       }
    }
    
    func UpdateATode(c *gin.Context) {
       id, ok := c.Params.Get("id")
       if !ok {
          c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
          return
       }
       todo, err := models.GetATodo(id)
       //var todo Todo
       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 DeleATode(c *gin.Context) {
       id, ok := c.Params.Get("id")
       if !ok {
          c.JSON(http.StatusOK, gin.H{"error": "无效的id"})
          return
       }
       if err := models.DeleATodo(id);err!=nil{
          c.JSON(http.StatusOK, gin.H{"error": err.Error()})
       }else{
          c.JSON(http.StatusOK, gin.H{id:"deleted"})
       }
    }
    

    我这开发是真的有点差呢,一定要在今年拿出原创项目!

    感谢七米老师的无私分享。

  • 相关阅读:
    P2330 05四川 繁忙的都市
    Winform中实现更改DevExpress的RadioGroup的选项时更改其他控件(TextEdit、ColorPickEdit)的值
    Winform中实现读取xml配置文件并动态配置DevExpress的RadioGroup的选项
    Winform中对DevExpress的RadioGroup进行数据源绑定,即通过代码添加选项
    Winform中对自定义xml配置文件进行Xml节点的添加与删除
    Winform中自定义xml配置文件后对节点进行读取与写入
    C#中使用StreamReader实现文本文件的读取与写入
    Python编程书籍高清PDF免费下载
    Winform中自定义xml配置文件,并配置获取文件路径
    Winform中实现ZedGraph新增自定义Y轴上下限、颜色、标题功能
  • 原文地址:https://www.cnblogs.com/zisefeizhu/p/12795275.html
Copyright © 2020-2023  润新知