98 lines
3.0 KiB
PHP
98 lines
3.0 KiB
PHP
<?php
|
||
|
||
namespace app\admin\controller\OperationLog;
|
||
|
||
use think\facade\Request;
|
||
use app\model\OperationLog;
|
||
use app\service\JwtService;
|
||
|
||
/**
|
||
* 操作日志记录器(JWT版)
|
||
*/
|
||
class OperationLogger
|
||
{
|
||
private static function getUserFromToken(): array
|
||
{
|
||
return JwtService::getUserFromHeader(Request::header('Authorization', ''));
|
||
}
|
||
|
||
public static function record(
|
||
string $module,
|
||
string $action,
|
||
array $requestData = [],
|
||
array $responseData = [],
|
||
int $status = 1,
|
||
string $errorMessage = '',
|
||
array $userInfo = []
|
||
): bool {
|
||
try {
|
||
if (empty($userInfo)) {
|
||
$userInfo = self::getUserFromToken();
|
||
}
|
||
|
||
$userId = $userInfo['id'] ?? 0;
|
||
$userAccount = $userInfo['account'] ?? '';
|
||
$userName = $userInfo['name'] ?? '';
|
||
|
||
if (empty($requestData)) {
|
||
$requestData = Request::param();
|
||
}
|
||
|
||
$method = Request::method();
|
||
$url = Request::url(true);
|
||
$ip = Request::ip();
|
||
$userAgent = Request::header('user-agent', '');
|
||
|
||
$filteredRequestData = self::filterSensitiveData($requestData);
|
||
|
||
OperationLog::create([
|
||
'user_id' => $userId,
|
||
'user_account' => $userAccount,
|
||
'user_name' => $userName,
|
||
'module' => $module,
|
||
'action' => $action,
|
||
'method' => $method,
|
||
'url' => $url,
|
||
'ip' => $ip,
|
||
'user_agent' => $userAgent,
|
||
'request_data' => !empty($filteredRequestData) ? json_encode($filteredRequestData, JSON_UNESCAPED_UNICODE) : null,
|
||
'response_data' => !empty($responseData) ? json_encode($responseData, JSON_UNESCAPED_UNICODE) : null,
|
||
'status' => $status,
|
||
'error_message' => $errorMessage,
|
||
'execution_time' => 0.0,
|
||
]);
|
||
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
error_log('操作日志记录失败: ' . $e->getMessage());
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public static function success(string $module, string $action, array $responseData = [], array $userInfo = []): bool
|
||
{
|
||
return self::record($module, $action, [], $responseData, 1, '', $userInfo);
|
||
}
|
||
|
||
public static function fail(string $module, string $action, string $errorMessage, array $userInfo = []): bool
|
||
{
|
||
return self::record($module, $action, [], [], 0, $errorMessage, $userInfo);
|
||
}
|
||
|
||
private static function filterSensitiveData(array $data): array
|
||
{
|
||
$sensitiveKeys = ['password', 'pwd', 'token', 'api_key', 'secret'];
|
||
|
||
foreach ($data as $key => $value) {
|
||
if (in_array(strtolower($key), $sensitiveKeys)) {
|
||
$data[$key] = '***';
|
||
} elseif (is_array($value)) {
|
||
$data[$key] = self::filterSensitiveData($value);
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
}
|
||
|