本篇文章給大家帶來了關于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('admin_users', function (Blueprint $table) { $table->unsignedInteger('spent')->default('0')->comment('使用時長')->after('id'); ????????????$table->timestamp('onlined_at')->nullable()->comment('最后訪問時間')->after('updated_at'); ????????}); ????} ????/** ?????*?Reverse?the?migrations. ?????* ?????*?@return?void ?????*/ ????public?function?down() ????{ ????????Schema::table('admin_users',?function?(Blueprint?$table)?{ ????????????// ????????????$table->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 = 'auser-last-seen-'; //緩存標識 $lastSeenAt = Cache::get($seenKey . $user->id);?//?獲取上次訪問時間戳 ????????????$now?=?Carbon::now(); ????????????if?($lastSeenAt?!=?null)?{ ????????????????$duration?=?$now->diffInSeconds($lastSeenAt);?//?計算在線時長(秒數) ????????????????$user->increment('spent',?$duration,?['updated_at'?=>?$user->updated_at,?'onlined_at'?=>?$now]);?//updated_at?維持原值 ????????????} ????????????Cache::put($seenKey?.?$user->id,?$now,?Carbon::now()->addMinutes(1));?//?保存當前訪問時間戳(并設置緩存過期時間為一分鐘) ????????} ????????return?$next($request); ????} }
此處沒有用使用 DB facade 來避免更新用戶表的{更新時間}字段,而用 increment 函數的第二個參數來維持 updated_at 值不變。
應用中間件
在 appHttpKernel.php 中添加一個 $routeMiddleware
protected?$routeMiddleware?=?[ ????????//其它 ????????'admin.spent'?=>?AppHttpMiddlewareCountAdminUserOnlineTime::class, ????????//其它 ????];
如果你用的是 dcat-admin 后臺框架,可以在 config/admin.php ?的 route 配置里直接附加 middleware:
'middleware'?=>?['web',?'admin'],?//?默認值: 'middleware'?=>?['web',?'admin',?'admin.spent'],?//添加在線時長中間件
其它情況: 在路由定義里添加:
Route::middleware([/*?其它中間件*/?,?'admin.spent'])->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') ????????????->get(['name',?'onlined_at',?'spent']) ????????????->toArray(); ????????foreach?($data?as?&$d)?{ ????????????if?(!$d['spent'])?{ ????????????????$d['spent']?=?'-'; ????????????}?else?{ ????????????????$d['spent']?=?formatTime($d['spent']); ????????????} ????????????if?(Carbon::parse($d['onlined_at'])->diffInMinutes()??'?.?$d['name']; ????????????}?else?{ ????????????????$d['name']?=?'<i></i>?'?.?$d['name']; ????????????} ????????} ????????$titles?=?['管理員',?'最后在線',?'總在線時長']; ????????return?Tab::make() ????????????->padding(0) ????????????->add('業務信息', ????????????????Callout::make('后臺用戶(最近登錄)')->success()?.?Table::make($titles,?$data) ????????????); ????} //公共函數庫增加?formatTime /** ?*?將給定秒數轉換為以“x天x時x分鐘”形式 ?*?e.g.?123456?=>?1天10時17分鐘 ?*/ function??formatTime($seconds) { ?$days??=??floor($seconds??/??86400); ?$hours??=??floor(($seconds??%??86400)??/??3600); ?$minutes??=??floor(($seconds??%??3600)??/??60); ?$result??=??""; ?if??($days??>??0)??{ ?$result??.=??"{$days}天"; ?} ?if??($hours??>??0)??{ ?$result??.=??"{$hours}時"; ?} ?if??($minutes??>??0)??{ ?$result??.=??"{$minutes}分鐘"; ?} ?return??$result; }
統計結果示例
? ? ? ? ? ? ? ??
推薦學習:《laravel視頻教程》?? ? ? ? ? ? ? ? ? ? ? ? ? ?
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END