Browse Source

feat: 日志管理

main
李朋徽 1 year ago
parent
commit
e1f7943419
  1. 23
      src/api/system/log/index.ts
  2. 70
      src/api/system/log/types.ts
  3. 81
      src/views/system/log/api/DetailModal.vue
  4. 51
      src/views/system/log/api/data.ts
  5. 58
      src/views/system/log/api/index.vue
  6. 96
      src/views/system/log/error/DetailModal.vue
  7. 51
      src/views/system/log/error/data.ts
  8. 58
      src/views/system/log/error/index.vue
  9. 73
      src/views/system/log/usual/DetailModal.vue
  10. 51
      src/views/system/log/usual/data.ts
  11. 58
      src/views/system/log/usual/index.vue

23
src/api/system/log/index.ts

@ -0,0 +1,23 @@
import type { GetAplListParams, GetErrorListParams, GetUsualListParams, SystemErrorApi, SystemLogApi, SystemLogUsual } from './types'
import { defHttp } from '@/utils/http/axios'
export function getLogUsualList(params: GetUsualListParams) {
return defHttp.get<PageResult<SystemLogUsual>>({
url: '/hulk-log/usual/list',
params,
})
}
export function getLogApiList(params: GetAplListParams) {
return defHttp.get<PageResult<SystemLogApi>>({
url: '/hulk-log/api/list',
params,
})
}
export function getLogErrorList(params: GetErrorListParams) {
return defHttp.get<PageResult<SystemErrorApi>>({
url: '/hulk-log/error/list',
params,
})
}

70
src/api/system/log/types.ts

@ -0,0 +1,70 @@
export interface GetUsualListParams extends PageParam {
}
export interface GetAplListParams extends PageParam {
}
export interface GetErrorListParams extends PageParam {
}
export interface SystemLogUsual {
id: string
createTime: string
env: string
logData: string
logId: string
logLevel: string
method: string
methodClass: string
methodName: string
params: string
remoteIp: string
requestUri: string
serverHost: string
serverIp: string
serviceId: string
tenantId: string
userAgent: string
}
export interface SystemLogApi {
id: string
createTime: string
env: string
method: string
methodClass: string
methodName: string
params: string
remoteIp: string
requestUri: string
serverHost: string
serverIp: string
serviceId: string
tenantId: string
userAgent: string
title: string
type: string
}
export interface SystemErrorApi {
id: string
createTime: string
env: string
exceptionName: string
fileName: string
lineNumber: number
message: string
logData: string
logId: string
logLevel: string
method: string
methodClass: string
methodName: string
params: string
remoteIp: string
requestUri: string
serverHost: string
serverIp: string
serviceId: string
tenantId: string
userAgent: string
stackTrace: string
}

81
src/views/system/log/api/DetailModal.vue

@ -0,0 +1,81 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { BasicModal, useModalInner } from '@/components/Modal'
import { Description } from '@/components/Description'
import type { DescItem } from '@/components/Description'
import type { SystemLogApi } from '@/api/system/log/types'
defineOptions({ name: 'DetailModal' })
const baseDetail = ref({})
const [registerModal] = useModalInner(async (data: SystemLogApi) => {
baseDetail.value = data
})
const baseSchema: DescItem[] = [
{
field: 'tenantId',
label: '租户id',
span: 24,
labelMinWidth: 100,
},
{
field: 'serviceId',
label: '服务id',
},
{
field: 'serverHost',
label: '服务host',
},
{
field: 'serverIp',
label: '服务ip',
},
{
field: 'env',
label: '软件环境',
},
{
field: 'title',
label: '日志名',
},
{
field: 'createTime',
label: '日志时间',
},
{
field: 'requestUri',
label: '请求接口',
},
{
field: 'method',
label: '请求方法',
render: (record) => {
return record || '-'
},
},
{
field: 'params',
label: '请求数据',
span: 24,
},
{
field: 'userAgent',
label: '用户代理',
span: 24,
},
]
</script>
<template>
<BasicModal
width="900px"
title="查看"
:show-cancel-btn="false"
:show-ok-btn="false"
@register="registerModal"
>
<Description :data="baseDetail" :schema="baseSchema" :column="2" />
</BasicModal>
</template>

51
src/views/system/log/api/data.ts

@ -0,0 +1,51 @@
import type { BasicColumn, FormSchema } from '@/components/Table'
export const columns: BasicColumn[] = [
{
title: '服务id',
dataIndex: 'serviceId',
},
{
title: '服务host',
dataIndex: 'serverHost',
},
{
title: '服务ip',
dataIndex: 'serverIp',
},
{
title: '软件环境',
dataIndex: 'env',
},
{
title: '日志名',
dataIndex: 'title',
},
{
title: '请求方法',
dataIndex: 'method',
},
{
title: '请求接口',
dataIndex: 'requestUri',
},
{
title: '日志时间',
dataIndex: 'createTime',
},
]
export const searchFormSchema: FormSchema[] = [
{
label: '服务id',
field: 'serviceId',
component: 'Input',
colProps: { span: 5 },
},
{
label: '服务host',
field: 'serverHost',
component: 'Input',
colProps: { span: 5 },
},
]

