Compare commits

...

3 Commits

  1. 11
      src/api/system/systemLog.ts
  2. 4
      src/components/data/complaintformdialog.vue
  3. 199
      src/components/negative/action-history.vue
  4. 2
      src/components/negative/description.vue
  5. 8
      src/views/data/ComplaintCollection.vue
  6. 8
      src/views/data/ComplaintCollectionSource.vue
  7. 8
      src/views/data/ComplaintCollection_12389ts.vue
  8. 8
      src/views/data/ComplaintCollection_gabxf.vue
  9. 8
      src/views/data/ComplaintCollection_gjxf.vue
  10. 8
      src/views/data/ComplaintCollection_jzxx.vue
  11. 8
      src/views/data/ComplaintCollection_ldxj.vue
  12. 314
      src/views/system/SystemLog.vue

11
src/api/system/systemLog.ts

@ -0,0 +1,11 @@
import request from "@/api/request";
/**
* 访
*/
export function listSystemLog(query) {
return request.get({
url: "/systemLog",
query,
});
}

4
src/components/data/complaintformdialog.vue

@ -231,7 +231,7 @@
</el-row> </el-row>
<!-- 办理方式 --> <!-- 办理方式 -->
<el-row> <el-row v-if="false">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="办理方式" prop="handleMethod"> <el-form-item label="办理方式" prop="handleMethod">
<el-radio-group v-model="formData.handleMethod" clearable> <el-radio-group v-model="formData.handleMethod" clearable>
@ -515,7 +515,7 @@
</el-row> </el-row>
<!-- 办理方式 --> <!-- 办理方式 -->
<el-row> <el-row v-if="false">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="办理方式" prop="handleMethod"> <el-form-item label="办理方式" prop="handleMethod">
<el-radio-group v-model="formData.handleMethod" clearable> <el-radio-group v-model="formData.handleMethod" clearable>

199
src/components/negative/action-history.vue

