Maison  >  Article  >  cadre php  >  Explication détaillée de la façon dont le middleware Laravel compte le temps de connexion des utilisateurs

Explication détaillée de la façon dont le middleware Laravel compte le temps de connexion des utilisateurs

藏色散人
藏色散人avant
2023-03-31 14:56:171079parcourir

Cet article vous apporte des connaissances pertinentes sur Laravel. Il présente principalement comment le middleware Laravel peut implémenter des statistiques sur le temps de connexion des utilisateurs. J'espère que cela sera utile à tout le monde.

Explication détaillée de la façon dont le middleware Laravel compte le temps de connexion des utilisateurs

Laravel — Comprenez la dernière fois que l'utilisateur était en ligne et le temps total en ligne

Voici un exemple de comptage du temps en ligne des utilisateurs back-end (admin_users, le seul) ; le tableau correspondant est différent (correspondant aux utilisateurs) .

Préparez la base de données

Vous devez ajouter ici deux champs, à savoir la dernière heure de connexion et la durée totale de connexion (en secondes) :

<?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;]);
        });
    }
}

Créer un 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);
    }
}

Il est inutile d'utiliser la façade DB ici Pour éviter de mettre à jour le champ {heure de mise à jour} de la table utilisateur, utilisez le deuxième paramètre de la fonction d'incrémentation pour conserver la valeur mise à jour_at inchangée.

Middleware d'application

Ajoutez un $routeMiddleware dans appHttpKernel.php

protected $routeMiddleware = [
        //其它
        &#39;admin.spent&#39; => \App\Http\Middleware\CountAdminUserOnlineTime::class,
        //其它
    ];

Si vous utilisez le framework d'arrière-plan dcat-admin, vous pouvez directement attacher un middleware:

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

dans la configuration de la route de config/admin.php Autre situations : Ajoutez :

Route::middleware([/* 其它中间件*/ , &#39;admin.spent&#39;])->group(
function () {
    //... 需要统计的路由
});

dcat-admin à la page de présentation pour afficher la durée de l'utilisateur :

//新建一个 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;

}

Exemple de résultats statistiques

                                                                                                           Explication détaillée de la façon dont le middleware Laravel compte le temps de connexion des utilisateurs

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer