go基於echo、gorm實現增刪改查,從請求到落庫

關注掘金有些時日了,這是個好地方,這裏的人民雖然摸魚搞蝦,可是一點都不魚龍混雜更不會瞎搞;這是個好地方,這裏的人民雖然T恤短衫,但不是衣冠禽獸;這是個好地方,這裏的人民雖然光頭禿頂,可是個個都精神飽滿,無怨無悔的996,甚至007.java

無能否認,上述的排比實在不咋地,甚至不大通順,原諒我是個掘金新手,一個剛從某csdn某園刪庫跑路過來的新手,也請原諒我是個少數民族,在博大精深的漢語面前甚是卑微,可是阻擋不了我對掘金的熱情,我向新神和舊神起誓,無論前面是地雷陣仍是萬丈深淵,我將爲掘金的崛起鞠躬盡瘁死然後已,哎這話說的我都信了,我是確實是個新手,請各位大佬多多關照吧,寫博客嘛實話實說一個是爲了本身作個筆記,二個嘛也是作個所謂的分享,分享的東西不免是有些不足的地方,if有錯誤或是不當的地方還請指正.mysql

切入正題:git

一.項目解構github

解構說明:

conf // 配置相關spring

dao // 數據庫sql

log // 日誌數據庫

router // 路由相關,至關於java springMVC中controllerjson

app.go // main函數入口,啓動類api

conf.tomf // 配置文件bash

2、部分代碼說明

項目入口:

app.go

package main

import (
	"fmt"
	"github.com/labstack/echo"
	"go-learning/conf"
	"go-learning/log"
	"go-learning/router"
	"go-learning/router/response"
	"net/http"
)

func main() {
	e := echo.New()
	e.HTTPErrorHandler = customHTTPErrorHandler
	router.RouterInit(e)
	e.Logger.Info(e.Start(conf.Conf.Server.Port))
}

//路由錯誤頁面配置
func customHTTPErrorHandler(err error, c echo.Context) {
	var (
		code = http.StatusInternalServerError
		msg  interface{}
	)

	if he, ok := err.(*echo.HTTPError); ok {
		code = he.Code
		msg = he.Message
		if he.Internal != nil {
			msg = fmt.Sprintf("%v, %v", err, he.Internal)
		}
	} else if c.Echo().Debug {
		msg = err.Error()
	} else {
		msg = fmt.Sprintf("%s : %v", http.StatusText(code), err)
	}
	if _, ok := msg.(string); ok {
		msg = c.JSON(http.StatusInternalServerError, response.Error(&response.GlobalErrorCode{ErrorCode: code, Error: fmt.Sprint(msg)}))
	}
	// Send response
	if !c.Response().Committed {
		// Issue #608
		if c.Request().Method == "HEAD" {
			err = c.NoContent(code)
		} else {
			err = c.JSON(code, msg)
		}
		if err != nil {
			log.Error(err)
		}
	}
}
複製代碼

主函數啓動以後加載配置的路由:

主函數中router.RouterInit(e) ->init.go中方法RouterInit->api_router.go中ApiRouters(e *echo.Echo)最終加載路由:

package packet
 
import (
	"github.com/labstack/echo"
)
 
// 路由器
func ProductRouter(e *echo.Echo) {
	// 增
	e.POST("/v1/go/learn/add", Add)
	// 刪
	e.POST("/v1/go/learn/del", Del)
	// 改
	e.POST("/v1/go/learn/update", Update)
	// 查
	e.GET("/v1/go/learn/get/list", GetList)
}
複製代碼

3、實現一個具體的請求

從上述的路由中加載路由,例如:e.POST("/v1/go/learn/add", Add)

Add是指定的實現方法,以下:

packet_product_handler.go中

// 新增商品
func Add(c echo.Context) (err error) {
	product := new(service.ProductBO)
	if  err = c.Bind(product); err != nil{
		return c.JSONBlob(http.StatusBadRequest, nil)
	}
	// 保存
	service.Save(product)
	return c.JSON(http.StatusOK, response.OK())
}
複製代碼

packet_product_handler.go中的service.Save(product)是調用service方法這個是模擬java分層來寫的以下:

product_service.go中

func Save(bo *ProductBO) {
	do := new(mapper.T_product)
	do.Product_name = bo.ProductName
	do.Product_url = bo.ProductUrl
	do.Created_at = time.Now().Format("2006-01-02 15:04:05")
	do.Created_by = "sys"
	do.Updated_at = time.Now().Format("2006-01-02 15:04:05")
	mapper.Save(do)
}
複製代碼

其中ProductBO是一個結構體,以下:

// 成員變量首字母要大寫
type (
	ProductBO struct {
		Id  int `json:"id"`
		ProductName string  `json:"productName"`
		ProductUrl string `json:"productUrl"`
	}
)
複製代碼

最後調用dao與數據庫作交互,這裏天然是落庫了,以下:

func Save(product *T_product) {
	db = dao.GetDb()
	db.Create(product)
}
複製代碼

其中數據庫的鏈接信息是經過db.go的方法獲取,以下:

func dbConn(MyUser, Password, Host, Db string, Port int) *gorm.DB {
	connArgs := fmt.Sprintf("%s:%s@(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", MyUser,Password, Host, Port, Db )
	db, err := gorm.Open("mysql", connArgs)
	if err != nil {
		log.Fatal(err)
	}
	db.SingularTable(true)
	return db
}
 
func GetDb() *gorm.DB {
	return dbConn("root", "root", "127.0.0.1", "spring_jpa", 3306);
}
複製代碼

其中一些數據庫的配置能夠寫到配置文件中,這裏就直接放到代碼裏邊了,以上就是一大體的從獲取http請求到落庫的過程.具體增刪改查的代碼能夠參考github倉庫,倉庫地址以下:

github.com/15902124763…

畢竟是個新手寫到東西,剛從java轉戰過來的,不免會有些不足的地方,但願多多包含,若是有些誤導的地方還請多多去找找度娘或者Google.或者請教掘金的各位大佬.

相關文章
相關標籤/搜索