operation.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package middleware
  2. import (
  3. "bytes"
  4. "gin-vue-admin/global"
  5. "gin-vue-admin/model"
  6. "gin-vue-admin/model/request"
  7. "gin-vue-admin/service"
  8. "github.com/gin-gonic/gin"
  9. "go.uber.org/zap"
  10. "io/ioutil"
  11. "net/http"
  12. "strconv"
  13. "time"
  14. )
  15. func OperationRecord() gin.HandlerFunc {
  16. return func(c *gin.Context) {
  17. var body []byte
  18. var userId int
  19. if c.Request.Method != http.MethodGet {
  20. var err error
  21. body, err = ioutil.ReadAll(c.Request.Body)
  22. if err != nil {
  23. global.GVA_LOG.Error("read body from request error:", zap.Any("err", err))
  24. } else {
  25. c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(body))
  26. }
  27. }
  28. if claims, ok := c.Get("claims"); ok {
  29. waitUse := claims.(*request.CustomClaims)
  30. userId = int(waitUse.ID)
  31. }else {
  32. id, err := strconv.Atoi(c.Request.Header.Get("x-user-id"))
  33. if err != nil {
  34. userId = 0
  35. }
  36. userId = id
  37. }
  38. record := model.SysOperationRecord{
  39. Ip: c.ClientIP(),
  40. Method: c.Request.Method,
  41. Path: c.Request.URL.Path,
  42. Agent: c.Request.UserAgent(),
  43. Body: string(body),
  44. UserID: userId,
  45. }
  46. writer := responseBodyWriter{
  47. ResponseWriter: c.Writer,
  48. body: &bytes.Buffer{},
  49. }
  50. c.Writer = writer
  51. now := time.Now()
  52. c.Next()
  53. latency := time.Now().Sub(now)
  54. record.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
  55. record.Status = c.Writer.Status()
  56. record.Latency = latency
  57. record.Resp = writer.body.String()
  58. if err := service.CreateSysOperationRecord(record); err != nil {
  59. global.GVA_LOG.Error("create operation record error:", zap.Any("err", err))
  60. }
  61. }
  62. }
  63. type responseBodyWriter struct {
  64. gin.ResponseWriter
  65. body *bytes.Buffer
  66. }
  67. func (r responseBodyWriter) Write(b []byte) (int, error) {
  68. r.body.Write(b)
  69. return r.ResponseWriter.Write(b)
  70. }