index.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import BaseService from '@/utils/BaseService';
  2. import { useRef, useState } from 'react';
  3. import type { ActionType, ProColumns } from '@jetlinks/pro-table';
  4. import ProTable from '@jetlinks/pro-table';
  5. import type { AccessLogItem } from '@/pages/Log/Access/typings';
  6. import moment from 'moment';
  7. import { Tag, Tooltip } from 'antd';
  8. import { EyeOutlined } from '@ant-design/icons';
  9. import { useIntl } from '@@/plugin-locale/localeExports';
  10. import SearchComponent from '@/components/SearchComponent';
  11. import Detail from '@/pages/Log/Access/Detail';
  12. const service = new BaseService('logger/access');
  13. const Access = () => {
  14. const actionRef = useRef<ActionType>();
  15. const intl = useIntl();
  16. const [param, setParam] = useState({});
  17. const [visible, setVisible] = useState<boolean>(false);
  18. const [current, setCurrent] = useState<Partial<AccessLogItem>>({});
  19. const columns: ProColumns<AccessLogItem>[] = [
  20. {
  21. title: 'IP',
  22. dataIndex: 'ip',
  23. ellipsis: true,
  24. },
  25. {
  26. title: intl.formatMessage({
  27. id: 'pages.log.access.url',
  28. defaultMessage: '请求路径',
  29. }),
  30. dataIndex: 'url',
  31. ellipsis: true,
  32. },
  33. {
  34. title: '请求方法',
  35. dataIndex: 'httpMethod',
  36. ellipsis: true,
  37. },
  38. {
  39. title: intl.formatMessage({
  40. id: 'pages.table.description',
  41. defaultMessage: '说明',
  42. }),
  43. dataIndex: 'describe',
  44. ellipsis: true,
  45. // render: (text, record) => {
  46. // return `${record.action}-${record.describe}`;
  47. // },
  48. },
  49. {
  50. title: intl.formatMessage({
  51. id: 'pages.log.access.requestTime',
  52. defaultMessage: '请求时间',
  53. }),
  54. dataIndex: 'requestTime',
  55. sorter: true,
  56. valueType: 'dateTime',
  57. defaultSortOrder: 'descend',
  58. ellipsis: true,
  59. width: 200,
  60. renderText: (text: string) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
  61. },
  62. {
  63. title: intl.formatMessage({
  64. id: 'pages.log.access.requestTimeConsuming',
  65. defaultMessage: '请求耗时',
  66. }),
  67. renderText: (record: AccessLogItem) => (
  68. <Tag color="purple">{record.responseTime - record.requestTime}ms</Tag>
  69. ),
  70. },
  71. {
  72. title: intl.formatMessage({
  73. id: 'pages.log.access.requestUser',
  74. defaultMessage: '请求用户',
  75. }),
  76. dataIndex: 'username',
  77. render: (text, record: any) => (
  78. <Tag color="geekblue">{record?.context?.username || '--'}</Tag>
  79. ),
  80. },
  81. {
  82. title: intl.formatMessage({
  83. id: 'pages.data.option',
  84. defaultMessage: '操作',
  85. }),
  86. valueType: 'option',
  87. align: 'center',
  88. render: (text, record) => [
  89. <a
  90. key="editable"
  91. onClick={() => {
  92. setVisible(true);
  93. setCurrent(record);
  94. }}
  95. >
  96. <Tooltip title={'查看'}>
  97. <EyeOutlined />
  98. </Tooltip>
  99. </a>,
  100. ],
  101. },
  102. ];
  103. return (
  104. <>
  105. <SearchComponent<AccessLogItem>
  106. field={columns}
  107. target="access-log"
  108. onSearch={(data) => {
  109. actionRef.current?.reset?.();
  110. setParam(data);
  111. }}
  112. />
  113. <ProTable<AccessLogItem>
  114. columns={columns}
  115. params={param}
  116. request={async (params) =>
  117. service.query({ ...params, sorts: [{ name: 'responseTime', order: 'desc' }] })
  118. }
  119. defaultParams={{ sorts: [{ responseTime: 'desc' }] }}
  120. search={false}
  121. actionRef={actionRef}
  122. />
  123. {visible && (
  124. <Detail
  125. data={current}
  126. close={() => {
  127. setVisible(false);
  128. setCurrent({});
  129. }}
  130. />
  131. )}
  132. </>
  133. );
  134. };
  135. export default Access;