package middleware import ( "context" "jyOrderManager/internal/jytuil" "jyOrderManager/internal/model" "jyOrderManager/internal/service" "sync" "net/http" "time" util "app.yhyue.com/moapp/jybase/common" "github.com/gogf/gf/v2/errors/gcode" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/net/ghttp" ) type sMiddleware struct { } var ( logArr = []map[string]interface{}{} logLock = &sync.Mutex{} logSaveCount int ) func init() { logSaveCount = g.Cfg().MustGet(context.Background(), "logger.logSaveCount", 500).Int() service.RegisterMiddleware(&sMiddleware{}) } // 定时保存日志 func SaveLogTask() { logLock.Lock() if len(logArr) >= 1 { tmpArr := logArr logArr = make([]map[string]interface{}, 0) go func() { g.Log().Info(context.TODO(), "timer..save..visit..log", len(tmpArr)) jytuil.MG.DB("log").SaveBulk("jy_seo_logs", tmpArr...) }() } logLock.Unlock() time.AfterFunc(5*time.Minute, SaveLogTask) } // 访问日志 func (s *sMiddleware) Log(r *ghttp.Request) { timeNow := time.Now() data := map[string]interface{}{ "date": timeNow.Unix(), "ip": r.GetClientIp(), "refer": r.Referer(), "year": timeNow.Year(), "month": timeNow.Month(), "day": timeNow.Day(), "hour": timeNow.Hour(), "minutes": timeNow.Minute(), "mdescribe": r.GetBodyString(), "client": r.UserAgent(), "os": util.GetOS(r.UserAgent()), "browse": util.GetBrowse(r.UserAgent()), "method": r.Method, "url": r.RequestURI, } if userId, err := r.Session.Get("userId"); err == nil && !userId.IsEmpty() { data["userid"] = userId.String() } logLock.Lock() logArr = append(logArr, data) if len(logArr) >= logSaveCount { tmpArr := logArr logArr = make([]map[string]interface{}, 0) go func() { g.Log().Info(r.Context(), "save..visit..log", len(tmpArr)) jytuil.MG.DB("log").SaveBulk("jy_seo_logs", tmpArr...) }() } logLock.Unlock() r.Middleware.Next() } // Ctx 获取用户身份 func (s *sMiddleware) Ctx(r *ghttp.Request) { r.Middleware.Next() } // LoginFilter 登录过滤拦截 func (s *sMiddleware) LoginFilter(r *ghttp.Request) { r.Middleware.Next() } // CORS 允许跨域请求 func (s *sMiddleware) CORS(r *ghttp.Request) { r.Response.CORSDefault() r.Middleware.Next() } // MiddlewareHandlerResponse is the default middleware handling handler response object and its error. func (s *sMiddleware) MiddlewareHandlerResponse(r *ghttp.Request) { r.Middleware.Next() // There's custom buffer content, it then exits current handler. if r.Response.BufferLength() > 0 { return } var ( msg string err = r.GetError() res = r.GetHandlerResponse() code = gerror.Code(err) ) if err != nil { if code == gcode.CodeNil { code = gcode.CodeInternalError } msg = err.Error() } else { if r.Response.Status > 0 && r.Response.Status != http.StatusOK { msg = http.StatusText(r.Response.Status) switch r.Response.Status { case http.StatusNotFound: code = gcode.CodeNotFound case http.StatusForbidden: code = gcode.CodeNotAuthorized default: code = gcode.CodeUnknown } // It creates error as it can be retrieved by other middlewares. err = gerror.NewCode(code, msg) r.SetError(err) } else { code = gcode.CodeOK } } r.Response.WriteJson(model.DefaultResponse{ Code: code.Code(), Message: msg, Data: res, }) }