package middleware import ( "context" "net/http" "strconv" "strings" "time" db "management/internal/db/sqlc" "github.com/zhang2092/browser" ) func (m *middleware) Audit(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { start := time.Now() defer func(res http.ResponseWriter, req *http.Request) { // 记录审计日志 go m.writeLog(req, start) }(w, r) next.ServeHTTP(w, r) } return http.HandlerFunc(fn) } func (m *middleware) writeLog(req *http.Request, start time.Time) { end := time.Now() duration := end.Sub(start) var params string method := req.Method if method == "GET" { params = req.URL.Query().Encode() } else if method == "POST" { contentType := req.Header.Get("Content-Type") if strings.Contains(contentType, "application/json") { body := make([]byte, req.ContentLength) req.Body.Read(body) params = string(body) } else if strings.Contains(contentType, "application/x-www-form-urlencoded") { params = req.Form.Encode() } } ctx := req.Context() au := m.AuthUser(ctx) arg := &db.CreateSysAuditLogParams{ CreatedAt: time.Now(), Email: au.Email, Username: au.Username, UserUuid: au.Uuid, StartAt: start, EndAt: end, Duration: strconv.FormatInt(duration.Milliseconds(), 10), Url: req.URL.RequestURI(), Method: method, Parameters: params, RefererUrl: req.Header.Get("Referer"), Ip: req.RemoteAddr, Remark: "", } br, err := browser.NewBrowser(req.Header.Get("User-Agent")) if err == nil { arg.Os = br.Platform().Name() arg.Browser = br.Name() } c, cancel := context.WithTimeout(context.Background(), time.Second*3) defer cancel() _ = m.biz.AuditBiz().Create(c, arg) }