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

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

  • 需求如下:

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

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

  • 疑问:

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

阿神
阿神

闭关修行中......

répondre à tous(5)
Peter_Zhu

Il n'est pas nécessaire d'enregistrer l'ID de session. Voulez-vous utiliser l'ID de session pour enregistrer l'heure de la dernière opération de sortie anormale ?
La dernière donnée connectée par le même utilisateur doit être une opération de déconnexion
1. Déconnexion normale, la donnée suivante doit être une connexion
2. Fermeture anormale après une opération normale (ajouter, supprimer). , modifier, vérifier), la prochaine fois doit être la même C'est une opération de connexion

Donc, la durée d'une connexion est l'heure de connexion actuelle - l'heure de l'enregistrement précédent avant la prochaine connexion

Cependant, si l'utilisateur ne se connecte pas après un arrêt anormal, il doit être traité séparément. Par exemple, si l'ID de session expire sans opération pendant 20 minutes, vérifiez si le dernier enregistrement remonte à plus de 20 minutes. Il y a plus de 20 minutes, cela sera considéré comme une sortie anormale.

黄舟

Quoi qu'il en soit, il doit y avoir une identification de l'utilisateur pour déterminer de quel journal de comportement de l'utilisateur il s'agit,

Lors de la rédaction du journal, écrivez le décalage horaire entre chaque connexion et déconnexion dans le journal et ajoutez-le à la fin ?

Ty80

La table peut être conçue comme ça

用户id   登录时间  退出时间

Lors de la connexion, l'heure de connexion est enregistrée dans la session et l'heure de sortie est définie sur : heure de connexion + heure d'expiration.

Lorsque l'utilisateur est actif, en fonction de l'heure de connexion enregistrée dans la session, l'heure de sortie de cet enregistrement est mise à jour : heure actuelle + heure d'expiration.

Lors de la sortie, en fonction de l'heure de connexion enregistrée dans la session, l'heure de sortie de cet enregistrement est mise à jour à : l'heure actuelle.

巴扎黑

Tableau original (supposé) :

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

Tableau final généré :

用户名    日期(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分

Processus détaillé :

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

Donnez-moi quelques idées. Personnellement, je pense que ce n'est pas facile à mettre en œuvre (le traitement logique nécessite PHP, et la pagination est également gênante. Il faut l'afficher en pagination en fonction de la date, mais pas en fonction du nombre d'enregistrements pris. comme limit 1 , 10 Pour la pagination, un seul SQL ne peut pas obtenir la structure de la table finale), nous ne pouvons donc aller qu'ici....

洪涛

Puis-je poser une question à tout le monde ? La connexion peut être enregistrée, mais comment enregistrer la déconnexion ? L'utilisateur ne peut pas réellement cliquer sur le bouton de déconnexion. S'il s'agit du Web, l'utilisateur peut simplement fermer le navigateur et le laisser tranquille. Comment savoir quand vous vous êtes déconnecté ? session?

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!