詳解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 分享