我正在使用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
我现在就是这样,我必须始终检查我的login
和logout
函数,但我不知道从哪里开始。
答案 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();
}
并计算时差: