企业级项目结构拆分
程序员文章站
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
上一篇: HTML布局原理