58
src/views/system/log/api/index.vue

@ -0,0 +1,58 @@
<script lang="ts" setup>
import { columns, searchFormSchema } from './data'
import DetailModal from './DetailModal.vue'
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { useModal } from '@/components/Modal'
import { getLogApiList } from '@/api/system/log'
import type { SystemLogApi } from '@/api/system/log/types'
// import { usePermission } from '@/hooks/web/usePermission'
defineOptions({ name: 'SystemLogApi' })
// const { hasPermission } = usePermission()
const [registerDetailModal, { openModal: openDetailModal }] = useModal<SystemLogApi>()
const [registerTable, { reload }] = useTable({
api: getLogApiList,
columns,
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
actionColOptions: { span: 4 },
},
bordered: true,
canResize: false,
useSearchForm: true,
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
fixed: 'right',
// auth: ['tenant_delete', 'tenant_edit'],
},
})
</script>
<template>
<div>
<BasicTable :api="async () => ([] as SystemLogApi[])" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'i-ant-design:eye-outlined',
label: '查看',
// auth: 'tenant_edit',
onClick: () => openDetailModal(true, record),
},
]"
/>
</template>
</template>
</BasicTable>
<DetailModal @register="registerDetailModal" @success="reload()" />
</div>
</template>

96
src/views/system/log/error/DetailModal.vue

@ -0,0 +1,96 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { BasicModal, useModalInner } from '@/components/Modal'
import { Description } from '@/components/Description'
import type { DescItem } from '@/components/Description'
import type { SystemLogApi } from '@/api/system/log/types'
defineOptions({ name: 'DetailModal' })
const baseDetail = ref({})
const [registerModal] = useModalInner(async (data: SystemLogApi) => {
baseDetail.value = data
})
const baseSchema: DescItem[] = [
{
field: 'tenantId',
label: '租户id',
span: 24,
labelMinWidth: 100,
},
{
field: 'serviceId',
label: '服务id',
},
{
field: 'serverHost',
label: '服务host',
},
{
field: 'serverIp',
label: '服务ip',
},
{
field: 'env',
label: '软件环境',
},
{
field: 'createTime',
label: '日志时间',
},
{
field: 'requestUri',
label: '请求接口',
},
{
field: 'method',
label: '请求方法',
render: (record) => {
return record || '-'
},
},
{
field: 'params',
label: '请求数据',
span: 24,
render: (record) => {
return record || '-'
},
},
{
field: 'userAgent',
label: '用户代理',
span: 24,
},
{
field: 'fileName',
label: '文件名称',
span: 24,
},
{
field: 'exceptionName',
label: '错误名称',
span: 24,
},
{
field: 'message',
label: '错误信息',
span: 24,
},
]
</script>
<template>
<BasicModal
width="900px"
title="查看"
:show-cancel-btn="false"
:show-ok-btn="false"
@register="registerModal"
>
<Description :data="baseDetail" :schema="baseSchema" :column="2" />
</BasicModal>
</template>

51
src/views/system/log/error/data.ts

@ -0,0 +1,51 @@
import type { BasicColumn, FormSchema } from '@/components/Table'
export const columns: BasicColumn[] = [
{
title: '服务id',
dataIndex: 'serviceId',
},
{
title: '服务host',
dataIndex: 'serverHost',
},
{
title: '服务ip',
dataIndex: 'serverIp',
},
{
title: '软件环境',
dataIndex: 'env',
},
{
title: '错误信息',
dataIndex: 'message',
},
{
title: '请求方法',
dataIndex: 'method',
},
{
title: '请求接口',
dataIndex: 'requestUri',
},
{
title: '日志时间',
dataIndex: 'createTime',
},
]
export const searchFormSchema: FormSchema[] = [
{
label: '服务id',
field: 'serviceId',
component: 'Input',
colProps: { span: 5 },
},
{
label: '服务host',
field: 'serverHost',
component: 'Input',
colProps: { span: 5 },
},
]

58
src/views/system/log/error/index.vue

