From fc24f95299f57c5ecf2f75d7225016ca1feb2c72 Mon Sep 17 00:00:00 2001 From: yangyufu Date: Fri, 3 Jul 2026 14:15:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(sysapi):=20=E9=87=8D=E6=9E=84=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=97=A5=E5=BF=97=E6=9F=A5=E8=AF=A2=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=A1=A8=E5=90=8D=E4=B8=8E=E6=8A=A5=E6=96=87?= =?UTF-8?q?=E6=A3=80=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换Java硬编码查询为MyBatis XML动态SQL,支持动态切换日志表 - 新增请求报文与响应报文关键字搜索条件 - 前端字段映射由驼峰调整为下划线,适配Map返回结构 - 日志详情新增JSON一键复制功能与归档遮罩动画 --- .../sysapi/SysApiLogController.java | 61 +---- .../sysapi/entity/dto/ApiLogQuery.java | 9 + .../sysapi/mapper/SysApiLogMapper.java | 12 + .../service/sysapi/mapper/SysApiLogMapper.xml | 70 +++++ .../sysapi/service/ISysApiLogService.java | 10 + .../sysapi/service/SysApiLogServiceImpl.java | 19 ++ lms/nladmin-ui/src/api/monitor/sysapilog.js | 2 +- .../src/views/monitor/sysapiLog/index.vue | 244 ++++++++++++++---- 8 files changed, 315 insertions(+), 112 deletions(-) create mode 100644 lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.xml diff --git a/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java b/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java index ca0ffa55e..0bd0d00d5 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/controller/sysapi/SysApiLogController.java @@ -40,67 +40,12 @@ public class SysApiLogController { private final ISysApiLogHistoryService apiLogHistoryService; /** - * 分页查询接口日志列表 + * 分页查询接口日志列表(走XML动态SQL,支持动态表名) */ @GetMapping @Log("查询接口日志列表") - public ResponseEntity> query(ApiLogQuery query) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - - if (query.getDirection() != null) { - wrapper.eq(SysApiLog::getDirection, query.getDirection()); - } - - if (query.getSystemFlag() != null && !query.getSystemFlag().isEmpty()) { - wrapper.eq(SysApiLog::getSystemFlag, query.getSystemFlag()); - } - - if (query.getBizCode() != null && !query.getBizCode().isEmpty()) { - wrapper.eq(SysApiLog::getBizCode, query.getBizCode()); - } - - if (query.getTraceId() != null && !query.getTraceId().isEmpty()) { - wrapper.eq(SysApiLog::getTraceId, query.getTraceId()); - } - - if (query.getApiUrl() != null && !query.getApiUrl().isEmpty()) { - wrapper.like(SysApiLog::getApiUrl, query.getApiUrl()); - } - - if (query.getStatus() != null && !query.getStatus().isEmpty()) { - wrapper.eq(SysApiLog::getStatus, query.getStatus()); - } - - if (query.getBegin_time() != null && !query.getBegin_time().isEmpty()) { - String beginTime = query.getBegin_time() + " 00:00:00"; - wrapper.ge(SysApiLog::getCreateTime, beginTime); - } - - if (query.getEnd_time() != null && !query.getEnd_time().isEmpty()) { - String endTime = query.getEnd_time() + " 23:59:59"; - wrapper.le(SysApiLog::getCreateTime, endTime); - } - - if (query.getKeyword() != null && !query.getKeyword().isEmpty()) { - wrapper.and(w -> w.like(SysApiLog::getBizDesc, query.getKeyword()) - .or().like(SysApiLog::getApiDesc, query.getKeyword()) - .or().like(SysApiLog::getRequestParams, query.getKeyword()) - .or().like(SysApiLog::getResponseBody, query.getKeyword())); - } - - wrapper.orderByDesc(SysApiLog::getCreateTime); - - Page page = new Page<>(query.getPage()+1, query.getSize()); - IPage result = apiLogService.page(page, wrapper); - - Map response = new HashMap<>(); - response.put("content", result.getRecords()); - response.put("totalElements", result.getTotal()); - response.put("totalPages", result.getPages()); - response.put("size", result.getSize()); - response.put("number", result.getCurrent()); - - return new ResponseEntity<>(response, HttpStatus.OK); + public ResponseEntity query(ApiLogQuery query) { + return new ResponseEntity<>(apiLogService.queryApiLog(query), HttpStatus.OK); } /** diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java index 228b7673b..1f18bca22 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/entity/dto/ApiLogQuery.java @@ -1,4 +1,5 @@ package org.nl.system.service.sysapi.entity.dto; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; import org.nl.common.domain.query.PageQuery; @@ -30,5 +31,13 @@ public class ApiLogQuery extends PageQuery { private String keyword; + private String requestParams; + + private String responseParams; + + /** + * 动态表名,从前台传入,如:sys_api_log 或 sys_api_log_history + */ + private String tableName; } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java index 55519d5bf..bf8950e47 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.java @@ -1,7 +1,12 @@ package org.nl.system.service.sysapi.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.nl.system.service.sysapi.entity.SysApiLog; +import org.nl.system.service.sysapi.entity.dto.ApiLogQuery; + +import java.util.List; +import java.util.Map; /** * @author ManMan.Yang @@ -13,4 +18,11 @@ import org.nl.system.service.sysapi.entity.SysApiLog; @Mapper public interface SysApiLogMapper extends BaseMapper { + + /** + * 分页查询接口日志(动态表名) + * @param query 查询条件 + * @return List + */ + List queryApiLog(@Param("query") ApiLogQuery query); } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.xml b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.xml new file mode 100644 index 000000000..764765aa0 --- /dev/null +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/mapper/SysApiLogMapper.xml @@ -0,0 +1,70 @@ + + + + + + + diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java index c8dbc5a02..a15395460 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/ISysApiLogService.java @@ -2,9 +2,12 @@ package org.nl.system.service.sysapi.service; import com.baomidou.mybatisplus.extension.service.IService; import org.apache.poi.ss.formula.functions.T; import org.nl.system.service.sysapi.entity.SysApiLog; +import org.nl.system.service.sysapi.entity.dto.ApiLogQuery; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.annotation.Async; +import java.util.Map; + /** * @author ManMan.Yang * @version V1.1 @@ -18,4 +21,11 @@ public interface ISysApiLogService extends IService { void saveAsync(SysApiLog apiLog); ResponseEntity archiveLogs(); + + /** + * 分页查询接口日志(走XML动态SQL) + * @param query 查询条件 + * @return Object + */ + Object queryApiLog(ApiLogQuery query); } diff --git a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java index d1349d89e..f093c6636 100644 --- a/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/system/service/sysapi/service/SysApiLogServiceImpl.java @@ -3,13 +3,17 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.formula.functions.T; +import org.nl.common.TableDataInfo; import org.nl.common.utils.IdUtil; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.system.service.param.impl.SysParamServiceImpl; import org.nl.system.service.sysapi.entity.SysApiLog; import org.nl.system.service.sysapi.entity.SysApiLogHistory; +import org.nl.system.service.sysapi.entity.dto.ApiLogQuery; import org.nl.system.service.sysapi.mapper.SysApiLogHistoryMapper; import org.nl.system.service.sysapi.mapper.SysApiLogMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -20,6 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -91,4 +96,18 @@ public class SysApiLogServiceImpl extends ServiceImpl page = PageHelper.startPage(query.getPage() + 1, query.getSize()); + List list = this.baseMapper.queryApiLog(query); + TableDataInfo build = TableDataInfo.build(list); + build.setTotalElements(page.getTotal()); + return build; + } } diff --git a/lms/nladmin-ui/src/api/monitor/sysapilog.js b/lms/nladmin-ui/src/api/monitor/sysapilog.js index 1ff3172a4..64364a6e1 100644 --- a/lms/nladmin-ui/src/api/monitor/sysapilog.js +++ b/lms/nladmin-ui/src/api/monitor/sysapilog.js @@ -1,6 +1,6 @@ import request from '@/utils/request' -export function getBizCodeList(systemFlag,direction) { +export function getBizCodeList(systemFlag, direction) { return request({ url: 'api/sysApiLog/bizCodeList', method: 'get', diff --git a/lms/nladmin-ui/src/views/monitor/sysapiLog/index.vue b/lms/nladmin-ui/src/views/monitor/sysapiLog/index.vue index 0d9938685..d96024656 100644 --- a/lms/nladmin-ui/src/views/monitor/sysapiLog/index.vue +++ b/lms/nladmin-ui/src/views/monitor/sysapiLog/index.vue @@ -6,29 +6,31 @@ :inline="true" class="demo-form-inline" label-position="right" - label-width="90px" + label-width="120px" label-suffix=":" > - - + + @change="handleTableNameChange" + > + + + - + - - + + @@ -50,7 +52,6 @@ + + + + + + @@ -94,7 +115,6 @@ class="filter-item" type="primary" icon="el-icon-folder-checked" - :loading="archiveLoading" @click="handleArchive" > 日志归档 @@ -117,29 +137,31 @@ 入站 - - - + + + + - + - + - - + + + @@ -216,7 +255,13 @@ export default { title: '接口日志', url: 'api/sysApiLog', query: { - createTime: [dateStr, dateStr] + createTime: [dateStr, dateStr], + tableName: 'sys_api_log', + direction: null, + systemFlag: null, + bizCode: null, // 关键:提前声明,Vue.observable 才能追踪 + status: null, + keyword: null } }) }, @@ -238,15 +283,20 @@ export default { } }, methods: { - handleSystemFlagChange() { - this.query.bizCode = undefined + handleTableNameChange(){ + this.query.direction = null; + this.query.systemFlag = null + this.query.bizCode = null this.bizCodeList = [] - if (this.query.systemFlag) { + }, + handleSystemFlagChange() { + this.query.bizCode = null + this.bizCodeList = [] + if (this.query.systemFlag != null && this.query.systemFlag !== '' && this.query.direction != null && this.query.direction !== '') { apiLog.getBizCodeList(this.query.systemFlag, this.query.direction).then(res => { this.bizCodeList = res }) } - this.crud.toQuery() }, showDetail(row) { this.currentRow = row @@ -256,6 +306,11 @@ export default { this.drawerVisible = false this.currentRow = {} }, + directionChanged() { + this.query.systemFlag = null + this.query.bizCode = null + this.bizCodeList = [] + }, formatJson(json) { if (!json) return '' try { @@ -264,6 +319,30 @@ export default { return json } }, + copyJson(raw) { + if (!raw) { + this.$message.warning('暂无内容可复制') + return + } + let text = raw + try { + text = JSON.stringify(JSON.parse(raw), null, 2) + } catch (e) { + // 非 JSON 格式,直接使用原始文本 + } + navigator.clipboard.writeText(text).then(() => { + this.$message.success('已复制到剪贴板') + }).catch(() => { + // 降级方案 + const textarea = document.createElement('textarea') + textarea.value = text + document.body.appendChild(textarea) + textarea.select() + document.execCommand('copy') + document.body.removeChild(textarea) + this.$message.success('已复制到剪贴板') + }) + }, handleArchive() { this.$confirm('确认将历史接口日志数据进行归档备份吗?此操作可能需要较长时间。', '提示', { confirmButtonText: '确定', @@ -328,6 +407,24 @@ export default { margin: 10px 0; } +.json-wrapper { + position: relative; +} + +.copy-btn { + position: absolute; + top: 10px; + right: 10px; + z-index: 10; + color: #409eff; + font-size: 12px; + padding: 4px 8px; +} + +.copy-btn:hover { + color: #66b1ff; +} + ::v-deep .el-drawer__header { margin-bottom: 10px; padding: 15px 20px; @@ -344,15 +441,56 @@ export default { .biz-code-item .el-select { width: 100%; } -::v-deep .el-drawer__body { - padding: 0; -} -.biz-code-item { - min-width: 350px; + +.archive-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.45); + z-index: 9999; + display: flex; + align-items: center; + justify-content: center; } -.biz-code-item .el-select { +.archive-overlay__box { + text-align: center; + color: #fff; + width: 360px; +} + +.archive-overlay__box p { + margin-bottom: 20px; + font-size: 18px; + letter-spacing: 4px; + color: aqua; +} + +.archive-overlay__bar { width: 100%; + height: 8px; + background-color: rgba(255, 255, 255, 0.55); + border-radius: 4px; + overflow: hidden; +} + +.archive-overlay__bar-inner { + width: 30%; + height: 100%; + background-color: aqua; + border-radius: 4px; + animation: archive-bar-slide 1.2s ease-in-out infinite; +} + +@keyframes archive-bar-slide { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(430%); + } }