Files
tp/app/admin/controller/OperationLog/OperationLogger.php
T
2026-03-09 23:00:20 +08:00

100 lines
3.1 KiB
PHP

<?php
namespace app\admin\controller\OperationLog;
use think\facade\Request;
use app\model\System\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'] ?? '';
$tid = $userInfo['tid'] ?? ($userInfo['tid'] ?? 0);
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,
'tid' => $tid,
'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;
}
}