>  기사  >  PHP 프레임워크  >  Laravel 미들웨어가 사용자 온라인 시간을 계산하는 방법에 대한 자세한 설명

Laravel 미들웨어가 사용자 온라인 시간을 계산하는 방법에 대한 자세한 설명

藏色散人
藏色散人앞으로
2023-03-31 14:56:171023검색

이 기사는 Laravel 미들웨어가 사용자 온라인 시간 통계를 구현하는 방법을 주로 소개하는 관련 지식을 제공합니다. 관심 있는 친구는 아래를 살펴보는 것이 모든 사람에게 도움이 되기를 바랍니다.

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(&#39;admin_users&#39;, function (Blueprint $table) {
            $table->unsignedInteger(&#39;spent&#39;)->default(&#39;0&#39;)->comment(&#39;使用时长&#39;)->after(&#39;id&#39;);
            $table->timestamp(&#39;onlined_at&#39;)->nullable()->comment(&#39;最后访问时间&#39;)->after(&#39;updated_at&#39;);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table(&#39;admin_users&#39;, function (Blueprint $table) {
            //
            $table->dropColumn([&#39;spent&#39;, &#39;onlined_at&#39;]);
        });
    }
}

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 = &#39;auser-last-seen-&#39;; //缓存标识
            $lastSeenAt = Cache::get($seenKey . $user->id); // 获取上次访问时间戳
            $now = Carbon::now();

            if ($lastSeenAt != null) {
                $duration = $now->diffInSeconds($lastSeenAt); // 计算在线时长(秒数)
                $user->increment(&#39;spent&#39;, $duration, [&#39;updated_at&#39; => $user->updated_at, &#39;onlined_at&#39; => $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 = [
        //其它
        &#39;admin.spent&#39; => \App\Http\Middleware\CountAdminUserOnlineTime::class,
        //其它
    ];

dcat-admin 백그라운드 프레임워크를 사용하는 경우 config/admin.php의 경로 구성에 middleware:

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

를 직접 연결할 수 있습니다. 기타 상황: 사용자 기간을 표시하려면 개요 페이지에

Route::middleware([/* 其它中间件*/ , &#39;admin.spent&#39;])->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(&#39;onlined_at&#39;, &#39;DESC&#39;)
            ->get([&#39;name&#39;, &#39;onlined_at&#39;, &#39;spent&#39;])
            ->toArray();
        foreach ($data as &$d) {
            if (!$d[&#39;spent&#39;]) {
                $d[&#39;spent&#39;] = &#39;-&#39;;
            } else {
                $d[&#39;spent&#39;] = formatTime($d[&#39;spent&#39;]);
            }
            if (Carbon::parse($d[&#39;onlined_at&#39;])->diffInMinutes() <= 5) {
                $d[&#39;name&#39;] = &#39;<i class="fa fa-circle" style="font-size: 13px;color: #4e9876"></i>&ensp;&#39; . $d[&#39;name&#39;];

            } else {
                $d[&#39;name&#39;] = &#39;<i class="fa fa-circle" style="font-size: 13px;color: #7c858e
"></i>&ensp;&#39; . $d[&#39;name&#39;];

            }

        }

        $titles = [&#39;管理员&#39;, &#39;最后在线&#39;, &#39;总在线时长&#39;];

        return Tab::make()
            ->padding(0)
            ->add(&#39;业务信息&#39;,
                Callout::make(&#39;后台用户(最近登录)&#39;)->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 미들웨어가 사용자 온라인 시간을 계산하는 방법에 대한 자세한 설명                                                                                                            

위 내용은 Laravel 미들웨어가 사용자 온라인 시간을 계산하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제