LogOperate.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. <?php
  2. namespace Modules\User\Models;
  3. use Catch\CatchAdmin;
  4. use Catch\Traits\DB\BaseOperate;
  5. use Catch\Traits\DB\ScopeTrait;
  6. use Catch\Traits\DB\Trans;
  7. use Illuminate\Contracts\Http\Kernel;
  8. use Illuminate\Database\Eloquent\Casts\Attribute;
  9. use Illuminate\Database\Eloquent\Model;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Auth;
  12. use Symfony\Component\HttpFoundation\Response;
  13. class LogOperate extends Model
  14. {
  15. use BaseOperate, Trans, ScopeTrait;
  16. protected $table = 'log_operate';
  17. protected $fillable = [
  18. 'id',
  19. 'module',
  20. 'action',
  21. 'params',
  22. 'ip',
  23. 'http_method',
  24. 'http_code',
  25. 'start_at',
  26. 'time_taken',
  27. 'creator_id',
  28. 'created_at',
  29. ];
  30. /**
  31. * @param Request $request
  32. * @param Response $response
  33. * @return void
  34. */
  35. public function log(Request $request, Response $response): void
  36. {
  37. $user = Auth::guard(getGuardName())->user();
  38. $userModel = getAuthUserModel();
  39. if (! $user instanceof $userModel) {
  40. return;
  41. }
  42. [$module, $controller, $action] = CatchAdmin::parseFromRouteAction();
  43. $requestStartAt = app(Kernel::class)->requestStartedAt()->getPreciseTimestamp(3);
  44. $params = $request->all();
  45. // 如果参数过长则不记录
  46. if (!empty($params)) {
  47. if (strlen(\json_encode($params, JSON_UNESCAPED_UNICODE)) > 5000) {
  48. $params = [];
  49. }
  50. }
  51. $timeTaken = intval(microtime(true) * 1000 - $requestStartAt);
  52. $this->storeBy([
  53. 'module' => $module,
  54. 'action' => $controller . '@' . $action,
  55. 'creator_id' => $user->id,
  56. 'http_method' => $request->method(),
  57. 'http_code' => $response->getStatusCode(),
  58. 'start_at' => intval($requestStartAt/1000),
  59. 'time_taken' => $timeTaken,
  60. 'ip' => $request->ip(),
  61. 'params' => \json_encode($params, JSON_UNESCAPED_UNICODE),
  62. 'created_at' => time()
  63. ]);
  64. }
  65. /**
  66. *
  67. * @return Attribute
  68. */
  69. protected function timeTaken(): Attribute
  70. {
  71. return Attribute::make(
  72. get: fn ($value) => $value > 1000 ? intval($value/1000) . 's' : $value . 'ms',
  73. );
  74. }
  75. }