要求: 使用sanctum方式的token验证进行获取用户信息的方式
接口注释可通过接口注释https://www.jianshu.com/p/db6f3ae2cbf3?v=1689129215067进行批量获取
1、在/app/Http/Middleware下创建OperationLog.php文件
在App\Http\Kernel文件下的$middleware进行注册
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\OperationLog::class,
];
2、日志类代码
<?php
namespace App\Http\Middleware;
use App\Model\Permission;
use Closure;
use App\Http\Controllers\Controller;
class OperationLog
{
/**
* 不记录参数的接口
* @desc 参数太长会导致错误
*/
protected $unParams = [
'layout/addLayout',
'layout/updLayout'
];
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$user = auth('sanctum')->user();//查询用户信息
if ($user) {
$user_id = $user->id;
} else {
//登录时没有token,通过手机号进行获取用户信息
$adminService = app(\App\Services\Admin\AdminService::class);
$admin = $adminService->existByPhone($request->getUser());
if ($admin) {
$user_id = $admin->id;
} else {
//没有用户信息不记录
return $next($request);
}
}
$method = strtolower($request->method()); //操作的方法
if ($method != 'get') { //get查询方法不记录
$path = $request->path(); //操作的路由
if (! in_array($path, $this->unParams)) {//过滤不验证的路由
$input = $request->input('data');//操作的参数
} else {
$input = '';
}
$ip = $request->ip(); //操作者的IP
self::writeLog($user_id,$input,$path,$method,$ip);
}
return $next($request);
}
/*
* 写入日志
*/
public function writeLog($user_id,$input,$path,$method,$ip)
{
$log = new \App\Model\OperationLog();
$log->setAttribute('handler_id', $user_id);
$log->setAttribute('input', json_encode(1));
$log->setAttribute('path', $path);
$log->setAttribute('method', $method);
$log->setAttribute('ip', $ip);
$log->setAttribute('name', Permission::where('route', $path)->pluck('name')->toArray()[0]??'');//关联权限表获取操作名称
$log->setAttribute('input', json_encode($input, JSON_UNESCAPED_UNICODE));
$log->save();
}
}
3、表字段
CREATE TABLE `operation_log` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`handler_id` int(11) DEFAULT '0' COMMENT '操作人id(添加人)',
`path` varchar(255) DEFAULT NULL COMMENT '请求地址(路由)',
`method` varchar(255) DEFAULT NULL COMMENT '请求方式',
`ip` varchar(255) DEFAULT NULL COMMENT '用户ip',
`name` varchar(255) DEFAULT NULL COMMENT '接口名称',
`input` text COMMENT '请求参数',
`created_at` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` timestamp NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=360 DEFAULT CHARSET=utf8 COMMENT='操作日志';
4、日志model
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class OperationLog extends Model
{
// 操作日志表
protected $table = 'operation_log';//绑定表
protected $primaryKey = 'Id';//绑定主键id
public $timestamps = true;
const CREATED_AT = 'created_at';//更改添加时间默认字段
const UPDATED_AT = 'updated_at';//更改修改时间默认字段
}
5、 在App\Http\Kernel文件下的$middleware注册
![image.png](https://upload-images.jianshu.io/upload_images/20887739-58446d70cf7532eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)