123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package middleware
- import (
- "context"
- "github.com/gogf/gf/v2/os/gctx"
- "jyseo/internal/model"
- "jyseo/internal/service"
- "log"
- "sync"
- "jyseo/utility"
- "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))
- utility.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))
- utility.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,
- })
- }
- // SetSeoRefer seo来源标记
- func (s *sMiddleware) SetSeoRefer(r *ghttp.Request) {
- val := r.Cookie.Get("SESSIONID")
- log.Println(val.String(), "-------- log session id -------")
- if !val.IsNil() {
- sessionId := val.String()
- if sessionId != "" {
- val = r.Cookie.Get("SeoRefer")
- g.Log().Info(gctx.New(), val.String(), "------sessionId------", sessionId)
- if val.IsNil() {
- r.Cookie.Set("SeoRefer", r.Referer())
- }
- }
- }
- r.Middleware.Next()
- }
|