blob: 2f81e3b0945925d9db0e2357229418704f3d0b49 [file] [log] [blame]
import type { FormInstance } from 'antd';
import { Button, message, Modal } from 'antd';
import React, { useRef, useEffect } from 'react';
import { useIntl, FormattedMessage, useAccess } from '@umijs/max';
import { getOnlineUserList, forceLogout } from '@/services/monitor/online';
import { ActionType, ProColumns, ProTable } from '@ant-design/pro-components';
import { DeleteOutlined } from '@ant-design/icons';
/* *
*
* @author whiteshader@163.com
* @datetime 2023/02/07
*
* */
const handleForceLogout = async (selectedRow: API.Monitor.OnlineUserType) => {
const hide = message.loading('正在强制下线');
try {
await forceLogout(selectedRow.tokenId);
hide();
message.success('强制下线成功,即将刷新');
return true;
} catch (error) {
hide();
message.error('强制下线失败,请重试');
return false;
}
};
const OnlineUserTableList: React.FC = () => {
const formTableRef = useRef<FormInstance>();
const actionRef = useRef<ActionType>();
const access = useAccess();
const intl = useIntl();
useEffect(() => {}, []);
const columns: ProColumns<API.Monitor.OnlineUserType>[] = [
{
title: <FormattedMessage id="monitor.online.user.token_id" defaultMessage="会话编号" />,
dataIndex: 'tokenId',
valueType: 'text',
hideInSearch: true,
},
{
title: <FormattedMessage id="monitor.online.user.user_name" defaultMessage="用户账号" />,
dataIndex: 'userName',
valueType: 'text',
},
{
title: <FormattedMessage id="monitor.online.user.dept_name" defaultMessage="部门名称" />,
dataIndex: 'deptName',
valueType: 'text',
hideInSearch: true,
},
{
title: <FormattedMessage id="monitor.online.user.ipaddr" defaultMessage="登录IP地址" />,
dataIndex: 'ipaddr',
valueType: 'text',
},
{
title: <FormattedMessage id="monitor.online.user.login_location" defaultMessage="登录地点" />,
dataIndex: 'loginLocation',
valueType: 'text',
hideInSearch: true,
},
{
title: <FormattedMessage id="monitor.online.user.browser" defaultMessage="浏览器类型" />,
dataIndex: 'browser',
valueType: 'text',
hideInSearch: true,
},
{
title: <FormattedMessage id="monitor.online.user.os" defaultMessage="操作系统" />,
dataIndex: 'os',
valueType: 'text',
hideInSearch: true,
},
{
title: <FormattedMessage id="monitor.online.user.login_time" defaultMessage="登录时间" />,
dataIndex: 'loginTime',
valueType: 'dateRange',
render: (_, record) => <span>{record.loginTime}</span>,
hideInSearch: true,
search: {
transform: (value) => {
return {
'params[beginTime]': value[0],
'params[endTime]': value[1],
};
},
},
},
{
title: <FormattedMessage id="pages.searchTable.titleOption" defaultMessage="操作" />,
dataIndex: 'option',
width: '60px',
valueType: 'option',
render: (_, record) => [
<Button
type="link"
size="small"
danger
key="batchRemove"
icon=<DeleteOutlined />
hidden={!access.hasPerms('monitor:online:forceLogout')}
onClick={async () => {
Modal.confirm({
title: '强踢',
content: '确定强制将该用户踢下线吗?',
okText: '确认',
cancelText: '取消',
onOk: async () => {
const success = await handleForceLogout(record);
if (success) {
if (actionRef.current) {
actionRef.current.reload();
}
}
},
});
}}
>
强退
</Button>,
],
},
];
return (
<div style={{ width: '100%', float: 'right' }}>
<ProTable<API.Monitor.OnlineUserType>
headerTitle={intl.formatMessage({
id: 'pages.searchTable.title',
defaultMessage: '信息',
})}
actionRef={actionRef}
formRef={formTableRef}
rowKey="tokenId"
key="logininforList"
search={{
labelWidth: 120,
}}
request={(params) =>
getOnlineUserList({ ...params } as API.Monitor.OnlineUserListParams).then((res) => {
const result = {
data: res.rows,
total: res.total,
success: true,
};
return result;
})
}
columns={columns}
/>
</div>
);
};
export default OnlineUserTableList;