效果展示:
思路:
1、中间件
2、路由加上中间件
3、中间件里获取相关操作、ip、请求参数(转json格式入库),请求类型
4、利用模型进行数据写入
5、数据表设计
示例代码:
1、在所属模块中间件目录middleware下创建OperationLog.php中间件,并编写如下代码
<?php
declare (strict_types=1);
namespace app\union\middleware;
use app\union\model\Adminlist;
use app\union\model\AdminLog;
use think\facade\Cookie;
class OperationLog
{
public function handle($request, \Closure $next)
{
$admin_id = Cookie::get('admin_id');
$method = $request->method();
$path= $request->url(true);
$ip = $request->ip();
$input = $request->param();
if(!$request->isGet()){
self::writeLog($admin_id,$input,$path,$method,$ip);
}
return $next($request);
}
public function writeLog($admin_id,$input,$path,$method,$ip){
$admin = Adminlist::where('id',$admin_id)->find();
if($admin) {
$admin_id = $admin['id'];
$admin_name = $admin['admin_name'];
}else{
return returnJson('500','非法操作');
}
$log = new AdminLog;
$log->admin_id = $admin_id;
$log->admin_name = $admin_name;
$log->path = $path;
$log->method = $method;
$log->ip = $ip;
$log->content = json_encode($input, JSON_UNESCAPED_UNICODE);
$log->created_at = time();
$log->save();
}
}
?>
2、模型代码
<?php
namespace app\union\model;
use think\facade\Cookie;
use think\Model;
class Defendlist extends Model
{
protected $pk = 'id';
protected $name = 'sys_admin_log';
}
?>
3、使用路由中间件:在路由文件下加入如下代码
<?php
->middleware([\app\union\middleware\OperationLog::class])
?>
4、附:数据表设计
CREATE TABLE `tp_sys_admin_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`admin_name` varchar(255) DEFAULT NULL COMMENT '账号',
`created_at` int(12) DEFAULT NULL COMMENT '操作时间',
`ip` varchar(200) CHARACTER SET utf8 DEFAULT NULL COMMENT 'ip',
`content` text COMMENT '日志',
`admin_id` int(11) DEFAULT NULL COMMENT '账号id',
`path` varchar(255) DEFAULT NULL COMMENT '操作路由',
`method` varchar(255) DEFAULT NULL COMMENT '操作方法',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='管理员操作日志表';