【功能优化】全局:接入 V2 版本操作日志
parent
6941e95fc1
commit
59d2baad30
|
@ -1,41 +1,37 @@
|
|||
import { defHttp } from '@/utils/http/axios'
|
||||
import { defHttp } from "@/utils/http/axios";
|
||||
|
||||
export interface OperateLogVO {
|
||||
id: number
|
||||
userNickname: string
|
||||
traceId: string
|
||||
userId: number
|
||||
module: string
|
||||
name: string
|
||||
type: number
|
||||
content: string
|
||||
exts: Map<string, object>
|
||||
defHttpMethod: string
|
||||
defHttpUrl: string
|
||||
userIp: string
|
||||
userAgent: string
|
||||
javaMethod: string
|
||||
javaMethodArgs: string
|
||||
startTime: Date
|
||||
duration: number
|
||||
resultCode: number
|
||||
resultMsg: string
|
||||
resultData: string
|
||||
id: number;
|
||||
traceId: string;
|
||||
userType: number;
|
||||
userId: number;
|
||||
userName: string;
|
||||
type: string;
|
||||
subType: string;
|
||||
bizId: number;
|
||||
action: string;
|
||||
extra: string;
|
||||
requestMethod: string;
|
||||
requestUrl: string;
|
||||
userIp: string;
|
||||
creator: string;
|
||||
creatorName: string;
|
||||
createTime: Date;
|
||||
}
|
||||
|
||||
export interface OperateLogPageReqVO extends PageParam {
|
||||
module?: string
|
||||
userNickname?: string
|
||||
type?: number
|
||||
success?: boolean
|
||||
startTime?: Date[]
|
||||
module?: string;
|
||||
userNickname?: string;
|
||||
type?: number;
|
||||
success?: boolean;
|
||||
startTime?: Date[];
|
||||
}
|
||||
|
||||
// 查询操作日志列表
|
||||
export function getOperateLogPage(params: OperateLogPageReqVO) {
|
||||
return defHttp.get({ url: '/system/operate-log/page', params })
|
||||
return defHttp.get({ url: "/system/operate-log/page", params });
|
||||
}
|
||||
// 导出操作日志
|
||||
export function exportOperateLog(params: OperateLogPageReqVO) {
|
||||
return defHttp.download({ url: '/system/operate-log/export', params }, '操作日志.xls')
|
||||
return defHttp.download({ url: "/system/operate-log/export", params }, "操作日志.xls");
|
||||
}
|
||||
|
|
|
@ -1,202 +1,151 @@
|
|||
import { h } from 'vue'
|
||||
import type { BasicColumn, FormSchema } from '@/components/Table'
|
||||
import { useRender } from '@/components/Table'
|
||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
||||
import type { DescItem } from '@/components/Description/index'
|
||||
import type { BasicColumn, FormSchema } from "@/components/Table";
|
||||
import { useRender } from "@/components/Table";
|
||||
import type { DescItem } from "@/components/Description";
|
||||
import { getListSimpleUsers } from "@/api/system/user";
|
||||
|
||||
export const columns: BasicColumn[] = [
|
||||
{
|
||||
title: '日志编号',
|
||||
dataIndex: 'id',
|
||||
title: "日志编号",
|
||||
dataIndex: "id",
|
||||
width: 100,
|
||||
},
|
||||
{
|
||||
title: '操作模块',
|
||||
dataIndex: 'module',
|
||||
title: "操作人",
|
||||
dataIndex: "userName",
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: "操作模块",
|
||||
dataIndex: "type",
|
||||
width: 200,
|
||||
},
|
||||
{
|
||||
title: '操作名',
|
||||
dataIndex: 'name',
|
||||
title: "操作名",
|
||||
dataIndex: "subType",
|
||||
width: 180,
|
||||
},
|
||||
{
|
||||
title: '操作类型',
|
||||
dataIndex: 'type',
|
||||
width: 120,
|
||||
title: "操作内容",
|
||||
dataIndex: "action",
|
||||
customRender: ({ text }) => {
|
||||
return useRender.renderDict(text, DICT_TYPE.SYSTEM_OPERATE_TYPE)
|
||||
// 和 action 关键字冲突,所以通过 customRender 解决
|
||||
return text;
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '操作人',
|
||||
dataIndex: 'userNickname',
|
||||
title: "操作时间",
|
||||
dataIndex: "createTime",
|
||||
width: 180,
|
||||
customRender: ({ text }) => {
|
||||
return useRender.renderDate(text);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: "业务编号",
|
||||
dataIndex: "bizId",
|
||||
width: 120,
|
||||
},
|
||||
// {
|
||||
// title: 'userAgent',
|
||||
// dataIndex: 'userAgent',
|
||||
// width: 400
|
||||
// },
|
||||
{
|
||||
title: '请求路径',
|
||||
dataIndex: 'requestUrl',
|
||||
title: "操作 IP",
|
||||
dataIndex: "userIp",
|
||||
width: 120,
|
||||
},
|
||||
{
|
||||
title: '操作结果',
|
||||
dataIndex: 'resultCode',
|
||||
width: 180,
|
||||
customRender: ({ text }) => {
|
||||
return useRender.renderTag(text === 0 ? '成功' : '失败', text === 0 ? '#87d068' : '#f50')
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '执行时长',
|
||||
dataIndex: 'duration',
|
||||
width: 180,
|
||||
customRender: ({ text }) => {
|
||||
return useRender.renderText(text, 'ms')
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '操作日期',
|
||||
dataIndex: 'startTime',
|
||||
width: 180,
|
||||
customRender: ({ text }) => {
|
||||
return useRender.renderDate(text)
|
||||
},
|
||||
},
|
||||
]
|
||||
];
|
||||
|
||||
export const searchFormSchema: FormSchema[] = [
|
||||
{
|
||||
label: '系统模块',
|
||||
field: 'title',
|
||||
component: 'Input',
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
{
|
||||
label: '操作人员',
|
||||
field: 'operName',
|
||||
component: 'Input',
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
{
|
||||
label: '类型',
|
||||
field: 'type',
|
||||
component: 'Select',
|
||||
label: "操作人",
|
||||
field: "userId",
|
||||
component: "ApiSelect",
|
||||
componentProps: {
|
||||
options: getDictOptions(DICT_TYPE.SYSTEM_OPERATE_TYPE),
|
||||
api: () => getListSimpleUsers(),
|
||||
labelField: "nickname",
|
||||
valueField: "id",
|
||||
},
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
{
|
||||
label: '状态',
|
||||
field: 'success',
|
||||
component: 'Select',
|
||||
componentProps: {
|
||||
options: [
|
||||
{ value: true, key: true, label: '成功' },
|
||||
{ value: false, key: false, label: '失败' },
|
||||
],
|
||||
},
|
||||
label: "操作模块",
|
||||
field: "type",
|
||||
component: "Input",
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
{
|
||||
label: '操作时间',
|
||||
field: 'startTime',
|
||||
component: 'RangePicker',
|
||||
label: "操作名",
|
||||
field: "subType",
|
||||
component: "Input",
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
]
|
||||
|
||||
const httpMethods = [
|
||||
{ value: 'GET', color: '#108ee9' },
|
||||
{ value: 'POST', color: '#2db7f5' },
|
||||
{ value: 'PUT', color: 'warning' },
|
||||
{ value: 'DELETE', color: '#f50' },
|
||||
]
|
||||
{
|
||||
label: "操作内容",
|
||||
field: "action",
|
||||
component: "Input",
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
{
|
||||
label: "操作时间",
|
||||
field: "createTime",
|
||||
component: "RangePicker",
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
{
|
||||
label: "业务编号",
|
||||
field: "bizId",
|
||||
component: "Input",
|
||||
colProps: { span: 8 },
|
||||
},
|
||||
];
|
||||
|
||||
export const infoSchema: DescItem[] = [
|
||||
{
|
||||
field: 'module',
|
||||
label: '操作模块',
|
||||
field: "id",
|
||||
label: "日志编号",
|
||||
},
|
||||
{
|
||||
field: 'name',
|
||||
label: '操作名',
|
||||
field: "userName",
|
||||
label: "操作人",
|
||||
},
|
||||
{
|
||||
field: 'userNickname',
|
||||
label: '操作人',
|
||||
render(_, data) {
|
||||
const { userNickname, userId } = data
|
||||
// return useRender.renderText(userNickname, 'uid: ' + userId)
|
||||
return useRender.renderTags([userNickname, `uid: ${userId}`])
|
||||
},
|
||||
field: "type",
|
||||
label: "操作模块",
|
||||
},
|
||||
{
|
||||
field: 'resultCode',
|
||||
label: '请求结果',
|
||||
field: "subType",
|
||||
label: "操作名",
|
||||
},
|
||||
{
|
||||
field: "action",
|
||||
label: "操作内容",
|
||||
},
|
||||
{
|
||||
field: "createTime",
|
||||
label: "操作时间",
|
||||
render(value) {
|
||||
return useRender.renderTag(value === 0 ? '成功' : '失败', value === 0 ? '#87d068' : '#f50')
|
||||
return useRender.renderDate(value);
|
||||
},
|
||||
},
|
||||
{
|
||||
field: 'resultMsg',
|
||||
label: '响应信息',
|
||||
show(data) {
|
||||
return data && data.resultMsg && data.resultMsg !== ''
|
||||
},
|
||||
render(value) {
|
||||
return h('span', { style: { color: 'red', fontWeight: 'bold' } }, value)
|
||||
},
|
||||
field: "bizId",
|
||||
label: "业务编号",
|
||||
},
|
||||
{
|
||||
field: 'userIp',
|
||||
label: '请求ip',
|
||||
field: "userIp",
|
||||
label: "操作 IP",
|
||||
},
|
||||
{
|
||||
field: 'startTime',
|
||||
label: '请求时间',
|
||||
render(value) {
|
||||
return useRender.renderDate(value)
|
||||
},
|
||||
field: "extra",
|
||||
label: "拓展字段",
|
||||
},
|
||||
{
|
||||
field: 'requestUrl',
|
||||
label: '请求路径',
|
||||
render(_, data) {
|
||||
if (!data)
|
||||
return ''
|
||||
|
||||
const { requestMethod, requestUrl } = data
|
||||
const current = httpMethods.find(item => item.value === requestMethod.toUpperCase())
|
||||
const methodTag = current ? useRender.renderTag(requestMethod, current.color) : requestMethod
|
||||
return h('span', {}, [methodTag, requestUrl])
|
||||
},
|
||||
field: "requestMethod",
|
||||
label: "请求方法名",
|
||||
},
|
||||
{
|
||||
field: 'javaMethod',
|
||||
label: '操作方法',
|
||||
labelMinWidth: 80,
|
||||
field: "requestUrl",
|
||||
label: "请求 URL",
|
||||
},
|
||||
{
|
||||
field: 'javaMethodArgs',
|
||||
label: '请求参数',
|
||||
render(value) {
|
||||
return useRender.renderJsonPreview(value)
|
||||
},
|
||||
field: "userAgent",
|
||||
label: "浏览器 UA",
|
||||
},
|
||||
{
|
||||
field: 'userAgent',
|
||||
label: 'userAgent',
|
||||
},
|
||||
{
|
||||
field: 'duration',
|
||||
label: '请求耗时',
|
||||
render(value) {
|
||||
return useRender.renderText(value, 'ms')
|
||||
},
|
||||
},
|
||||
]
|
||||
];
|
||||
|
|
Loading…
Reference in New Issue