parent
07187ad064
commit
1e61e437c2
|
@ -17,3 +17,4 @@ dist/
|
||||||
sysom_api/uploads/*
|
sysom_api/uploads/*
|
||||||
sysom_api/doc/*
|
sysom_api/doc/*
|
||||||
sysom_api/conf/develop.py
|
sysom_api/conf/develop.py
|
||||||
|
sysom_api/sysom/settings.py
|
||||||
|
|
|
@ -12,6 +12,6 @@ router.register('permission', views.PermissionViewSet)
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('api/v1/', include(router.urls)),
|
path('api/v1/', include(router.urls)),
|
||||||
path('api/v1/auth/', views.AuthAPIView.as_view()),
|
path('api/v1/auth/', views.AuthAPIView.as_view()),
|
||||||
path('api/v1/user/logs', views.UserModelViewSet.as_view({'get': 'get_logs'})),
|
path('api/v1/journal/', views.UserModelViewSet.as_view({'get': 'get_logs'})),
|
||||||
path('api/v1/change_password/', views.ChangePasswordViewSet.as_view())
|
path('api/v1/change_password/', views.ChangePasswordViewSet.as_view())
|
||||||
]
|
]
|
||||||
|
|
|
@ -70,7 +70,7 @@ class UserModelViewSet(
|
||||||
result = super().retrieve(request, *args, **kwargs)
|
result = super().retrieve(request, *args, **kwargs)
|
||||||
return success(result=result.data, message="获取成功")
|
return success(result=result.data, message="获取成功")
|
||||||
|
|
||||||
def get_logs(self, request: Request, *args, **kwargs):
|
def get_logs(self, request, *args, **kwargs):
|
||||||
params = request.query_params.dict()
|
params = request.query_params.dict()
|
||||||
option = self.logging_options.get(params.get('option'), None)
|
option = self.logging_options.get(params.get('option'), None)
|
||||||
queryset = models.HandlerLog.objects.select_related().all()
|
queryset = models.HandlerLog.objects.select_related().all()
|
||||||
|
@ -79,7 +79,7 @@ class UserModelViewSet(
|
||||||
if not user.is_admin:
|
if not user.is_admin:
|
||||||
queryset = queryset.filter(user=user)
|
queryset = queryset.filter(user=user)
|
||||||
|
|
||||||
if option:
|
if option is not None:
|
||||||
queryset = queryset.filter(request_option=option)
|
queryset = queryset.filter(request_option=option)
|
||||||
|
|
||||||
ser = serializer.HandlerLoggerListSerializer(queryset, many=True)
|
ser = serializer.HandlerLoggerListSerializer(queryset, many=True)
|
||||||
|
|
|
@ -114,6 +114,21 @@ export default [
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: '/journal',
|
||||||
|
name: 'journal',
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: '/journal',
|
||||||
|
redirect: '/journal/audit',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/journal/audit',
|
||||||
|
name: 'audit',
|
||||||
|
component: './journal/Audit',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: '/',
|
path: '/',
|
||||||
redirect: '/welcome',
|
redirect: '/welcome',
|
||||||
|
|
|
@ -66,4 +66,6 @@ export default {
|
||||||
'menu.diagnose.io': 'IO延时诊断',
|
'menu.diagnose.io': 'IO延时诊断',
|
||||||
'menu.diagnose.net': '网络诊断',
|
'menu.diagnose.net': '网络诊断',
|
||||||
'menu.vmcore.analyse': '在线分析',
|
'menu.vmcore.analyse': '在线分析',
|
||||||
|
'menu.journal': '日志中心',
|
||||||
|
'menu.journal.audit': '审计日志',
|
||||||
};
|
};
|
||||||
|
|
|
@ -56,4 +56,14 @@ export default {
|
||||||
'pages.hostTable.host': '此为必填项',
|
'pages.hostTable.host': '此为必填项',
|
||||||
'pages.hostTable.createForm.editHost': '编辑主机',
|
'pages.hostTable.createForm.editHost': '编辑主机',
|
||||||
'pages.IssueTable.createIssue': '新增方案',
|
'pages.IssueTable.createIssue': '新增方案',
|
||||||
|
'pages.journal.audit.title': '日志列表',
|
||||||
|
'pages.journal.audit.created_at': '时间',
|
||||||
|
'pages.journal.audit.username': '用户',
|
||||||
|
'pages.journal.audit.request_ip': '源IP',
|
||||||
|
'pages.journal.audit.request_url': '请求URL',
|
||||||
|
'pages.journal.audit.request_method': '请求方法',
|
||||||
|
'pages.journal.audit.request_option': '行为类型',
|
||||||
|
'pages.journal.audit.login': '登录行为',
|
||||||
|
'pages.journal.audit.action': '操作行为',
|
||||||
|
'pages.journal.audit.response_status': '返回状态',
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,6 +35,9 @@ const Welcome = () => {
|
||||||
<Menu.Item key="io"><a href="/diagnose/io">IO延时诊断</a></Menu.Item>
|
<Menu.Item key="io"><a href="/diagnose/io">IO延时诊断</a></Menu.Item>
|
||||||
<Menu.Item key="net"><a href="/diagnose/net">网络诊断</a></Menu.Item>
|
<Menu.Item key="net"><a href="/diagnose/net">网络诊断</a></Menu.Item>
|
||||||
</SubMenu>
|
</SubMenu>
|
||||||
|
<SubMenu key="journal" title="日志中心">
|
||||||
|
<Menu.Item key="audit"><a href="/journal/audit">审计日志</a></Menu.Item>
|
||||||
|
</SubMenu>
|
||||||
</Menu>
|
</Menu>
|
||||||
<div className={styles.avatarRight}>
|
<div className={styles.avatarRight}>
|
||||||
<AvatarDrop/>
|
<AvatarDrop/>
|
||||||
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
import { useRef } from 'react';
|
||||||
|
import { useIntl, FormattedMessage } from 'umi';
|
||||||
|
import { PageContainer } from '@ant-design/pro-layout';
|
||||||
|
import ProTable from '@ant-design/pro-table';
|
||||||
|
import { getAudit } from '../service';
|
||||||
|
|
||||||
|
const AuditList = () => {
|
||||||
|
const actionRef = useRef();
|
||||||
|
const intl = useIntl();
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.created_at" defaultMessage="created_at" />,
|
||||||
|
dataIndex: 'created_at',
|
||||||
|
valueType: 'dateTime',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.username" defaultMessage="username" />,
|
||||||
|
dataIndex: 'username',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.request_ip" defaultMessage="request_ip" />,
|
||||||
|
dataIndex: 'request_ip',
|
||||||
|
valueType: 'textarea',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.request_url" defaultMessage="request_url" />,
|
||||||
|
dataIndex: 'request_url',
|
||||||
|
valueType: 'textarea',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.request_method" defaultMessage="request_method" />,
|
||||||
|
dataIndex: 'request_method',
|
||||||
|
valueType: 'textarea',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.response_status" defaultMessage="response_status" />,
|
||||||
|
dataIndex: 'response_status',
|
||||||
|
valueType: 'textarea',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: <FormattedMessage id="pages.journal.audit.request_option" defaultMessage="request_option" />,
|
||||||
|
dataIndex: 'request_option',
|
||||||
|
valueEnum: {
|
||||||
|
'login': {
|
||||||
|
text: (
|
||||||
|
<FormattedMessage id="pages.journal.audit.login" defaultMessage="login" />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
'action': {
|
||||||
|
text: (
|
||||||
|
<FormattedMessage id="pages.journal.audit.action" defaultMessage="action" />
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
return (
|
||||||
|
<PageContainer>
|
||||||
|
<ProTable
|
||||||
|
headerTitle={intl.formatMessage({
|
||||||
|
id: 'pages.journal.audit.title',
|
||||||
|
defaultMessage: 'Audit',
|
||||||
|
})}
|
||||||
|
actionRef={actionRef}
|
||||||
|
rowKey="id"
|
||||||
|
search={{
|
||||||
|
labelWidth: 120,
|
||||||
|
}}
|
||||||
|
toolBarRender={() => [
|
||||||
|
]}
|
||||||
|
request={getAudit}
|
||||||
|
columns={columns}
|
||||||
|
/>
|
||||||
|
</PageContainer>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AuditList;
|
|
@ -0,0 +1,19 @@
|
||||||
|
// @ts-ignore
|
||||||
|
|
||||||
|
/* eslint-disable */
|
||||||
|
import {
|
||||||
|
request
|
||||||
|
} from 'umi';
|
||||||
|
|
||||||
|
export async function getAudit(params, options) {
|
||||||
|
const token = localStorage.getItem('token');
|
||||||
|
return request('/api/v1/journal/', {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'Authorization': token,
|
||||||
|
},
|
||||||
|
params: params,
|
||||||
|
...(options || {}),
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue