作者 yangfu

增加:gin接入

... ... @@ -5,6 +5,7 @@ go 1.14
require (
github.com/astaxie/beego v1.12.1
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/gin-gonic/gin v1.4.0
github.com/go-pg/pg/v10 v10.0.0-beta.2
github.com/linmadan/egglib-go v0.0.0-20191217144343-ca4539f95bf9
github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644 // indirect
... ...
... ... @@ -7,6 +7,7 @@ import (
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg"
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/redis"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
//"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/ginsvr"
_ "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/appsvr"
)
... ... @@ -16,5 +17,6 @@ func main() {
}()
log.Info("app start!")
log.Info(constant.POSTGRESQL_DB_NAME)
//ginsvr.Run()
beego.Run()
}
... ...
... ... @@ -2,11 +2,11 @@ package constant
import "os"
var POSTGRESQL_DB_NAME = "partner_dev" //partner
var POSTGRESQL_USER = "postgres" //
var POSTGRESQL_PASSWORD = "postgres_15432" //pgsql@123
var POSTGRESQL_HOST = "101.37.68.23" //127.0.0.1
var POSTGRESQL_PORT = "15432" //5432
var POSTGRESQL_DB_NAME = "partner_dev" //partner
var POSTGRESQL_USER = "postgres" //
var POSTGRESQL_PASSWORD = "eagle1010" //pgsql@123
var POSTGRESQL_HOST = "114.55.200.59" //127.0.0.1
var POSTGRESQL_PORT = "31543" //5432
var DISABLE_CREATE_TABLE = false
var DISABLE_SQL_GENERATE_PRINT = false
... ...
package controllers
import (
"github.com/astaxie/beego/validation"
"github.com/gin-gonic/gin"
"github.com/tiptok/gocomm/pkg/mygin"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
"strconv"
)
type BaseController struct {
mygin.BaseController
}
func (this *BaseController) Resp(c *gin.Context, httpCode int, rsp *protocol.ResponseMessage) {
c.Set("outputData", rsp)
c.JSON(httpCode, rsp)
//c.Abort()
}
func (controller *BaseController) Valid(obj interface{}) (result bool, msg *protocol.ResponseMessage) {
/*校验*/
var err error
valid := validation.Validation{}
result, err = valid.Valid(obj)
if err != nil {
}
if !result {
msg = protocol.BadRequestParam(2)
return
}
return
}
//获取请求头信息
func (this *BaseController) GetRequestHeader(c *gin.Context) *protocol.RequestHeader {
h := &protocol.RequestHeader{}
h.AccessToken = c.Query("x-mmm-accesstoken")
h.AppProject = c.Query("x-mmm-appproject")
h.DeviceType, _ = strconv.Atoi(c.Query("x-mmm-devicetype"))
h.Sign = c.Query("x-mmm-sign")
h.Uuid = c.Query("x-mmm-uuid")
h.TimeStamp = c.Query("x-mmm-timestamp")
h.Version = c.Query("x-mmm-version")
h.UserId, _ = strconv.ParseInt(c.Query("x-mmm-id"), 10, 64)
if len(h.AccessToken) > 0 {
if claim, err := utils.ParseJWTToken(h.AccessToken); err == nil {
h.UserId = claim.UserId
}
}
return h
}
... ...
package controllers
import (
"github.com/gin-gonic/gin"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/order"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
"net/http"
"time"
)
type OrderController struct {
BaseController
}
//OrderStatistics 订单统计
// @router /statistics [post]
func (this *OrderController) Statistics(c *gin.Context) {
var msg *protocol.ResponseMessage
defer func() {
this.Resp(c, http.StatusOK, msg)
}()
var request *protocol.OrderStatisticsRequest
if err := c.ShouldBind(&request); err != nil {
msg = protocol.BadRequestParam(1)
return
}
if b, m := this.Valid(request); !b {
msg = m
return
}
header := this.GetRequestHeader(c)
msg = protocol.NewReturnResponse(order.Statistics(header, request))
}
//OrderDetail 订单详情
// @router /orderDetail [post]
func (this *OrderController) OrderDetail(c *gin.Context) {
var msg *protocol.ResponseMessage
defer func() {
this.Resp(c, http.StatusOK, msg)
}()
var request *protocol.OrderDetailRequest
if err := c.ShouldBind(&request); err != nil {
msg = protocol.BadRequestParam(1)
return
}
if b, m := this.Valid(request); !b {
msg = m
return
}
header := this.GetRequestHeader(c)
msg = protocol.NewReturnResponse(order.Detail(header, request))
}
//OrderList
func (this *OrderController) OrderList(c *gin.Context) {
var msg *protocol.ResponseMessage
defer func() {
this.Resp(c, http.StatusOK, msg)
}()
var request *protocol.OrderListRequest
if err := c.ShouldBind(&request); err != nil {
msg = protocol.BadRequestParam(1)
return
}
if b, m := this.Valid(request); !b {
msg = m
return
}
request.OrderType = domain.OrderReal
header := this.GetRequestHeader(c)
msg = protocol.NewReturnResponse(order.List(header, request))
}
//OrderList
func (this *OrderController) Intentions(c *gin.Context) {
var msg *protocol.ResponseMessage
defer func() {
this.Resp(c, http.StatusOK, msg)
}()
var request *protocol.OrderListRequest
if err := c.ShouldBind(&request); err != nil {
msg = protocol.BadRequestParam(1)
return
}
if b, m := this.Valid(request); !b {
msg = m
return
}
request.EndTime = time.Now().Unix() * 1000
request.OrderType = domain.OrderIntention
header := this.GetRequestHeader(c)
msg = protocol.NewReturnResponse(order.List(header, request))
}
... ...
package middleware
import (
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
"io/ioutil"
"net/http"
"time"
)
func CreateRequstLogFilter() gin.HandlerFunc {
return func(ctx *gin.Context) {
requestId := fmt.Sprintf("%v.%v", ctx.Request.Method, ctx.Request.RequestURI)
ctx.Set("requestId", requestId)
var body string = "{}"
if _, ok := ctx.Get("requestBody"); ok {
data, _ := ctx.Get("requestBody")
body = string(data.([]byte))
}
start := time.Now()
ctx.Next()
end := time.Now()
latency := end.Sub(start)
v, _ := ctx.Get("outputData")
rspBody, _ := json.Marshal(v)
if len(rspBody) > 500 {
rspBody = rspBody[:500]
}
log.Debug(fmt.Sprintf("====>Recv User:%v | %v | %s | %v | \nAuth=%v \nReqBody:%s \nRspBody:%v", ctx.Query("UserId"), ctx.ClientIP(), requestId, latency, ctx.Query("x-mmm-accesstoken"), body, string(rspBody)))
}
}
func CreateResponseLogFilter() func(ctx *gin.Context) {
return func(ctx *gin.Context) {
requestId, _ := ctx.Get("requestId")
v, _ := ctx.Get("outputData")
body, _ := json.Marshal(v)
if len(body) > 1000 {
body = body[:1000]
}
log.Debug(fmt.Sprintf("<====Send RequestId:%v BodyData:%s", requestId, body))
}
}
func CreateRequestBodyFilter() func(ctx *gin.Context) {
return func(ctx *gin.Context) {
if ctx.Request.Method == http.MethodPost || ctx.Request.Method == http.MethodPut {
body, _ := ioutil.ReadAll(ctx.Request.Body)
if len(body) == 0 {
body = []byte("{}")
}
ctx.Set("requestBody", body)
ctx.Request.Body.Close()
}
}
}
... ...
package routers
import (
"github.com/gin-gonic/gin/ginS"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/ginsvr/controllers"
"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/port/ginsvr/middleware"
)
func init() {
//ginS.Use(middleware.CreateRequestBodyFilter())
ginS.Use(middleware.CreateRequstLogFilter())
order := &controllers.OrderController{}
ginS.POST("/order/statistics", order.Statistics)
ginS.POST("/order/details", order.OrderDetail)
ginS.POST("/order/list", order.OrderList)
ginS.POST("/order/intentions", order.Intentions)
}
... ...