<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="httpCode" prop="httpCode"> <el-input v-model="queryParams.httpCode" placeholder="请输入httpCode" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="retCode" prop="retCode"> <el-input v-model="queryParams.retCode" placeholder="请输入retCode" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery" /> </el-form-item> <el-form-item label="hasException" 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="paramDuration"> <el-input v-model="queryParams.paramDuration" 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" >导出</el-button > </el-col> <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" ></right-toolbar> </el-row> <el-table v-loading="loading" :data="list"> <el-table-column type="id" width="55" align="center" prop="id" min-width="55" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" > <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="from" align="center" prop="requestFrom" /> <el-table-column label="API" align="center" prop="apiName" /> <el-table-column label="to" align="center" prop="responseBy" /> <el-table-column label="http" align="center" prop="httpCode"> <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"> <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="180" > <template slot-scope="scope"> <span>{{ parseTime(scope.row.requestTime) }}</span> </template> </el-table-column> <el-table-column label="耗时" align="center" prop="duration"> <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" /> <el-table-column label="响应内容" align="center" prop="responseBody" :show-overflow-tooltip="true" /> <el-table-column label="异常信息" align="center" prop="exceptionMsg" :show-overflow-tooltip="true" > <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="primary" 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="primary" 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="primary" 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 { list, delOperlog, cleanOperlog } from "@/api/system/operlog"; import Clipboard from "clipboard"; export default { name: "Operlog", data() { return { // 遮罩层 loading: true, // 显示搜索条件 showSearch: true, // 总条数 total: 0, // 表格数据 list: [], // 是否显示弹出层 open: false, // 日期范围 dateRange: [], // 表单参数 form: {}, // 查询参数 queryParams: { pageNum: 1, pageSize: 10, apiName: undefined, requestFrom: undefined, responseBy: undefined, httpCode: undefined, retCode: undefined, hasException: undefined, }, }; }, created() { this.getList(); this.getDicts("sys_oper_type").then((response) => { this.typeOptions = response.data; }); this.getDicts("sys_common_status").then((response) => { this.statusOptions = response.data; }); }, methods: { /** 查询登录日志 */ getList() { this.loading = true; list(this.addDateRange(this.queryParams, this.dateRange)).then( (response) => { this.list = response.rows; this.total = response.total; this.loading = false; } ); }, // 复制 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; this.form = row; }, /** 导出按钮操作 */ handleExport() { this.download( "system/apilog/export", { ...this.queryParams, }, `apilog_${new Date().getTime()}.xlsx` ); }, }, }; </script> <style lang="scss"> .field-green .el-form-item__label { color: green; } .field-red .el-form-item__label { color: red; } </style>