| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- import BaseService from '../../base';
- import { UAParser } from 'ua-parser-js';
- /**
- * 在线用户Service
- */
- export default class SysOnlineService extends BaseService {
- async list() {
- const onlineUserIds: string[] = await this.getAdminRedis().keys('admin:token:*');
- const formatNumberIds: number[] = onlineUserIds.map(e => {
- const uid = e.split('admin:token:')[1];
- return parseInt(uid);
- });
- return await this.findLastLoginInfo(formatNumberIds);
- }
- /**
- * 根据用户id列表查找最近登录信息和用户信息
- */
- async findLastLoginInfo(ids: number[]) {
- const result = await this.ctx.ormManager.query(`
- SELECT n.*, u.username
- FROM sys_login_log n
- INNER JOIN (
- SELECT user_id, MAX(createTime) AS createTime
- FROM sys_login_log GROUP BY user_id
- ) AS max USING (user_id, createTime)
- INNER JOIN sys_user u ON n.user_id = u.id
- WHERE n.user_id IN (?)
- `, [ ids ]);
- if (result) {
- const parser = new UAParser();
- return result.map(e => {
- const u = parser.setUA(e.ua).getResult();
- return {
- id: e.user_id,
- ip: e.ip,
- username: e.username,
- isCurrent: this.ctx.token.uid === e.user_id,
- time: e.createTime,
- status: 1,
- os: `${u.os.name} ${u.os.version}`,
- browser: `${u.browser.name} ${u.browser.version}`,
- disable: this.ctx.token.uid === e.user_id || e.user_id === this.config.rootRoleId,
- };
- });
- }
- return [];
- }
- }
|