<template> <div class="app-container"> <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" > <el-form-item label="API" prop="apiName"> <el-input v-model="queryParams.apiName" placeholder="请输入API" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="请求方" prop="requestFrom"> <el-input v-model="queryParams.requestFrom" placeholder="请输入请求方" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="响应方" prop="responseBy"> <el-input v-model="queryParams.responseBy" placeholder="请输入响应方" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="仓库" prop="status"> <el-select v-model="queryParams.warehouseCode" placeholder="仓库" clearable size="small" style="width: 240px" > <el-option v-for="item in warehouseOptions" :key="item.code" :label="item.name" :value="item.code" /> </el-select> </el-form-item> <el-form-item label="httpCode" prop="httpCode"> <el-select v-model="queryParams.httpCode" placeholder="httpCode" clearable size="small" style="width: 240px" > <el-option v-for="dict in httpOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" /> </el-select> </el-form-item> <el-form-item label="retCode" prop="retCode"> <el-select v-model="queryParams.retCode" placeholder="retCode" clearable size="small" style="width: 240px" > <el-option v-for="dict in retOptions" :key="dict.dictValue" :label="dict.dictLabel" :value="dict.dictValue" /> </el-select> </el-form-item> <el-form-item label="异常" prop="hasException"> <el-input v-model="queryParams.hasException" placeholder="请输入异常" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="响应时间>" prop="duration"> <el-input v-model="queryParams.duration" placeholder="1000毫秒" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="请求时间"> <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" ></el-date-picker> </el-form-item> <el-form-item> <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery" >搜索</el-button > <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" >重置</el-button > </el-form-item> </el-form> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading" >导出</el-button > </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :col-data="colData" @selectData="selectData" ></right-toolbar> </el-row> <el-table v-loading="loading" :data="list" ref="table"> <el-table-column fixed="left" label="操作" align="center" class-name="small-padding fixed-width" v-if="colData[0].istrue" > <template slot-scope="scope"> <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row, scope.index)" >详细</el-button > </template> </el-table-column> <el-table-column label="id" width="55" align="center" prop="id" v-if="colData[1].istrue" /> <el-table-column label="仓库" align="center" prop="warehouseCode" v-if="colData[2].istrue" width="150" :show-overflow-tooltip="true" > <template slot-scope="scope"> {{ warehouseCodeFormat(scope.row, scope.column) }} </template> </el-table-column> <el-table-column label="from" align="center" prop="requestFrom" v-if="colData[3].istrue" /> <el-table-column label="API" align="center" prop="apiName" v-if="colData[4].istrue" width="130" /> <el-table-column label="to" align="center" prop="responseBy" v-if="colData[5].istrue" /> <el-table-column label="http" align="center" prop="httpCode" v-if="colData[6].istrue" > <template slot-scope="scope"> <span :style="{ color: scope.row.httpCode == 200 ? 'green' : 'red' }" >{{ scope.row.httpCode }}</span > </template> </el-table-column> <el-table-column label="ret" align="center" prop="retCode" v-if="colData[7].istrue" > <template slot-scope="scope"> <span :style="{ color: scope.row.retCode == 200 ? 'green' : 'red' }" >{{ scope.row.retCode }}</span > </template> </el-table-column> <el-table-column label="请求时间" align="center" prop="requestTime" width="160" v-if="colData[8].istrue" > <template slot-scope="scope"> <span>{{ parseTime(scope.row.requestTime) }}</span> </template> </el-table-column> <el-table-column label="耗时" align="center" prop="duration" v-if="colData[9].istrue" > <template slot-scope="scope"> <span :style="{ color: scope.row.duration > 1000 ? 'red' : '' }">{{ scope.row.duration }}</span> </template> </el-table-column> <el-table-column label="请求内容" align="center" prop="requestBody" :show-overflow-tooltip="true" v-if="colData[10].istrue" width="350" /> <el-table-column label="响应内容" align="center" prop="responseBody" :show-overflow-tooltip="true" v-if="colData[11].istrue" width="350" /> <el-table-column label="异常信息" align="center" prop="exceptionMsg" :show-overflow-tooltip="true" v-if="colData[12].istrue" > <template slot-scope="scope"> <span style="color: red">{{ scope.row.exceptionMsg }}</span> </template> </el-table-column> </el-table> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> <!-- 接口日志详细 --> <el-dialog title="接口调用日志详细" :visible.sync="open" width="700px" append-to-body > <el-form ref="form" :model="form" label-width="100px" size="mini"> <el-row> <el-col :span="12"> <el-form-item label="ID:">{{ form.id }}</el-form-item> <el-form-item label="接口名:">{{ form.apiName }}</el-form-item> </el-col> <el-col :span="12"> <el-form-item label="请求方ip:">{{ form.ip }}</el-form-item> <el-form-item label="调用方向:" >{{ form.requestFrom }} -> {{ form.responseBy }}</el-form-item > </el-col> <el-col :span="12"> <el-form-item label="请求方式:">{{ form.apiMethod }}</el-form-item> <el-form-item label="接口地址:">{{ form.url }}</el-form-item> </el-col> <el-col :span="12"> <el-form-item label="请求时间:">{{ parseTime(form.requestTime) }}</el-form-item> <el-form-item label="耗时:" :class="[form.duration > 1000 ? 'field-red' : '']" ><span :style="{ color: form.duration > 1000 ? 'red' : '' }">{{ form.duration }}</span></el-form-item > </el-col> <el-col :span="12"> <el-form-item label="HttpCode:" :class="[form.httpCode == 200 ? 'field-green' : 'field-red']" > <span :style="{ color: form.httpCode == 200 ? 'green' : 'red' }" >{{ form.httpCode }}</span ></el-form-item > <el-form-item label="RetCode:" :class="[form.RetCode == 200 ? 'field-green' : 'field-red']" ><span :style="{ color: form.RetCode == 200 ? 'green' : 'red' }" >{{ form.retCode }}</span ></el-form-item > </el-col> <el-col :span="18"> <el-form-item label="请求头:" >{{ form.requestHeader }} </el-form-item> </el-col> <el-col :span="6"> <el-form-item> <el-button class="request-header" :data-clipboard-text="form.requestHeader" type="info" size="mini" @click="copy('.request-header')" >复制</el-button ></el-form-item > </el-col> <el-col :span="24"> <el-form-item label="响应头:">{{ form.responseHeader }}</el-form-item> </el-col> <el-col :span="18"> <el-form-item label="请求内容:">{{ form.requestBody }}</el-form-item> </el-col> <el-col :span="6"> <el-form-item> <el-button class="request-body" :data-clipboard-text="form.requestBody" type="info" size="mini" @click="copy('.request-body')" >复制</el-button ></el-form-item > </el-col> <el-col :span="24"> <el-form-item label="响应内容:">{{ form.responseBody }}</el-form-item> </el-col> <el-col :span="18"> <el-form-item label="异常信息:" :class="[form.exceptionMsg ? 'field-red' : '']" >{{ form.exceptionMsg }}</el-form-item > </el-col> <el-col :span="6"> <el-form-item> <el-button class="exception-msg" :data-clipboard-text="form.exceptionMsg" type="info" size="mini" @click="copy('.exception-msg')" >复制</el-button ></el-form-item > </el-col> </el-row> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="open = false">关 闭</el-button> </div> </el-dialog> </div> </template> <script> import { listApi, getApi } from "@/api/system/apilog"; import { getWarehouseByUserCode } from "@/api/system/warehouse"; import Clipboard from "clipboard"; export default { name: "Operlog", data() { return { // 导出加载状态 exportLoading: false, // 遮罩层 loading: true, // 显示搜索条件 showSearch: true, // 总条数 total: 0, // 表格数据 list: [], // 是否显示弹出层 open: false, // 日期范围 dateRange: [], // 表单参数 form: {}, // 查询参数 queryParams: { pageNum: 1, pageSize: 10, apiName: undefined, requestFrom: undefined, responseBy: undefined, duration: undefined, warehouseCode: undefined, httpCode: undefined, retCode: undefined, hasException: undefined, }, // 仓库下拉数据 warehouseOptions: [], // httpCode数据字典 httpOptions: [], // retCode数据字典 retOptions: [], // istrue属性存放列的状态 colData: [ { title: "操作", istrue: true, disabled: true }, { title: "id", istrue: false }, { title: "仓库", istrue: false }, { title: "from", istrue: true }, { title: "API", istrue: true }, { title: "to", istrue: true }, { title: "http", istrue: true }, { title: "ret", istrue: true }, { title: "请求时间", istrue: true }, { title: "耗时", istrue: true }, { title: "请求内容", istrue: true }, { title: "响应内容", istrue: true }, { title: "异常信息", istrue: true }, ], }; }, created() { this.getList(); this.getDicts("httpCode").then((response) => { this.httpOptions = response.data; }); this.getDicts("retCode").then((response) => { this.retOptions = response.data; }); getWarehouseByUserCode(this.$store.getters.name).then((response) => { this.warehouseOptions = response.data; }); }, beforeUpdate() { this.$nextTick(() => { this.$refs["table"].doLayout(); }); }, methods: { /** 查询接口日志 */ getList() { this.loading = true; listApi(this.addDateRange(this.queryParams, this.dateRange)).then( (response) => { this.list = response.rows; this.total = response.total; this.loading = false; } ); }, // 仓库字典翻译 warehouseCodeFormat(row, column) { return this.selectCommonLabel(this.warehouseOptions, row.warehouseCode); }, // 复制 copy(value) { const clipboard = new Clipboard(value); clipboard.on("success", (e) => { // 成功提示 this.msgSuccess("复制成功"); // 释放内存 e.clearSelection(); }); // 浏览器不支持 clipboard.on("error", (e) => { // 释放内存 clipboard.destroy(); }); }, /** 搜索按钮操作 */ handleQuery() { this.queryParams.pageNum = 1; this.getList(); }, /** 重置按钮操作 */ resetQuery() { this.dateRange = []; this.resetForm("queryForm"); this.handleQuery(); }, /** 详细按钮操作 */ handleView(row) { this.open = true; getApi(row.id).then((response) => { this.form = response.data; }); }, /** 导出按钮操作 */ handleExport() { this.exportLoading = true; this.download( "system/apiLog/export", { ...this.queryParams, }, `接口日志_${this.formatTime(new Date(),'{y}-{m}-{d}')}.xlsx` ); }, /** 表格切换字段显示操作 */ selectData(val) { if (val) { this.colData.filter((i) => { if (val.indexOf(i.title) !== -1) { i.istrue = true; } else { i.istrue = false; } }); } }, }, }; </script> <style lang="scss"> .field-green .el-form-item__label { color: green; } .field-red .el-form-item__label { color: red; } </style>