需求:
需要在系统中展现,系统中用户的状态。展示用户是否在线、忙碌或者离线。
做法:
1. 使用 webSocket 建立链接,通过实时推送用户信息,达到用户状态的更新。
2. 当用户登录时自动设置用户状态为上线,并推送用户信息到 前端。
3. 当用户离线时自动设置用户状态为离线状态,并推送给前端。
4. 通过 定时任务扫描在线用户,当在线用户的最后操作时间于当前时间差大于30 分钟(session失效时间),设置用户状态为离线。并将该用户状态推送给前端。
5. 前端维护当前在线用户列表
设计:
在用户表中新增字段 “status“ 和 “last_time“。“status “用来标注 用户当前的状态: “last_time“ 用来记录用户最后操作的时间。
ALTER TABLE user ADD COLUMN `last_time` datetime COMMENT '最后一次操作时间'; ALTER TABLE user ADD COLUMN `status` int(11) DEFAULT '4' COMMENT '用户登录状态,1 : 在线 2 离开 3 忙碌 4 离线';
1. 编写更新用户“status“ 和 “last_time“字段方法实现。每次更新“status“字段时更新“last_time“ 为当前时间(登出操作除外)
2. 在登录时更新用户“status“为 上线 , “last_time“为当前时间。并推送用户信息给前端。
3. 在登出时更新用户“status“为 下线 。并推送用户信息给前端。
4. 当用户手动修改当前用户的状态为“离开“或“忙碌“时,后端修改用户状态,并将修改结果推送给前端,用户维护当前在线用户列表。
5. 在拦截器中拦截用户的操作,用户每次操作之后都更新用户的“last_time“。并推送用户信息给前端。
6. 编写定时任务扫描“status“ 为上线的用户,比较用户的“last_time“于当前时间的时间差,当时间差大于30 分钟(session失效时间),设置用户“status“为离线状态。并将该用户状态推送给前端。
7. 在前端做一个用户信息统一封装,各个地方显示的用户状态信息都从该方法中获取。该方法在用户登录系统后,向后端发送请求,拉取当前系统在线用户的状态。然后通过后端的websocket 推送信息来维护 当前在线用户的列表。(当有新用户上线则向列表中添加该用户,有用户登出,则将用户从该列表剔除。)