目錄結構

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.uj5u.com/houduan/17385.html
標籤:Go
上一篇:Gin+Gorm小專案
