1
0

online.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import BaseService from '../../base';
  2. import { UAParser } from 'ua-parser-js';
  3. /**
  4. * 在线用户Service
  5. */
  6. export default class SysOnlineService extends BaseService {
  7. async list() {
  8. const onlineUserIds: string[] = await this.getAdminRedis().keys('admin:token:*');
  9. const formatNumberIds: number[] = onlineUserIds.map(e => {
  10. const uid = e.split('admin:token:')[1];
  11. return parseInt(uid);
  12. });
  13. return await this.findLastLoginInfo(formatNumberIds);
  14. }
  15. /**
  16. * 根据用户id列表查找最近登录信息和用户信息
  17. */
  18. async findLastLoginInfo(ids: number[]) {
  19. const result = await this.ctx.ormManager.query(`
  20. SELECT n.*, u.username
  21. FROM sys_login_log n
  22. INNER JOIN (
  23. SELECT user_id, MAX(createTime) AS createTime
  24. FROM sys_login_log GROUP BY user_id
  25. ) AS max USING (user_id, createTime)
  26. INNER JOIN sys_user u ON n.user_id = u.id
  27. WHERE n.user_id IN (?)
  28. `, [ ids ]);
  29. if (result) {
  30. const parser = new UAParser();
  31. return result.map(e => {
  32. const u = parser.setUA(e.ua).getResult();
  33. return {
  34. id: e.user_id,
  35. ip: e.ip,
  36. username: e.username,
  37. isCurrent: this.ctx.token.uid === e.user_id,
  38. time: e.createTime,
  39. status: 1,
  40. os: `${u.os.name} ${u.os.version}`,
  41. browser: `${u.browser.name} ${u.browser.version}`,
  42. disable: this.ctx.token.uid === e.user_id || e.user_id === this.config.rootRoleId,
  43. };
  44. });
  45. }
  46. return [];
  47. }
  48. }