91 lines
2.3 KiB
PHP
91 lines
2.3 KiB
PHP
![]() |
<?php
|
||
|
|
||
|
namespace Modules\User\Models;
|
||
|
|
||
|
use Catch\CatchAdmin;
|
||
|
use Catch\Traits\DB\BaseOperate;
|
||
|
use Catch\Traits\DB\ScopeTrait;
|
||
|
use Catch\Traits\DB\Trans;
|
||
|
use Illuminate\Contracts\Http\Kernel;
|
||
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||
|
use Illuminate\Database\Eloquent\Model;
|
||
|
use Illuminate\Http\Request;
|
||
|
use Illuminate\Support\Facades\Auth;
|
||
|
use Illuminate\Support\Facades\Route;
|
||
|
use Symfony\Component\HttpFoundation\Response;
|
||
|
|
||
|
class LogOperate extends Model
|
||
|
{
|
||
|
use BaseOperate, Trans, ScopeTrait;
|
||
|
|
||
|
protected $table = 'log_operate';
|
||
|
|
||
|
protected $fillable = [
|
||
|
'id',
|
||
|
'module',
|
||
|
'action',
|
||
|
'params',
|
||
|
'ip',
|
||
|
'http_method',
|
||
|
'http_code',
|
||
|
'start_at',
|
||
|
'time_taken',
|
||
|
'creator_id',
|
||
|
'created_at',
|
||
|
];
|
||
|
|
||
|
/**
|
||
|
* @param Request $request
|
||
|
* @param Response $response
|
||
|
* @return void
|
||
|
*/
|
||
|
public function log(Request $request, Response $response): void
|
||
|
{
|
||
|
$user = Auth::guard(getGuardName())->user();
|
||
|
|
||
|
$userModel = getAuthUserModel();
|
||
|
|
||
|
if (! $user instanceof $userModel) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
[$module, $controller, $action] = CatchAdmin::parseFromRouteAction();
|
||
|
|
||
|
$requestStartAt = app(Kernel::class)->requestStartedAt()->getPreciseTimestamp(3);
|
||
|
|
||
|
$params = $request->all();
|
||
|
// 如果参数过长则不记录
|
||
|
if (!empty($params)) {
|
||
|
if (strlen(\json_encode($params, JSON_UNESCAPED_UNICODE)) > 5000) {
|
||
|
$params = [];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$timeTaken = intval(microtime(true) * 1000 - $requestStartAt);
|
||
|
|
||
|
$this->storeBy([
|
||
|
'module' => $module,
|
||
|
'action' => $controller . '@' . $action,
|
||
|
'creator_id' => $user->id,
|
||
|
'http_method' => $request->method(),
|
||
|
'http_code' => $response->getStatusCode(),
|
||
|
'start_at' => $requestStartAt,
|
||
|
'time_taken' => $timeTaken,
|
||
|
'ip' => $request->ip(),
|
||
|
'params' => \json_encode($params, JSON_UNESCAPED_UNICODE),
|
||
|
'created_at' => time()
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @return Attribute
|
||
|
*/
|
||
|
protected function timeTaken(): Attribute
|
||
|
{
|
||
|
return Attribute::make(
|
||
|
get: fn ($value) => $value > 1000 ? intval($value/1000) . 's' : $value . 'ms',
|
||
|
);
|
||
|
}
|
||
|
}
|