!46 日志中心前端开发以及联调完成;

1. 日志中心前端开发以及联调完成;
This commit is contained in:
剑子仙机 2022-03-05 09:57:31 +00:00
parent 07187ad064
commit 1e61e437c2
10 changed files with 132 additions and 3 deletions

1
.gitignore vendored
View File

@ -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

View File

@ -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())
] ]

View File

@ -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)

View File

@ -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',

View File

@ -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': '审计日志',
}; };

View File

@ -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': '返回状态',
}; };

View File

@ -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/>

View File

@ -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;

View File

View File

@ -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 || {}),
});
}