Maison > cadre php > Laravel > le corps du texte

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

藏色散人
Libérer: 2023-03-31 14:56:17
avant
1059 Les gens l'ont consulté

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;]);
        });
    }
}
Copier après la connexion

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);
    }
}
Copier après la connexion

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,
        //其它
    ];
Copier après la connexion

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;], //添加在线时长中间件
Copier après la connexion

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

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

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;

}
Copier après la connexion

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!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!