From 2ef0cf5bd5cc960ba422b9063d7137d9ba70bc69 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期四, 14 十一月 2024 16:25:26 +0800 Subject: [PATCH] !154 refactor: 重构操作日志详情样式 Merge pull request !154 from 玲娜贝er/dev --- package.json | 5 + src/views/monitor/operlog/index.vue | 57 ++----------------- src/views/monitor/operlog/oper-info-dialog.vue | 111 +++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 53 deletions(-) diff --git a/package.json b/package.json index e67d60f..9eaf743 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "vue": "3.4.34", "vue-cropper": "1.1.1", "vue-i18n": "9.10.2", + "vue-json-pretty": "2.4.0", "vue-router": "4.3.2", "vue-types": "5.1.1", "vxe-table": "4.5.22" @@ -66,10 +67,10 @@ "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-define-config": "2.1.0", + "eslint-plugin-import": "2.29.1", + "eslint-plugin-node": "11.1.0", "eslint-plugin-prettier": "5.1.3", "eslint-plugin-promise": "6.1.1", - "eslint-plugin-node": "11.1.0", - "eslint-plugin-import": "2.29.1", "eslint-plugin-vue": "9.23.0", "fast-glob": "3.3.2", "postcss": "8.4.36", diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue index ed0d755..fcecab7 100644 --- a/src/views/monitor/operlog/index.vue +++ b/src/views/monitor/operlog/index.vue @@ -123,56 +123,14 @@ <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 鎿嶄綔鏃ュ織璇︾粏 --> - <el-dialog v-model="dialog.visible" title="鎿嶄綔鏃ュ織璇︾粏" width="700px" append-to-body> - <el-form :model="form" label-width="100px"> - <el-row> - <el-col :span="24"> - <el-form-item label="鐧诲綍淇℃伅锛�">{{ form.operName }} / {{ form.deptName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="璇锋眰淇℃伅锛�">{{ form.requestMethod }} {{ form.operUrl }}</el-form-item> - </el-col> - <el-col :span="12"> - <el-form-item label="鎿嶄綔妯″潡锛�">{{ form.title }} / {{ typeFormat(form) }}</el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="鎿嶄綔鏂规硶锛�">{{ form.method }}</el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="璇锋眰鍙傛暟锛�">{{ form.operParam }}</el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item label="杩斿洖鍙傛暟锛�">{{ form.jsonResult }}</el-form-item> - </el-col> - <el-col :span="6"> - <el-form-item label="鎿嶄綔鐘舵�侊細"> - <div v-if="form.status === 0">姝e父</div> - <div v-else-if="form.status === 1">澶辫触</div> - </el-form-item> - </el-col> - <el-col :span="8"> - <el-form-item label="娑堣�楁椂闂达細">{{ form.costTime }}姣</el-form-item> - </el-col> - <el-col :span="10"> - <el-form-item label="鎿嶄綔鏃堕棿锛�">{{ parseTime(form.operTime) }}</el-form-item> - </el-col> - <el-col :span="24"> - <el-form-item v-if="form.status === 1" label="寮傚父淇℃伅锛�">{{ form.errorMsg }}</el-form-item> - </el-col> - </el-row> - </el-form> - <template #footer> - <div class="dialog-footer"> - <el-button @click="dialog.visible = false">鍏� 闂�</el-button> - </div> - </template> - </el-dialog> + <OperInfoDialog ref="operInfoDialogRef" /> </div> </template> <script setup name="Operlog" lang="ts"> import { list, delOperlog, cleanOperlog } from '@/api/monitor/operlog'; import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types'; +import OperInfoDialog from './oper-info-dialog.vue'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict('sys_oper_type', 'sys_common_status')); @@ -188,11 +146,6 @@ const operLogTableRef = ref<ElTableInstance>(); const queryFormRef = ref<ElFormInstance>(); - -const dialog = reactive<DialogOption>({ - visible: false, - title: '' -}); const data = reactive<PageData<OperLogForm, OperLogQuery>>({ form: { @@ -267,11 +220,13 @@ queryParams.value.isAsc = column.order; getList(); }; + +const operInfoDialogRef = ref<InstanceType<typeof OperInfoDialog>>(); /** 璇︾粏鎸夐挳鎿嶄綔 */ const handleView = (row: OperLogVO) => { - dialog.visible = true; - form.value = row; + operInfoDialogRef.value.openDialog(row); }; + /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: OperLogVO) => { const operIds = row?.operId || ids.value; diff --git a/src/views/monitor/operlog/oper-info-dialog.vue b/src/views/monitor/operlog/oper-info-dialog.vue new file mode 100644 index 0000000..fd620ae --- /dev/null +++ b/src/views/monitor/operlog/oper-info-dialog.vue @@ -0,0 +1,111 @@ +<template> + <el-dialog v-model="open" title="鎿嶄綔鏃ュ織璇︾粏" width="700px" append-to-body close-on-click-modal @closed="info = null"> + <el-descriptions v-if="info" :column="1" border> + <el-descriptions-item label="鎿嶄綔鐘舵��"> + <template #default> + <el-tag v-if="info.status === 0" type="success">姝e父</el-tag> + <el-tag v-else-if="info.status === 1" type="danger">澶辫触</el-tag> + </template> + </el-descriptions-item> + <el-descriptions-item label="鐧诲綍淇℃伅"> + <template #default> {{ info.operName }} / {{ info.deptName }} / {{ info.operIp }} / {{ info.operLocation }} </template> + </el-descriptions-item> + <el-descriptions-item label="璇锋眰淇℃伅"> + <template #default> {{ info.requestMethod }} {{ info.operUrl }} </template> + </el-descriptions-item> + <el-descriptions-item label="鎿嶄綔妯″潡"> + <template #default> {{ info.title }} / {{ typeFormat(info) }} </template> + </el-descriptions-item> + <el-descriptions-item label="鎿嶄綔鏂规硶"> + <template #default> + {{ info.method }} + </template> + </el-descriptions-item> + <el-descriptions-item label="璇锋眰鍙傛暟"> + <template #default> + <div class="max-h-300px overflow-y-auto"> + <VueJsonPretty :data="formatToJsonObject(info.operParam)" /> + </div> + </template> + </el-descriptions-item> + <el-descriptions-item label="杩斿洖鍙傛暟"> + <template #default> + <div class="max-h-300px overflow-y-auto"> + <VueJsonPretty :data="formatToJsonObject(info.jsonResult)" /> + </div> + </template> + </el-descriptions-item> + <el-descriptions-item label="娑堣�楁椂闂�"> + <template #default> + <span> {{ info.costTime }}ms </span> + </template> + </el-descriptions-item> + <el-descriptions-item label="鎿嶄綔鏃堕棿"> + <template #default> {{ parseTime(info.operTime) }}</template> + </el-descriptions-item> + <el-descriptions-item v-if="info.status === 1" label="寮傚父淇℃伅"> + <template #default> + <span class="text-danger"> {{ info.errorMsg }}</span> + </template> + </el-descriptions-item> + </el-descriptions> + </el-dialog> +</template> + +<script setup lang="ts"> +import type { OperLogForm } from '@/api/monitor/operlog/types'; +import VueJsonPretty from 'vue-json-pretty'; +import 'vue-json-pretty/lib/styles.css'; + +const open = ref(false); +const info = ref<OperLogForm | null>(null); +function openDialog(row: OperLogForm) { + info.value = row; + open.value = true; +} + +function closeDialog() { + open.value = false; +} + +defineExpose({ + openDialog, + closeDialog +}); + +/** + * json杞负瀵硅薄 + * @param data 鍘熷鏁版嵁 + */ +function formatToJsonObject(data: string) { + try { + return JSON.parse(data); + } catch (error) { + return data; + } +} + +/** + * 瀛楀吀淇℃伅 + */ +const { proxy } = getCurrentInstance() as ComponentInternalInstance; +const { sys_oper_type } = toRefs<any>(proxy?.useDict('sys_oper_type')); +const typeFormat = (row: OperLogForm) => { + return proxy?.selectDictLabel(sys_oper_type.value, row.businessType); +}; +</script> + +<style scoped> +/** +label瀹藉害鍥哄畾 +*/ +:deep(.el-descriptions__label) { + min-width: 100px; +} +/** +鏂囧瓧瓒呰繃 鎹㈣鏄剧ず +*/ +:deep(.el-descriptions__content) { + max-width: 300px; +} +</style> -- Gitblit v1.9.3