LogOperate.php 2.3 KB

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