@ -14,6 +14,11 @@
<span class="mr-8">{{ item.crtName }}</span> <span class="mr-8">{{ item.crtName }}</span>
<span class="text-primary mr-8 text-bold">{{ item.actionName }}</span> <span class="text-primary mr-8 text-bold">{{ item.actionName }}</span>
<span style="color: #9e9e9e; cursor: pointer" @click="handleShowDetai(item)">详情</span> <span style="color: #9e9e9e; cursor: pointer" @click="handleShowDetai(item)">详情</span>
<span
v-if="getReturnComparison(item, index)"
class="compare-link"
@click="handleShowComparison(item, index)"
>对比上一步</span>
</div> </div>
<div <div
class="flow-time" class="flow-time"
@ -47,6 +52,39 @@
</div> </div>
</div> </div>
</el-dialog> </el-dialog>
<el-dialog title="核查办理内容对比" width="70vw" v-model="comparisonShow">
<div v-if="activeComparison" class="comparison-dialog">
<div class="comparison-return-info">
<span>退回时间{{ activeComparison.returnHistory.crtTime }}</span>
<span>退回人员{{ activeComparison.returnHistory.crtName || '无' }}</span>
<span>退回意见{{ activeComparison.returnOpinion || '无' }}</span>
</div>
<el-table v-if="!activeComparison.unavailable" :data="activeComparison.rows" border>
<el-table-column prop="label" label="核查办理字段" width="150" />
<el-table-column prop="before" :label="activeComparison.beforeLabel" min-width="260">
<template #default="scope">
<div
class="comparison-content"
:class="{ 'comparison-changed': scope.row.changed }"
>{{ scope.row.before }}</div>
</template>
</el-table-column>
<el-table-column prop="after" :label="activeComparison.afterLabel" min-width="260">
<template #default="scope">
<div
class="comparison-content"
:class="{ 'comparison-changed': scope.row.changed }"
>{{ scope.row.after }}</div>
</template>
</el-table-column>
</el-table>
<el-empty
v-else
description="无法获取核查办理内容"
/>
</div>
</el-dialog>
</template> </template>
<script setup> <script setup>
import { formatTimeText } from "@/utils/util"; import { formatTimeText } from "@/utils/util";
@ -56,6 +94,62 @@ import useCatchStore from "@/stores/modules/catch.ts";
const actionHistory = inject('actionHistory') const actionHistory = inject('actionHistory')
const negative = inject('negative') const negative = inject('negative')
const show = ref(false) const show = ref(false)
const comparisonShow = ref(false)
const VERIFY_FIELDS = [
{ key: 'checkStatusName', label: '核查结论' },
{ key: 'isRectifyName', label: '是否整改' },
{ key: 'checkStatusDesc', label: '问题核查情况' },
{ key: 'rectifyDesc', label: '问题整改情况' },
]
const returnComparisonMap = computed(() => {
const comparisonMap = new Map()
let latestSnapshot = null
let pendingReturn = null
;(actionHistory.value || []).forEach((item, index) => {
const historyJson = parseHistoryJson(item)
const actionKey = historyJson?.actionKey
const snapshot = getVerifySnapshot(historyJson?.data)
const previousSnapshot = latestSnapshot
if (snapshot) {
latestSnapshot = snapshot
}
if (isReturnAction(actionKey)) {
pendingReturn = {
actionKey,
before: latestSnapshot,
history: item,
opinion: historyJson?.data?.comments,
}
} else if (actionKey === 'update_verify' && snapshot) {
if (pendingReturn) {
comparisonMap.set(getHistoryKey(item, index), buildComparison(
previousSnapshot,
latestSnapshot,
{
returnHistory: pendingReturn.history,
returnOpinion: pendingReturn.opinion,
beforeLabel: '修改前',
afterLabel: '修改后',
},
))
}
} else if (pendingReturn && isResubmitAction(pendingReturn.actionKey, actionKey)) {
comparisonMap.set(getHistoryKey(item, index), buildComparison(
pendingReturn.before,
latestSnapshot,
{
returnHistory: pendingReturn.history,
returnOpinion: pendingReturn.opinion,
beforeLabel: '退回前',
afterLabel: '再次提交',
},
))
}
})
return comparisonMap
})
function getConsumingTime(crtTime, index) { function getConsumingTime(crtTime, index) {
if (index === 0) { if (index === 0) {
@ -83,11 +177,90 @@ const getOvertimeTip = (item) => {
const activeHistory = ref({}) const activeHistory = ref({})
function handleShowDetai(item) { function handleShowDetai(item) {
activeHistory.value = item activeHistory.value = item
if (item.dataJson) { const historyJson = parseHistoryJson(item)
activeHistory.value.json = JSON.parse(item.dataJson) if (historyJson) {
activeHistory.value.json = historyJson
} }
show.value = true show.value = true
} }
function parseHistoryJson(item) {
if (!item?.dataJson) {
return null
}
try {
return JSON.parse(item.dataJson)
} catch {
return null
}
}
function getVerifySnapshot(data) {
if (!data || !VERIFY_FIELDS.some((field) => Object.prototype.hasOwnProperty.call(data, field.key))) {
return null
}
return VERIFY_FIELDS.reduce((snapshot, field) => {
snapshot[field.key] = data[field.key]
return snapshot
}, {})
}
function isReturnAction(actionKey) {
return actionKey === 'second_approve_return' || actionKey === 'first_approve_return'
}
function isResubmitAction(returnActionKey, actionKey) {
if (returnActionKey === 'second_approve_return') {
return actionKey === 'apply_completion'
}
if (returnActionKey === 'first_approve_return') {
return actionKey === 'second_approve' || actionKey === 'apply_completion'
}
return false
}
function getHistoryKey(item, index) {
return item.historyId || `${item.crtTime}-${index}`
}
function displayValue(value) {
return value === null || value === undefined || value === '' ? '无' : value
}
function buildComparison(beforeSnapshot, afterSnapshot, context) {
if (!beforeSnapshot || !afterSnapshot) {
return {
...context,
rows: [],
unavailable: true,
}
}
const rows = VERIFY_FIELDS.map((field) => {
const before = displayValue(beforeSnapshot[field.key])
const after = displayValue(afterSnapshot[field.key])
return {
label: field.label,
before,
after,
changed: before !== after,
}
})
return {
...context,
rows,
unavailable: false,
}
}
function getReturnComparison(item, index) {
return returnComparisonMap.value.get(getHistoryKey(item, index))
}
const activeComparison = ref(null)
function handleShowComparison(item, index) {
activeComparison.value = getReturnComparison(item, index)
comparisonShow.value = true
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.flow { .flow {
@ -134,6 +307,11 @@ function handleShowDetai(item) {
transform: translateY(-50%); transform: translateY(-50%);
} }
} }
.compare-link {
color: var(--primary-color);
cursor: pointer;
margin-left: 8px;
}
& > div:first-child .flow-info::before { & > div:first-child .flow-info::before {
width: 12px; width: 12px;
height: 12px; height: 12px;
@ -141,4 +319,21 @@ function handleShowDetai(item) {
} }
} }
} }
.comparison-dialog {
.comparison-return-info {
display: flex;
flex-wrap: wrap;
gap: 12px 24px;
margin-bottom: 16px;
color: #666;
}
.comparison-content {
white-space: pre-wrap;
word-break: break-all;
}
.comparison-changed {
color: #f56c6c;
font-weight: 600;
}
}
</style> </style>

2
src/components/negative/description.vue

@ -73,7 +73,7 @@
<label>标签</label> <label>标签</label>
<span>{{ getDictLabel(dict.sfssTags, negative.currentRow.tag) }}</span> <span>{{ getDictLabel(dict.sfssTags, negative.currentRow.tag) }}</span>
</div> </div>
<div class="col col-6" v-if="negative.sourceType === '2' && negative.currentRow?.handleMethod"> <div class="col col-6" v-if="false">
<label>办理方式</label> <label>办理方式</label>
<span>{{ getDictLable(dict.handleMethodType, negative.currentRow.handleMethod) }}</span> <span>{{ getDictLable(dict.handleMethodType, negative.currentRow.handleMethod) }}</span>
</div> </div>

8
src/views/data/ComplaintCollection.vue

@ -61,7 +61,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -179,6 +179,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -367,7 +371,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

8
src/views/data/ComplaintCollectionSource.vue

@ -67,7 +67,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -175,6 +175,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -296,7 +300,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

8
src/views/data/ComplaintCollection_12389ts.vue

@ -67,7 +67,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -175,6 +175,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -296,7 +300,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

8
src/views/data/ComplaintCollection_gabxf.vue

@ -67,7 +67,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -175,6 +175,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -296,7 +300,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

8
src/views/data/ComplaintCollection_gjxf.vue

@ -67,7 +67,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -175,6 +175,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -296,7 +300,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

8
src/views/data/ComplaintCollection_jzxx.vue

@ -67,7 +67,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -172,6 +172,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -293,7 +297,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

8
src/views/data/ComplaintCollection_ldxj.vue

@ -67,7 +67,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6" v-if="false">
<el-form-item label="办理方式"> <el-form-item label="办理方式">
<el-select <el-select
v-model="query.handleMethod" v-model="query.handleMethod"
@ -175,6 +175,10 @@
multiple multiple
collapse-tags collapse-tags
> >
<el-option
value="__EMPTY__"
label="空"
/>
<el-option <el-option
v-for="item in dict.sfssTags" v-for="item in dict.sfssTags"
:key="item.id" :key="item.id"
@ -296,7 +300,7 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="办理方式" width="100"> <el-table-column label="办理方式" width="100" v-if="false">
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.handleMethodType, row.handleMethod) }} {{ getDictLabel(dict.handleMethodType, row.handleMethod) }}
</template> </template>

