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