Rumah >rangka kerja php >Laravel >Penjelasan terperinci tentang cara perisian tengah Laravel mengira masa dalam talian pengguna

Penjelasan terperinci tentang cara perisian tengah Laravel mengira masa dalam talian pengguna

藏色散人
藏色散人ke hadapan
2023-03-31 14:56:171133semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang Laravel terutamanya cara perisian tengah Laravel boleh mengira masa dalam talian pengguna yang berminat boleh melihatnya.

Penjelasan terperinci tentang cara perisian tengah Laravel mengira masa dalam talian pengguna

Laravel — Untuk mengetahui kali terakhir pengguna berada dalam talian dan jumlah masa dalam talian

Di sini untuk mengira status dalam talian bagi pengguna latar belakang (pengguna_pengurus) Ambil tempoh sebagai contoh untuk pengguna bahagian hadapan, hanya jadual yang sepadan adalah berbeza (sepadan dengan pengguna).

Sediakan pangkalan data

Dua medan perlu ditambah di sini, iaitu masa dalam talian terakhir dan jumlah masa dalam talian (dalam saat):

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

Buat 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);
    }
}

Tidak perlu menggunakan fasad DB untuk mengelak daripada mengemas kini medan {update time} jadual pengguna, tetapi gunakan parameter kedua bagi fungsi kenaikan. Biarkan nilai updated_at tidak berubah.

Application Middleware

Tambah $routeMiddleware dalam appHttpKernel.php

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

Jika anda menggunakan rangka kerja latar belakang dcat-admin, Anda boleh tambah perisian tengah terus ke konfigurasi laluan 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;], //添加在线时长中间件

Situasi lain: Tambah:

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

dcat-admin untuk memaparkan pengguna pada halaman gambaran keseluruhan Tempoh:

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

}

Contoh keputusan statistik

Penjelasan terperinci tentang cara perisian tengah Laravel mengira masa dalam talian pengguna                                                                                                                                                                                                                                                              🎜>

Atas ialah kandungan terperinci Penjelasan terperinci tentang cara perisian tengah Laravel mengira masa dalam talian pengguna. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam