diff --git a/src/components/Table/src/hooks/useRender.ts b/src/components/Table/src/hooks/useRender.ts index a7e4eb1a1..af1bc4a48 100644 --- a/src/components/Table/src/hooks/useRender.ts +++ b/src/components/Table/src/hooks/useRender.ts @@ -5,6 +5,7 @@ import { isArray, isString } from '@/utils/is' import { DictTag } from '@/components/DictTag' import { Icon } from '@/components/Icon' import TableImg from '../components/TableImg.vue' +import { JsonPreview } from '@/components/CodeEditor' export const useRender = { /** @@ -112,5 +113,24 @@ export const useRender = { if (text) { return h(Icon, { icon: text }) } + }, + /** + * 使用JsonPreview组件 方便预览JSON + * @param json json字符串/obj + * @returns 能转为json返回JsonPreview 否则返回自身 + */ + renderJsonPreview: (json: any) => { + if (!json) return '' + if (typeof json === 'object') { + return h(JsonPreview, { data: json }) + } + if (typeof json === 'string') { + try { + const data = JSON.parse(json) + return h(JsonPreview, { data }) + } catch (e) { + return json + } + } } } diff --git a/src/views/system/dict/dict.data.ts b/src/views/system/dict/dict.data.ts index b1173b99e..1d21ed9e9 100644 --- a/src/views/system/dict/dict.data.ts +++ b/src/views/system/dict/dict.data.ts @@ -1,6 +1,74 @@ import { BasicColumn, FormSchema, useRender } from '@/components/Table' import { DICT_TYPE, getDictOptions } from '@/utils/dict' +const options = [ + { + value: '', + label: '无' + }, + { + value: 'processing', + label: '主要' + }, + { + value: 'success', + label: '成功' + }, + { + value: 'default', + label: '默认' + }, + { + value: 'warning', + label: '警告' + }, + { + value: 'error', + label: '危险' + }, + { + value: 'pink', + label: 'pink' + }, + { + value: 'red', + label: 'red' + }, + { + value: 'orange', + label: 'orange' + }, + { + value: 'green', + label: 'green' + }, + { + value: 'cyan', + label: 'cyan' + }, + { + value: 'blue', + label: 'blue' + }, + { + value: 'purple', + label: 'purple' + } +] + +function previewOptions() { + return options.map((option) => { + const { value, label } = option + if (value === '') { + return option + } + return { + label: useRender.renderTag(label, value), + value + } + }) +} + export const dataColumns: BasicColumn[] = [ { title: '字典编码', @@ -119,67 +187,15 @@ export const dataFormSchema: FormSchema[] = [ field: 'colorType', component: 'Select', componentProps: { - options: [ - { - value: '', - label: '空' - }, - { - value: 'processing', - label: '主要' - }, - { - value: 'success', - label: '成功' - }, - { - value: 'default', - label: '默认' - }, - { - value: 'warning', - label: '警告' - }, - { - value: 'error', - label: '危险' - }, - { - value: 'pink', - label: 'pink' - }, - { - value: 'red', - label: 'red' - }, - { - value: 'orange', - label: 'orange' - }, - { - value: 'green', - label: 'green' - }, - { - value: 'cyan', - label: 'cyan' - }, - { - value: 'blue', - label: 'blue' - }, - { - value: 'purple', - label: 'purple' - } - ] + options: previewOptions() } }, { label: 'CSS Class', field: 'cssClass', component: 'Input', - helpMessage: '输入hex模式的颜色,例如#108ee9' + helpMessage: '输入hex模式的颜色, 例如#108ee9', + rules: [{ required: false, message: '输入正确的16进制颜色', pattern: /^#([0-9a-fA-F]{3}){1,2}$/, trigger: 'blur' }] }, { label: '备注', diff --git a/src/views/system/operatelog/LogInfoModal.vue b/src/views/system/operatelog/LogInfoModal.vue new file mode 100644 index 000000000..63d1971b5 --- /dev/null +++ b/src/views/system/operatelog/LogInfoModal.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/src/views/system/operatelog/index.vue b/src/views/system/operatelog/index.vue index c5f28a836..93fbd1632 100644 --- a/src/views/system/operatelog/index.vue +++ b/src/views/system/operatelog/index.vue @@ -4,16 +4,32 @@ + + diff --git a/src/views/system/operatelog/operateLog.data.ts b/src/views/system/operatelog/operateLog.data.ts index 8e0473c49..d509b9e36 100644 --- a/src/views/system/operatelog/operateLog.data.ts +++ b/src/views/system/operatelog/operateLog.data.ts @@ -1,5 +1,6 @@ import { BasicColumn, FormSchema, useRender } from '@/components/Table' import { DICT_TYPE, getDictOptions } from '@/utils/dict' +import { DescItem } from '@/components/Description/index' export const columns: BasicColumn[] = [ { @@ -10,7 +11,7 @@ export const columns: BasicColumn[] = [ { title: '操作模块', dataIndex: 'module', - width: 120 + width: 200 }, { title: '操作名', @@ -20,7 +21,7 @@ export const columns: BasicColumn[] = [ { title: '操作类型', dataIndex: 'type', - width: 180, + width: 120, customRender: ({ text }) => { return useRender.renderDict(text, DICT_TYPE.SYSTEM_OPERATE_TYPE) } @@ -30,10 +31,14 @@ export const columns: BasicColumn[] = [ dataIndex: 'userNickname', width: 120 }, + // { + // title: 'userAgent', + // dataIndex: 'userAgent', + // width: 400 + // }, { - title: 'userAgent', - dataIndex: 'userAgent', - width: 400 + title: '请求路径', + dataIndex: 'requestUrl' }, { title: '操作结果', @@ -43,14 +48,6 @@ export const columns: BasicColumn[] = [ return useRender.renderTag(text === 0 ? '成功' : '失败', text === 0 ? '#87d068' : '#f50') } }, - { - title: '操作日期', - dataIndex: 'startTime', - width: 180, - customRender: ({ text }) => { - return useRender.renderDate(text) - } - }, { title: '执行时长', dataIndex: 'duration', @@ -58,6 +55,14 @@ export const columns: BasicColumn[] = [ customRender: ({ text }) => { return useRender.renderText(text, 'ms') } + }, + { + title: '操作日期', + dataIndex: 'startTime', + width: 180, + customRender: ({ text }) => { + return useRender.renderDate(text) + } } ] @@ -102,3 +107,92 @@ export const searchFormSchema: FormSchema[] = [ colProps: { span: 8 } } ] + +const httpMethods = [ + { value: 'GET', color: '#108ee9' }, + { value: 'POST', color: '#2db7f5' }, + { value: 'PUT', color: 'warning' }, + { value: 'DELETE', color: '#f50' } +] + +export const infoSchema: DescItem[] = [ + { + field: 'module', + label: '操作模块' + }, + { + field: 'name', + label: '操作名' + }, + { + field: 'userNickname', + label: '操作人', + render(_, data) { + const { userNickname, userId } = data + return useRender.renderText(userNickname, 'uid: ' + userId) + } + }, + { + field: 'resultCode', + label: '请求结果', + render(value) { + return useRender.renderTag(value === 0 ? '成功' : '失败', value === 0 ? '#87d068' : '#f50') + } + }, + { + field: 'resultMsg', + label: '响应信息', + show(data) { + return data && data.resultMsg && data.resultMsg !== '' + } + }, + { + field: 'userIp', + label: '请求ip' + }, + { + field: 'startTime', + label: '请求时间', + render(value) { + return useRender.renderDate(value) + } + }, + { + field: 'requestUrl', + label: '请求路径' + }, + { + field: 'requestMethod', + label: '请求方法', + render(value) { + const current = httpMethods.find((item) => item.value === value.toUpperCase()) + if (current) { + return useRender.renderTag(value, current.color) + } + return value + } + }, + { + field: 'javaMethod', + label: '操作方法', + labelMinWidth: 80 + }, + { + field: 'javaMethodArgs', + label: '请求参数', + render(value) { + return useRender.renderJsonPreview(value) + } + }, + { + field: 'userAgent', + label: 'userAgent' + }, + { + field: 'duration', + label: '请求耗时', + render(value) { + return useRender.renderText(value, 'ms') + } + } +]