欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

企业级项目结构拆分

程序员文章站 2022-03-26 20:02:37
目录结构 controller:与控制器相关 dao:与数据库相关 logic:与业务逻辑相关 model:模型层的增删改查 routers:路由层 static:静态文件层 templates:模板层 main.go:入口层 例子 go package main import ( "github. ......

目录结构

企业级项目结构拆分
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"})
   }
}

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

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