314
src/views/system/SystemLog.vue

@ -0,0 +1,314 @@
<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="100">
<el-row :gutter="12">
<el-col :span="6">
<el-form-item label="请求人">
<el-input
v-model="query.requester"
placeholder="请输入登录名或姓名"
clearable
@keyup.enter="search"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="接口地址">
<el-input
v-model="query.requestUri"
placeholder="请输入接口地址"
clearable
@keyup.enter="search"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="访问方式">
<el-select
v-model="query.requestMethod"
placeholder="请选择访问方式"
clearable
>
<el-option
v-for="method in requestMethods"
:key="method"
:label="method"
:value="method"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="来源IP">
<el-input
v-model="query.sourceIp"
placeholder="请输入来源IP"
clearable
@keyup.enter="search"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="12">
<el-col :span="6">
<el-form-item label="执行结果">
<el-select
v-model="query.status"
placeholder="请选择执行结果"
clearable
>
<el-option label="成功" :value="1" />
<el-option label="失败" :value="0" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="日志时间">
<el-date-picker
v-model="query.logTimeRange"
type="datetimerange"
value-format="YYYY-MM-DD HH:mm:ss"
format="YYYY-MM-DD HH:mm:ss"
range-separator="~"
start-placeholder="开始时间"
end-placeholder="结束时间"
clearable
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex end">
<el-button type="primary" @click="search">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询
</el-button>
<el-button @click="reset">重置</el-button>
</div>
</header>
<el-tabs v-model="activeTab" @tab-change="handleTabChange">
<el-tab-pane label="登录日志" name="login" />
<el-tab-pane label="操作日志" name="operation" />
</el-tabs>
<div class="table-container">
<el-table :data="logs">
<el-table-column label="请求人" min-width="160">
<template #default="{ row }">
{{ formatRequester(row) }}
</template>
</el-table-column>
<el-table-column
label="接口地址"
prop="requestUri"
min-width="220"
show-overflow-tooltip
/>
<el-table-column
label="访问方式"
prop="requestMethod"
width="100"
align="center"
/>
<el-table-column
label="来源IP"
prop="sourceIp"
min-width="140"
show-overflow-tooltip
/>
<el-table-column label="请求参数" min-width="220">
<template #default="{ row }">
<span class="summary-text">{{ formatSummary(row.requestParams) }}</span>
</template>
</el-table-column>
<el-table-column label="执行耗时" width="110" align="center">
<template #default="{ row }">
{{ row.executionTime }} ms
</template>
</el-table-column>
<el-table-column label="执行结果" width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.status === 1 ? 'success' : 'danger'">
{{ row.status === 1 ? "成功" : "失败" }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="日志时间"
prop="logTime"
width="180"
/>
<el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }">
<el-button type="primary" link @click="showDetail(row)">
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
v-model:page-size="query.size"
v-model:current-page="query.current"
:page-sizes="[10, 20, 50]"
:total="total"
layout="total, sizes, prev, pager, next"
@size-change="handleSizeChange"
@current-change="getList"
/>
</div>
</div>
<el-dialog v-model="detailVisible" title="系统日志详情" width="760px">
<el-descriptions :column="2" border>
<el-descriptions-item label="请求人">
{{ formatRequester(activeLog) }}
</el-descriptions-item>
<el-descriptions-item label="日志时间">
{{ activeLog.logTime || "-" }}
</el-descriptions-item>
<el-descriptions-item label="接口地址" :span="2">
{{ activeLog.requestUri || "-" }}
</el-descriptions-item>
<el-descriptions-item label="访问方式">
{{ activeLog.requestMethod || "-" }}
</el-descriptions-item>
<el-descriptions-item label="来源IP">
{{ activeLog.sourceIp || "-" }}
</el-descriptions-item>
<el-descriptions-item label="执行耗时">
{{ activeLog.executionTime ?? 0 }} ms
</el-descriptions-item>
<el-descriptions-item label="执行结果">
<el-tag :type="activeLog.status === 1 ? 'success' : 'danger'">
{{ activeLog.status === 1 ? "成功" : "失败" }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="请求参数" :span="2">
<pre class="detail-content">{{ activeLog.requestParams || "-" }}</pre>
</el-descriptions-item>
<el-descriptions-item label="异常信息" :span="2">
<pre class="detail-content error-content">{{ activeLog.errorMessage || "-" }}</pre>
</el-descriptions-item>
</el-descriptions>
<template #footer>
<el-button @click="detailVisible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { listSystemLog } from "@/api/system/systemLog";
const requestMethods = ["GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"];
const createDefaultQuery = () => ({
current: 1,
size: 10,
requester: undefined,
requestUri: undefined,
requestMethod: undefined,
sourceIp: undefined,
status: undefined,
logTimeRange: [],
});
const query = ref(createDefaultQuery());
const logs = ref([]);
const total = ref(0);
const detailVisible = ref(false);
const activeLog = ref({});
const activeTab = ref("login");
/**
* 将页面时间范围拆分成后端接收的开始结束时间参数
*/
function buildQueryParams() {
const { logTimeRange, ...params } = query.value;
params.logType = activeTab.value;
if (logTimeRange?.length === 2) {
params.startTime = logTimeRange[0];
params.endTime = logTimeRange[1];
}
return params;
}
function getList() {
listSystemLog(buildQueryParams()).then((data) => {
logs.value = data.records;
total.value = data.total;
});
}
function search() {
query.value.current = 1;
getList();
}
function reset() {
query.value = createDefaultQuery();
getList();
}
function handleSizeChange() {
query.value.current = 1;
getList();
}
function handleTabChange() {
query.value.current = 1;
getList();
}
function formatRequester(row = {}) {
if (row.nickName && row.userName) {
return `${row.nickName}${row.userName}`;
}
return row.nickName || row.userName || "匿名/外部调用";
}
function formatSummary(value) {
if (!value) {
return "-";
}
return value.length > 60 ? `${value.slice(0, 60)}...` : value;
}
function showDetail(row) {
activeLog.value = row;
detailVisible.value = true;
}
getList();
</script>
<style lang="scss" scoped>
.summary-text {
display: inline-block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
vertical-align: middle;
}
.detail-content {
margin: 0;
max-height: 260px;
overflow: auto;
white-space: pre-wrap;
overflow-wrap: anywhere;
font-family: inherit;
line-height: 1.6;
}
.error-content {
color: var(--el-color-danger);
}
</style>
Loading…
Cancel
Save