parent
07187ad064
commit
1e61e437c2
|
@ -17,3 +17,4 @@ dist/
|
|||
sysom_api/uploads/*
|
||||
sysom_api/doc/*
|
||||
sysom_api/conf/develop.py
|
||||
sysom_api/sysom/settings.py
|
||||
|
|
|
@ -12,6 +12,6 @@ router.register('permission', views.PermissionViewSet)
|
|||
urlpatterns = [
|
||||
path('api/v1/', include(router.urls)),
|
||||
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())
|
||||
]
|
||||
|
|
|
@ -70,7 +70,7 @@ class UserModelViewSet(
|
|||
result = super().retrieve(request, *args, **kwargs)
|
||||
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()
|
||||
option = self.logging_options.get(params.get('option'), None)
|
||||
queryset = models.HandlerLog.objects.select_related().all()
|
||||
|
@ -79,7 +79,7 @@ class UserModelViewSet(
|
|||
if not user.is_admin:
|
||||
queryset = queryset.filter(user=user)
|
||||
|
||||
if option:
|
||||
if option is not None:
|
||||
queryset = queryset.filter(request_option=option)
|
||||
|
||||
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: '/',
|
||||
redirect: '/welcome',
|
||||
|
|
|
@ -66,4 +66,6 @@ export default {
|
|||
'menu.diagnose.io': 'IO延时诊断',
|
||||
'menu.diagnose.net': '网络诊断',
|
||||
'menu.vmcore.analyse': '在线分析',
|
||||
'menu.journal': '日志中心',
|
||||
'menu.journal.audit': '审计日志',
|
||||
};
|
||||
|
|
|
@ -56,4 +56,14 @@ export default {
|
|||
'pages.hostTable.host': '此为必填项',
|
||||
'pages.hostTable.createForm.editHost': '编辑主机',
|
||||
'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="net"><a href="/diagnose/net">网络诊断</a></Menu.Item>
|
||||
</SubMenu>
|
||||
<SubMenu key="journal" title="日志中心">
|
||||
<Menu.Item key="audit"><a href="/journal/audit">审计日志</a></Menu.Item>
|
||||
</SubMenu>
|
||||
</Menu>
|
||||
<div className={styles.avatarRight}>
|
||||
<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