企业级项目结构拆分
- 作者: 像个蝴蝶
- 来源: 51数据库
- 2021-08-08
目录结构

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=utf-8&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=utf-8&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
推荐阅读
