zoukankan      html  css  js  c++  java
  • 利用 Laravel 中间件给后台加个操作日志

    项目后台角色及人员变多,需要加下日志,方便查询,不妨利用中间件实现下。

    方案:

    • 中间件判断是否需要记录,写入队列
    • 队列写入数据库

    表设计

    CREATE TABLE `admin_log` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `user_id` int(11) NOT NULL,
      `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `method` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
      `ip` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `input` text COLLATE utf8mb4_unicode_ci NOT NULL,
      `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC;
    

    新建中间件 AdminLogMiddleware,在后台路由中加入此中间件即可,

    <?php
    
    namespace AppHttpMiddleware;
    
    
    use AppJobsOperationLogJob;
    use Closure;
    use Auth;
    
    class AdminLogMiddleware
    {
        /**
         * 处理传入的参数
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @param  string  $role
         * @return mixed
         */
        public function handle($request, Closure $next, $role)
        {
            // 剔除GET,OPTIONS请求
            if (!in_array($method = $request->getMethod(), ['GET', 'OPTIONS'])) {
                $data = [
                    'user_id' => Auth::guard('admin')->id(),
                    'path' => $request->getPathInfo(),
                    'method' => $method,
                    'ip' => $request->getClientIp(),
                    'input' => json_encode($request->all(), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE),
                ];
    
                // 异步写入,提高操作流畅性
                $job = (new OperationLogJob($data));
                dispatch($job);
            }
    
            return $next($request);
        }
    
    }
    
    <?php
    
    namespace AppJobs;
    
    use AppModelsAdminLog;
    use IlluminateBusQueueable;
    use IlluminateContractsQueueShouldQueue;
    use IlluminateFoundationBusDispatchable;
    use IlluminateQueueInteractsWithQueue;
    use IlluminateQueueSerializesModels;
    
    class OperationLogJob implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        // 任务可以尝试的最大次数。
        public $tries = 2;
    
        // 任务可以执行的最大秒数 (超时时间)。
        public $timeout = 120;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($data)
        {
            //
            $this->queue = 'adminLog';
            $this->data = $data;
        }
    
        private $data;
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            //
            AdminLog::create($this->data);
        }
    }
    

    执行队列:

    php artisan queue:work --queue=adminLog
    

    当然,也可以不写入数据库,写在 log 文件里,这里就不展开了。

    另外,为了方便,也可以给后台统一加入 AdminLogMiddleware 中间件,把不需要做记录的路由加入配置文件,在中间件加入判断,省去在路由配置去区分是否需要记录。

  • 相关阅读:
    Java图片裁剪
    jvm参数
    Druid数据源监控配置
    执行jar包或执行其中的某个类
    十进制和二进制之间的相互转化
    Java位运算
    获取网络资源保存本地
    前端PHP入门-010-内部函数
    前端PHP入门-011-可变函数
    前端PHP入门-009-匿名函数
  • 原文地址:https://www.cnblogs.com/caibaotimes/p/14027868.html
Copyright © 2011-2022 走看看