Laravelミドルウェアがユーザーのオンライン時間をカウントする方法の詳細な説明

藏色散人
リリース: 2023-03-31 14:56:17
転載
1084 人が閲覧しました

この記事は、Laravel に関する関連知識を提供します。主に、Laravel ミドルウェアがユーザーのオンライン時間の統計を実装する方法を紹介します。興味のある友人は以下を参照してください。皆さんのお役に立てれば幸いです。

Laravelミドルウェアがユーザーのオンライン時間をカウントする方法の詳細な説明

Laravel — ユーザーが最後にオンラインにいた時間と合計オンライン時間を把握するには

ここで、ユーザーのオンライン ステータスをカウントします。バックグラウンド ユーザー (admin_users) 期間を例に挙げます。フロントエンド ユーザーの場合は、対応するテーブル (ユーザーに対応する) のみが異なります。

データベースの準備

ここで 2 つのフィールド、つまり最後のオンライン時間と合計オンライン時間 (秒単位) を追加する必要があります:

<?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;]);
        });
    }
}
ログイン後にコピー

ミドルウェアの作成

<?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);
    }
}
ログイン後にコピー

ユーザー テーブルの {update time} フィールドの更新を避けるために DB ファサードを使用する必要はありませんが、維持するにはインクリメント関数の 2 番目のパラメーターを使用します。 updated_at 値を変更します。

アプリケーションミドルウェア

\app\Http\Kernel.phpに$routeMiddlewareを追加します

protected $routeMiddleware = [
        //其它
        &#39;admin.spent&#39; => \App\Http\Middleware\CountAdminUserOnlineTime::class,
        //其它
    ];
ログイン後にコピー

バックグラウンドでdcat-adminを使用している場合フレームワークでは、config/admin.php のルート設定にミドルウェアを直接追加できます:

&#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 ビデオチュートリアル 」 ##

以上がLaravelミドルウェアがユーザーのオンライン時間をカウントする方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート