java - 根据一张登录登出日志表计算每个用户在线时长,求个思路
阿神
阿神 2017-04-18 10:31:06
0
5
1731

有一张日志表,记录着每个用户的操作日志信息,例如登录或注销,每个操作都有对应的createtime,以及当前的userName

  • 需求如下:

    • 统计每个用户在一天内在线时长(登录到注销这段时间,可能一天登录注销多次)

    • 如果用户电脑直接关机,或者非正常关闭系统,这时日志表不会产生注销日志,所以将用户最后一次的操作日志(可能是增删改查)作为注销时间,进行在线时长的计算

  • 疑问:

    • 我觉得在日志记录的时候需要记录每次会话的sessionId,否则无法进行上面计算?

阿神
阿神

闭关修行中......

全部回覆(5)
Peter_Zhu

不需要記錄sessionid,你想用sessionid來記錄非正常退出最後一次操作時間?
針對同一個使用者登入的上一條資料一定是退出操作
1.正常退出,下邊一條一定是登入
2.普通操作(增刪改查)後非正常關閉,下一次也一定是登入操作

所以一次登入時間長度為本次登入時間--下次登入前一筆記錄的時間

但是如果使用者非正常關閉後沒在登入就需要單獨處理,例如sessionid20分鐘沒操作就過期,就查看最後一筆記錄距離目前是否超過20分鐘,超過就認為已經非正常登出。

黄舟

反正得有使用者標示,去判斷是哪個使用者的行為日誌,

寫日誌的時候再寫上每次登陸登出的時間差到日誌,最後相加?

Ty80

表可以這樣設計

用户id   登录时间  退出时间

登入的時候,session中記錄登入時間,同時把退出時間設定為:登入時間+逾時時間。

用戶活動的時候,根據session中記錄的登入時間,去更新那筆記錄的退出時間為:當前時間+超時時間。

退出的時候,根據session中記錄的登入時間,去更新那筆記錄的退出時間為:當前時間。

巴扎黑

原始表(假設):

record_id    uid    name      opr_type    c_time
1            10     cxl       land        2016-12-26 08:00:00
2            10     cxl       out         2016-12-26 23:00:00

最終產生的表:

用户名    日期(asc)    当天第一次登陆时间     当天最后一次登出时间     登陆时长(结果非准确值)
cxl      2016-12-26    2016-12-26 08:00:00  2016-12-26 15:00:00   3小时10分
cxl      2016-12-27    2016-12-26 08:30:00  2016-12-26 23:00:00   6小时10分

具體流程:

1. 日期分组
2. 当天第一次登陆时间
     2.1 第一种情况:若当天第一条记录操作类型是 登出,那么 当天第一次登陆时间 = 00:00:01
     2.2 第二种情况:若当天第一条记录操作类型是 登陆,那么 当天第一次登陆时间 = c_time
    
3. 当天最后一次登出时间
    3.1 第一种情况:若当天最后一条记录操作类型是 登陆,那么 当天最后一次登出时间 = 23:59:59
    3.2 第二种情况:若当天最后一条记录操作类型是 登出,那么 当天最后一次登出时间 = c_time
4. 登陆时长 
    4.1 当天最后一次登出时间 - 当天第一次登陆时间

提供下思路哈,具體實現起來個人覺得很不容易(邏輯處理需用到php,分頁的時候也較麻煩,得按照日期進行分頁顯示,而不能像limit 1 , 10 這樣按取出的記錄數進行分頁,單sql無法得出最終表結構),所以,就只能到這裡了....

洪涛

借問題請教一下大家哈? 登陸可以記錄,登出怎麼記錄呢? 用戶不一定真的就點登出按鈕啊。如果是web的話,使用者可以直接關閉瀏覽器就不關了,怎麼知道什麼時候登出的呢? session嗎?

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!