index.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  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. import { useDomFullHeight } from '@/hooks';
  13. const service = new BaseService('logger/access');
  14. const Access = () => {
  15. const actionRef = useRef<ActionType>();
  16. const intl = useIntl();
  17. const [param, setParam] = useState({});
  18. const [visible, setVisible] = useState<boolean>(false);
  19. const [current, setCurrent] = useState<Partial<AccessLogItem>>({});
  20. const { minHeight } = useDomFullHeight(`.accessLog`, 24);
  21. const columns: ProColumns<AccessLogItem>[] = [
  22. {
  23. title: 'IP',
  24. dataIndex: 'ip',
  25. ellipsis: true,
  26. fixed: 'left',
  27. },
  28. {
  29. title: intl.formatMessage({
  30. id: 'pages.log.access.url',
  31. defaultMessage: '请求路径',
  32. }),
  33. dataIndex: 'url',
  34. ellipsis: true,
  35. },
  36. {
  37. title: '请求方法',
  38. dataIndex: 'httpMethod',
  39. ellipsis: true,
  40. valueType: 'select',
  41. width: 80,
  42. valueEnum: {
  43. POST: {
  44. text: 'POST',
  45. status: 'POST',
  46. },
  47. GET: {
  48. text: 'GET',
  49. status: 'GET',
  50. },
  51. PATCH: {
  52. text: 'PATCH',
  53. status: 'PATCH',
  54. },
  55. DELETE: {
  56. text: 'DELETE',
  57. status: 'DELETE',
  58. },
  59. PUT: {
  60. text: 'PUT',
  61. status: 'PUT',
  62. },
  63. },
  64. },
  65. {
  66. title: intl.formatMessage({
  67. id: 'pages.log.access.requestTime',
  68. defaultMessage: '请求时间',
  69. }),
  70. dataIndex: 'requestTime',
  71. sorter: true,
  72. valueType: 'dateTime',
  73. defaultSortOrder: 'descend',
  74. ellipsis: true,
  75. renderText: (text: string) => moment(text).format('YYYY-MM-DD HH:mm:ss'),
  76. },
  77. {
  78. title: intl.formatMessage({
  79. id: 'pages.log.access.requestTimeConsuming',
  80. defaultMessage: '请求耗时',
  81. }),
  82. width: 100,
  83. renderText: (record: AccessLogItem) => (
  84. <Tag color="purple">{record.responseTime - record.requestTime}ms</Tag>
  85. ),
  86. },
  87. {
  88. title: intl.formatMessage({
  89. id: 'pages.log.access.requestUser',
  90. defaultMessage: '请求用户',
  91. }),
  92. dataIndex: 'context.username',
  93. render: (text, record: any) =>
  94. record?.context?.username ? <Tag color="geekblue">{record?.context?.username}</Tag> : '',
  95. },
  96. {
  97. title: intl.formatMessage({
  98. id: 'pages.data.option',
  99. defaultMessage: '操作',
  100. }),
  101. valueType: 'option',
  102. align: 'center',
  103. fixed: 'right',
  104. render: (text, record) => [
  105. <a
  106. key="editable"
  107. onClick={() => {
  108. setVisible(true);
  109. setCurrent(record);
  110. }}
  111. >
  112. <Tooltip title={'查看'}>
  113. <EyeOutlined />
  114. </Tooltip>
  115. </a>,
  116. ],
  117. },
  118. ];
  119. return (
  120. <>
  121. <SearchComponent<AccessLogItem>
  122. field={columns}
  123. target="access-log"
  124. onSearch={(data) => {
  125. actionRef.current?.reset?.();
  126. setParam(data);
  127. }}
  128. />
  129. <ProTable<AccessLogItem>
  130. columns={columns}
  131. params={param}
  132. columnEmptyText={''}
  133. tableClassName={'accessLog'}
  134. tableStyle={{ minHeight }}
  135. scroll={{ x: 1366 }}
  136. request={async (params) =>
  137. service.query({ ...params, sorts: [{ name: 'responseTime', order: 'desc' }] })
  138. }
  139. defaultParams={{ sorts: [{ responseTime: 'desc' }] }}
  140. search={false}
  141. actionRef={actionRef}
  142. />
  143. {visible && (
  144. <Detail
  145. data={current}
  146. close={() => {
  147. setVisible(false);
  148. setCurrent({});
  149. }}
  150. />
  151. )}
  152. </>
  153. );
  154. };
  155. export default Access;