详解Laravel中间件如何统计用户在线时长

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了laravel中间件怎么实现统计用户在线时长 ,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。

详解Laravel中间件如何统计用户在线时长

Laravel — 了解用户上次在线的时间以及总计在线时长

此处以统计后台用户(admin_users)的在线时长为例;前台用户的话,只是对应的表不一样(对应users)。

准备数据库

此处需要添加两个字段,分别是 上次在线时间 和 总计在线时长(秒为单位):

<?php use IlluminateDatabaseMigrationsMigration; use IlluminateDatabaseSchemaBlueprint; use IlluminateSupportFacadesSchema;  class AddSpentToAdminUsersTable extends Migration {     /**      * Run the migrations.      *      * @return void      */     public function up()     {         Schema::table(&#39;admin_users&#39;, function (Blueprint $table) {             $table->unsignedInteger('spent')-&gt;default('0')-&gt;comment('使用时长')-&gt;after('id');             $table-&gt;timestamp('onlined_at')-&gt;nullable()-&gt;comment('最后访问时间')-&gt;after('updated_at');         });     }      /**      * Reverse the migrations.      *      * @return void      */     public function down()     {         Schema::table('admin_users', function (Blueprint $table) {             //             $table-&gt;dropColumn(['spent', 'onlined_at']);         });     } }

创建中间件

<?php namespace ApphttpMiddleware;  use CarbonCarbon; use Closure; use DcatAdminAdmin; use IlluminateSupportFacadesCache;  class CountAdminUserOnlineTime {     public function handle($request, Closure $next)     {         $user = Admin::user(); // 获取当前认证用户         //dd($user);         if ($user) {             $seenKey = &#39;auser-last-seen-&#39;; //缓存标识             $lastSeenAt = Cache::get($seenKey . $user->id); // 获取上次访问时间戳             $now = Carbon::now();              if ($lastSeenAt != null) {                 $duration = $now-&gt;diffInSeconds($lastSeenAt); // 计算在线时长(秒数)                 $user-&gt;increment('spent', $duration, ['updated_at' =&gt; $user-&gt;updated_at, 'onlined_at' =&gt; $now]); //updated_at 维持原值             }              Cache::put($seenKey . $user-&gt;id, $now, Carbon::now()-&gt;addMinutes(1)); // 保存当前访问时间戳(并设置缓存过期时间为一分钟)         }          return $next($request);     } }

此处没有用使用 DB facade 来避免更新用户表的{更新时间}字段,而用 increment 函数的第二个参数来维持 updated_at 值不变。

应用中间件

在 appHttpKernel.php 中添加一个 $routeMiddleware

protected $routeMiddleware = [         //其它         'admin.spent' =&gt; AppHttpMiddlewareCountAdminUserOnlineTime::class,         //其它     ];

如果你用的是 dcat-admin 后台框架,可以在 config/admin.php  的 route 配置里直接附加 middleware:

'middleware' =&gt; ['web', 'admin'], // 默认值: 'middleware' =&gt; ['web', 'admin', 'admin.spent'], //添加在线时长中间件

其它情况: 在路由定义里添加:

Route::middleware([/* 其它中间件*/ , 'admin.spent'])-&gt;group( function () {     //... 需要统计的路由 });

dcat-admin 在概览页面展示用户时长:

//新建一个 AdminUser 模型继承默认的 Administrator <?php namespace AppModels;  use DcatAdminModelsAdministrator;  class AdminUser extends Administrator {  }  //在线时间表格 use CarbonCarbon; use DcatAdminWidgetsCallout; use DcatAdminWidgetsTab; use DcatAdminWidgetsTable; ...  public static function tab()     {          $data = AdminUser::query()             ->orderBy('onlined_at', 'DESC')             -&gt;get(['name', 'onlined_at', 'spent'])             -&gt;toArray();         foreach ($data as &amp;$d) {             if (!$d['spent']) {                 $d['spent'] = '-';             } else {                 $d['spent'] = formatTime($d['spent']);             }             if (Carbon::parse($d['onlined_at'])-&gt;diffInMinutes()  ' . $d['name'];              } else {                 $d['name'] = '<i></i> ' . $d['name'];              }          }          $titles = ['管理员', '最后在线', '总在线时长'];          return Tab::make()             -&gt;padding(0)             -&gt;add('业务信息',                 Callout::make('后台用户(最近登录)')-&gt;success() . Table::make($titles, $data)             );     }  //公共函数库增加 formatTime /**   * 将给定秒数转换为以“x天x时x分钟”形式   * e.g. 123456 =&gt; 1天10时17分钟   */  function  formatTime($seconds)  {   $days  =  floor($seconds  /  86400);   $hours  =  floor(($seconds  %  86400)  /  3600);   $minutes  =  floor(($seconds  %  3600)  /  60);   $result  =  "";   if  ($days  &gt;  0)  {   $result  .=  "{$days}天";   }   if  ($hours  &gt;  0)  {   $result  .=  "{$hours}时";   }   if  ($minutes  &gt;  0)  {   $result  .=  "{$minutes}分钟";   }   return  $result;  }

统计结果示例

  详解Laravel中间件如何统计用户在线时长              

推荐学习:《laravel视频教程》                            

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享