tp/app/admin/controller/OperationLog/OperationLogHelper.php
2026-01-26 09:29:36 +08:00

97 lines
3.0 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\admin\controller\OperationLog;
use app\model\OperationLog;
use think\facade\Request;
use think\facade\Session;
/**
* 操作日志记录助手类
*/
class OperationLogHelper
{
/**
* 记录操作日志
* @param string $module 操作模块
* @param string $action 操作动作
* @param array $requestData 请求数据
* @param array $responseData 响应数据
* @param int $status 操作状态1-成功0-失败
* @param string $errorMessage 错误信息
* @param float $executionTime 执行时间(秒)
* @return bool
*/
public static function log(
string $module,
string $action,
array $requestData = [],
array $responseData = [],
int $status = 1,
string $errorMessage = '',
float $executionTime = 0.0
): bool {
try {
// 获取用户信息
$userInfo = Session::get('user');
$userId = $userInfo['id'] ?? 0;
$userAccount = $userInfo['account'] ?? '';
$userName = $userInfo['name'] ?? '';
// 获取请求信息
$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' => $executionTime,
]);
return true;
} catch (\Exception $e) {
// 记录日志失败不应该影响主流程,只记录错误
error_log('操作日志记录失败: ' . $e->getMessage());
return false;
}
}
/**
* 过滤敏感数据
* @param array $data
* @return array
*/
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;
}
}