企业级项目结构拆分

目录结构


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"})
   }
}

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

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

原文地址:https://www.cnblogs.com/zisefeizhu/p/12795275.html