@ -0,0 +1,58 @@
<script lang="ts" setup>
import { columns, searchFormSchema } from './data'
import DetailModal from './DetailModal.vue'
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { useModal } from '@/components/Modal'
import { getLogErrorList } from '@/api/system/log'
import type { SystemErrorApi } from '@/api/system/log/types'
// import { usePermission } from '@/hooks/web/usePermission'
defineOptions({ name: 'SystemErrorApi' })
// const { hasPermission } = usePermission()
const [registerDetailModal, { openModal: openDetailModal }] = useModal<SystemErrorApi>()
const [registerTable, { reload }] = useTable({
api: getLogErrorList,
columns,
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
actionColOptions: { span: 4 },
},
bordered: true,
canResize: false,
useSearchForm: true,
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
fixed: 'right',
// auth: ['tenant_delete', 'tenant_edit'],
},
})
</script>
<template>
<div>
<BasicTable :api="async () => ([] as SystemErrorApi[])" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'i-ant-design:eye-outlined',
label: '查看',
// auth: 'tenant_edit',
onClick: () => openDetailModal(true, record),
},
]"
/>
</template>
</template>
</BasicTable>
<DetailModal @register="registerDetailModal" @success="reload()" />
</div>
</template>

73
src/views/system/log/usual/DetailModal.vue

@ -0,0 +1,73 @@
<script lang="ts" setup>
import { ref } from 'vue'
import { BasicModal, useModalInner } from '@/components/Modal'
import { Description } from '@/components/Description'
import type { DescItem } from '@/components/Description'
import type { SystemLogUsual } from '@/api/system/log/types'
defineOptions({ name: 'DetailModal' })
const baseDetail = ref({})
const [registerModal] = useModalInner(async (data: SystemLogUsual) => {
baseDetail.value = data
})
const baseSchema: DescItem[] = [
{
field: 'tenantId',
label: '租户id',
span: 24,
},
{
field: 'serviceId',
label: '服务id',
},
{
field: 'serverHost',
label: '服务host',
},
{
field: 'serverIp',
label: '服务ip',
},
{
field: 'id',
label: '日志id',
},
{
field: 'logLevel',
label: '日志级别',
render: (record) => {
return record || '-'
},
},
{
field: 'createTime',
label: '日志时间',
},
{
field: 'requestUri',
label: '请求接口',
},
{
field: 'method',
label: '请求方法',
render: (record) => {
return record || '-'
},
},
]
</script>
<template>
<BasicModal
width="900px"
title="查看"
:show-cancel-btn="false"
:show-ok-btn="false"
@register="registerModal"
>
<Description :data="baseDetail" :schema="baseSchema" :column="2" />
</BasicModal>
</template>

51
src/views/system/log/usual/data.ts

@ -0,0 +1,51 @@
import type { BasicColumn, FormSchema } from '@/components/Table'
export const columns: BasicColumn[] = [
{
title: '服务id',
dataIndex: 'serviceId',
},
{
title: '服务host',
dataIndex: 'serverHost',
},
{
title: '服务ip',
dataIndex: 'serverIp',
},
{
title: '软件环境',
dataIndex: 'env',
},
{
title: '日志级别',
dataIndex: 'logLevel',
},
{
title: '日志id',
dataIndex: 'id',
},
{
title: '请求接口',
dataIndex: 'requestUri',
},
{
title: '日志时间',
dataIndex: 'createTime',
},
]
export const searchFormSchema: FormSchema[] = [
{
label: '服务id',
field: 'serviceId',
component: 'Input',
colProps: { span: 5 },
},
{
label: '服务host',
field: 'serverHost',
component: 'Input',
colProps: { span: 5 },
},
]

58
src/views/system/log/usual/index.vue

@ -0,0 +1,58 @@
<script lang="ts" setup>
import { columns, searchFormSchema } from './data'
import DetailModal from './DetailModal.vue'
import { BasicTable, TableAction, useTable } from '@/components/Table'
import { useModal } from '@/components/Modal'
import { getLogUsualList } from '@/api/system/log'
import type { SystemLogUsual } from '@/api/system/log/types'
// import { usePermission } from '@/hooks/web/usePermission'
defineOptions({ name: 'SystemLogUsual' })
// const { hasPermission } = usePermission()
const [registerDetailModal, { openModal: openDetailModal }] = useModal<SystemLogUsual>()
const [registerTable, { reload }] = useTable({
api: getLogUsualList,
columns,
formConfig: {
labelWidth: 100,
schemas: searchFormSchema,
actionColOptions: { span: 4 },
},
bordered: true,
canResize: false,
useSearchForm: true,
actionColumn: {
width: 100,
title: '操作',
dataIndex: 'action',
fixed: 'right',
// auth: ['tenant_delete', 'tenant_edit'],
},
})
</script>
<template>
<div>
<BasicTable :api="async () => ([] as SystemLogUsual[])" @register="registerTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:actions="[
{
icon: 'i-ant-design:eye-outlined',
label: '查看',
// auth: 'tenant_edit',
onClick: () => openDetailModal(true, record),
},
]"
/>
</template>
</template>
</BasicTable>
<DetailModal @register="registerDetailModal" @success="reload()" />
</div>
</template>
Loading…
Cancel
Save