이 기사는 Laravel 미들웨어가 사용자 온라인 시간 통계를 구현하는 방법을 주로 소개하는 관련 지식을 제공합니다. 관심 있는 친구는 아래를 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.
Laravel — 사용자가 마지막으로 온라인에 있었던 시간과 총 온라인 시간을 이해하세요
다음은 프런트엔드 사용자(admin_users)의 온라인 시간을 계산하는 예입니다. 해당 테이블이 다릅니다(사용자에 해당).
데이터베이스 준비
여기에 마지막 온라인 시간과 총 온라인 시간(초)이라는 두 개의 필드를 추가해야 합니다.
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; 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']); }); } }
Create middleware
<?php namespace App\Http\Middleware; use Carbon\Carbon; use Closure; use Dcat\Admin\Admin; use Illuminate\Support\Facades\Cache; 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 외관을 사용하는 것은 쓸모가 없습니다. 여기서 사용자 테이블의 {업데이트 시간} 필드를 업데이트하지 않으려면 증분 함수의 두 번째 매개변수를 사용하여 update_at 값을 변경하지 않고 유지하세요.
Application middleware
appHttpKernel.php에 $routeMiddleware를 추가하세요
protected $routeMiddleware = [ //其它 'admin.spent' => \App\Http\Middleware\CountAdminUserOnlineTime::class, //其它 ];
dcat-admin 백그라운드 프레임워크를 사용하는 경우 config/admin.php의 경로 구성에 middleware:
'middleware' => ['web', 'admin'], // 默认值: 'middleware' => ['web', 'admin', 'admin.spent'], //添加在线时长中间件
를 직접 연결할 수 있습니다. 기타 상황: 사용자 기간을 표시하려면 개요 페이지에
Route::middleware([/* 其它中间件*/ , 'admin.spent'])->group( function () { //... 需要统计的路由 });
dcat-admin을 추가하세요.
//新建一个 AdminUser 模型继承默认的 Administrator <?php namespace App\Models; use Dcat\Admin\Models\Administrator; class AdminUser extends Administrator { } //在线时间表格 use Carbon\Carbon; use Dcat\Admin\Widgets\Callout; use Dcat\Admin\Widgets\Tab; use Dcat\Admin\Widgets\Table; ... 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() <= 5) { $d['name'] = '<i class="fa fa-circle" style="font-size: 13px;color: #4e9876"></i> ' . $d['name']; } else { $d['name'] = '<i class="fa fa-circle" style="font-size: 13px;color: #7c858e "></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 미들웨어가 사용자 온라인 시간을 계산하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!