如何在Laravel注销时捕获登录时间?

时间:2015-07-21 10:16:14

标签: php laravel time

我正在使用Laravel 5制作应用程序,我应该有一个模块来保存和更新用户的登录时间。

我是编程的新手,所以我很难理解如何做到这一点。

这适用于呼叫中心座席,他们的转换时间在3pm to 6am之间。例如,他们使用2015-07-21 03:00:00的时间戳登录3pm然后如果他们在4pm退出登录登录时间为1.0,然后他们会在7pm再次登录并在5am of 2015-07-21退出,那将是他们之前的登录时间1.0 + 10.0,因为7pm 2015-07-20 - 5am 2015-07-21。并且应该更新该用户的loginhours。

我该怎么做?所以现在我的数据库中有一个表

logihours
 ->id
 ->user_id
 ->loginhours (double/float)
 ->timestamp (timestamp of last login/logout)
 ->status (if currently logged in or logged out

我现在就是这样,我必须始终检查我的loginlogout函数,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

如果我要解决此问题,我会在数据库中存储一个时间戳,该时间戳记存储在用户上次成功登录时。

然后在注销时,您可以将当前时间戳与存储在数据库中的时间戳进行比较,以计算出他们登录的时间。

警告:另一个潜在问题是同一个用户可能有多个会话(可能是他们在桌面和手机上登录?)。

答案 1 :(得分:1)

像这样创建表

entrance_logs
 ->id
 ->user_id
 ->loged_in_at [default=null]
 ->loged_out_at [default=null]

login_hours
 ->id
 ->user_id
 ->hours [default=0]

当用户登录时插入到entrance_logs并仅定义loged_in_at,当用户注销时获取此user_id的最后一条记录并仅定义loged_out_at。 然后控制器中的某个地方计算小时并更新login_hours,或者在Laravel中创建Command并使用cron进行控制。

例如:

登录操作中的

$EntranceLog = new EntranceLog();
$EntranceLog->user_id = Auth::user()->id;
$EntranceLog->loged_in_at = date('Y-m-d H:i:s');
$EntranceLog->save();
在注销操作中

$EntranceLog = EntranceLog::where('loged_in_at', '>=', date('Y-m-d H:i:s', time()-86400))
                          ->whereNull('loged_out_at')
                          ->where('user_id', '=', Auth::user()->id)
                          ->orderBy('loged_in_at', 'desc')->first();
if($EntranceLog) {
  $EntranceLog->loged_out_at = date('Y-m-d H:i:s');
  $EntranceLog->save();

  $hours = strtotime($EntranceLog->loged_out_at) - strtotime($EntranceLog->loged_in_at);
  $hours/= 3600;
  $hours = (double)$hours;

  $LoginHour = LoginHour::where('user_id', '=', Auth::user()->id)->first();
  if(!$LoginHour) {
    $LoginHour = new LoginHour();
    $LoginHour->user_id = Auth::user()->id;
  }
  $LoginHour->hours = (double)$LoginHour->hours + $hours;
  $LoginHour->save();
}

并计算时差: