添加API请求记录导出功能

This commit is contained in:
葛林强 2026-03-06 16:55:51 +08:00
parent 78f8396f58
commit f601365450
8 changed files with 205 additions and 5 deletions

View File

@ -50,6 +50,35 @@ public class AppRecordApiRequestDao extends ServiceImpl<AppRecordApiRequestMappe
}
}
/**
* 查询数据
*
* @param request 筛选参数
* @return 数据
*/
@Override
public List<AppRecordApiRequest> queryByRequest(QueryRecordApiRequestReq request) {
if(request == null) {
return null;
}
LambdaQueryWrapper<AppRecordApiRequest> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(request.getSuccess() != null, AppRecordApiRequest::getSuccess, request.getSuccess());
if(AppStringUtils.isNotEmpty(request.getQueryStr())) {
queryWrapper.like(AppRecordApiRequest::getApiKey, request.getQueryStr())
.or().like(AppRecordApiRequest::getRequestMsg, request.getQueryStr())
.or().like(AppRecordApiRequest::getResponseMsg, request.getQueryStr());
}
if(request.getRequestTimes() != null && request.getRequestTimes().length == 2) {
queryWrapper.between(AppRecordApiRequest::getRequestTime, request.getRequestTimes()[0], request.getRequestTimes()[1]);
}
queryWrapper.orderByDesc(AppRecordApiRequest::getRequestTime);
try {
return super.baseMapper.selectList(queryWrapper);
} catch (Exception e) {
return null;
}
}
/**
* 插入数据
*

View File

@ -11,6 +11,7 @@ public interface AppRecordApiRequestService extends IService<AppRecordApiRequest
Tuple2<Long, List<AppRecordApiRequest>> queryByPage(QueryRecordApiRequestReq request, Integer pageSize, Integer pageIndex);
List<AppRecordApiRequest> queryByRequest(QueryRecordApiRequestReq request);
int insert(AppRecordApiRequest record); // 插入数据
int deleteBySaveDays(int saveDays); // 删除指定天数前的数据

View File

@ -0,0 +1,90 @@
package org.wcs.model.vo.serve.recordApi;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Getter;
import lombok.Setter;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 导出记录API请求列表
*/
@Getter
@Setter
public class ExportRecordApiRequestVo {
/**
* 记录ID
*/
@Excel(name = "记录编号")
private String recordId;
/**
* API KEY
*/
@Excel(name = "API KEY")
private String apiKey;
/**
* 请求URL
*/
@Excel(name = "请求地址")
private String requestUrl;
/**
* 请求是否成功
*/
@Excel(name = "请求是否成功")
private String success;
/**
* 请求方式
*/
@Excel(name = "请求方式")
private String method;
/**
* url参数
*/
@Excel(name = "URL参数")
private String urlParam;
/**
* 请求参数
*/
@Excel(name = "请求数据")
private String requestMsg;
/**
* 响应内容
*/
@Excel(name = "响应内容")
private String responseMsg;
/**
* 请求时间
*/
@Excel(name = "请求时间")
private LocalDateTime requestTime;
/**
* 响应时间
*/
@Excel(name = "响应时间")
private LocalDateTime responseTime;
/**
* 耗时
*/
@Excel(name = "耗时")
private BigDecimal useTime;
/**
* 错误信息
*/
@Excel(name = "错误信息")
private String errMsg;
}

View File

@ -1,6 +1,7 @@
package org.wcs.serve.controller.app;
import cn.dev33.satoken.annotation.SaCheckPermission;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.wcs.model.dto.serve.recordApi.QueryRecordApiRequestReq;
@ -20,7 +21,7 @@ import org.wcs.serve.service.intf.IRecordApiService;
@RequiredArgsConstructor
public class RecordApiController {
private final IRecordApiService recordApiRequestService;
private final IRecordApiService recordApiService;
/**
* 查询 API 请求记录
@ -32,7 +33,7 @@ public class RecordApiController {
@SaCheckPermission("recordApiRequest:query")
@PostMapping("/queryApiRequestWithPage")
public AppServeDataResponse<PageDataResponse<RecordApiRequestVo>> queryRecordApiRequest(@RequestBody QueryRecordApiRequestReq request, @RequestParam("pageSize") Integer pageSize, @RequestParam("pageIndex") Integer pageIndex) {
return recordApiRequestService.queryRecordApiRequest(request, pageSize, pageIndex);
return recordApiService.queryRecordApiRequest(request, pageSize, pageIndex);
}
/**
@ -45,7 +46,18 @@ public class RecordApiController {
@SaCheckPermission("recordApiResponse:query")
@PostMapping("/queryApiResponseWithPage")
public AppServeDataResponse<PageDataResponse<RecordApiResponseVo>> queryRecordApiResponse(@RequestBody QueryRecordApiResponseReq request, @RequestParam("pageSize") Integer pageSize, @RequestParam("pageIndex") Integer pageIndex) {
return recordApiRequestService.queryRecordApiResponse(request, pageSize, pageIndex);
return recordApiService.queryRecordApiResponse(request, pageSize, pageIndex);
}
/**
* 导出 API 请求记录
* @param response 响应
* @param request 查询参数
*/
@SaCheckPermission("recordApiRequest:export")
@PostMapping("/exportApiRequest")
public void exportApiRequest(HttpServletResponse response, @RequestBody QueryRecordApiRequestReq request) {
recordApiService.exportApiRequest(response, request);
}

View File

@ -1,8 +1,10 @@
package org.wcs.serve.service.impl;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.wcs.constant.enums.common.TrueOrFalseEnum;
import org.wcs.factory.AppServeResponseFactory;
import org.wcs.mapper.intf.AppRecordApiRequestService;
import org.wcs.mapper.intf.AppRecordApiResponseService;
@ -12,12 +14,15 @@ import org.wcs.model.po.app.AppRecordApiRequest;
import org.wcs.model.po.app.AppRecordApiResponse;
import org.wcs.model.vo.serve.AppServeDataResponse;
import org.wcs.model.vo.serve.common.PageDataResponse;
import org.wcs.model.vo.serve.recordApi.ExportRecordApiRequestVo;
import org.wcs.model.vo.serve.recordApi.RecordApiRequestVo;
import org.wcs.model.vo.serve.recordApi.RecordApiResponseVo;
import org.wcs.plugin.excel.ExcelPoi;
import org.wcs.serve.service.intf.IRecordApiService;
import org.wcs.model.bo.tuple.Tuple2;
import org.wcs.utils.AppBeanUtils;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@ -27,6 +32,7 @@ public class RecordApiService implements IRecordApiService {
private final AppRecordApiRequestService recordApiRequestService;
private final AppRecordApiResponseService recordApiResponseService;
private final ExcelPoi excelPoi;
/**
* 查询记录API请求列表
@ -76,5 +82,41 @@ public class RecordApiService implements IRecordApiService {
return AppServeResponseFactory.success("查询成功", response);
}
/**
* 导出记录API请求列表
* @param response 响应
* @param request 查询参数
*/
@Override
public void exportApiRequest(HttpServletResponse response, QueryRecordApiRequestReq request) {
List<AppRecordApiRequest> recordApiRequests = recordApiRequestService.queryByRequest(request);
if(recordApiRequests == null) {
log.error("导出API请求数据时查询数据失败");
return;
}
List<ExportRecordApiRequestVo> recordApiRequestVos = new ArrayList<>();
for (AppRecordApiRequest recordApiRequest : recordApiRequests) {
ExportRecordApiRequestVo recordApiRequestVo = new ExportRecordApiRequestVo();
recordApiRequestVo.setRecordId(recordApiRequest.getRecordId());
recordApiRequestVo.setApiKey(recordApiRequest.getApiKey());
recordApiRequestVo.setRequestUrl(recordApiRequest.getRequestUrl());
recordApiRequestVo.setSuccess(TrueOrFalseEnum.getByCode(recordApiRequest.getSuccess()).getMsg());
recordApiRequestVo.setMethod(recordApiRequest.getMethod());
recordApiRequestVo.setUrlParam(recordApiRequest.getUrlParam());
recordApiRequestVo.setRequestMsg(recordApiRequest.getRequestMsg());
recordApiRequestVo.setResponseMsg(recordApiRequest.getResponseMsg());
recordApiRequestVo.setRequestTime(recordApiRequest.getRequestTime());
recordApiRequestVo.setResponseTime(recordApiRequest.getResponseTime());
recordApiRequestVo.setUseTime(recordApiRequest.getUseTime());
recordApiRequestVo.setErrMsg(recordApiRequest.getErrMsg());
recordApiRequestVos.add(recordApiRequestVo);
}
try {
excelPoi.doWriteExcel("API请求数据", response, recordApiRequestVos, ExportRecordApiRequestVo.class);
} catch (Exception e) {
log.error("导出API请求数据时发生异常", e);
}
}
}

View File

@ -1,5 +1,6 @@
package org.wcs.serve.service.intf;
import jakarta.servlet.http.HttpServletResponse;
import org.wcs.model.dto.serve.recordApi.QueryRecordApiRequestReq;
import org.wcs.model.dto.serve.recordApi.QueryRecordApiResponseReq;
import org.wcs.model.vo.serve.AppServeDataResponse;
@ -11,4 +12,6 @@ public interface IRecordApiService {
AppServeDataResponse<PageDataResponse<RecordApiRequestVo>> queryRecordApiRequest(QueryRecordApiRequestReq request, Integer pageSize, Integer pageIndex);
AppServeDataResponse<PageDataResponse<RecordApiResponseVo>> queryRecordApiResponse(QueryRecordApiResponseReq request, Integer pageSize, Integer pageIndex);
void exportApiRequest(HttpServletResponse response, QueryRecordApiRequestReq request); // 导出 API 请求记录
}

View File

@ -21,5 +21,12 @@ export default class RecordApi {
pageIndex: pageIndex
}
})
}
};
static downLoadApiRequest(query: IRecordApiRequestSearch) {
return axiosInstance.post('/app/recordApi/exportApiRequest', query, {
responseType: 'blob',
timeout: 30000
})
};
}

View File

@ -13,6 +13,7 @@ import MessageUtils from "@/utils/MessageUtils.ts";
import RecordApiRequestDetail from "@/components/page/recordApi/RecordApiRequestDetail.vue";
import {menuStore} from "@/stores/menu.ts";
import AppPermission from "@/components/manage/AppPermission.vue";
import StackerLocationApi from "@/api/stackerLocation.ts";
const menuStoreInstance = menuStore();
const trueFalseTagStyleFormatter = new TrueFalseTagStyleFormatter();
@ -73,6 +74,21 @@ const handleEdit = (index: number, row: any) => {
};
showDetail.value = true;
};
//
const exportData = () => {
MessageUtils.confirmMessageBox('确定导出数据?','导出确认').then(() => {
RecordApi.downLoadApiRequest(querySearch.value).then(res => {
const url = window.URL.createObjectURL(new Blob([res.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', '接口请求信息下载.xlsx');
document.body.appendChild(link);
link.click();
MessageUtils.successMessage('您的下载将尽快开始,请稍后');
document.body.removeChild(link);
}).catch(() => {})
}).catch(() => {})
}
</script>
@ -104,7 +120,7 @@ const handleEdit = (index: number, row: any) => {
<el-button-group style="width: 100%;margin-left: 10px; margin-bottom: 10px">
<app-permission permission="recordApiRequest:query"><el-button type="primary" @click="query">查询/刷新</el-button></app-permission>
<el-button type="warning" @click="resetInput">重置查询参数</el-button>
<app-permission permission="recordApiRequest:export"><el-button type="info" >导出数据</el-button></app-permission>
<app-permission permission="recordApiRequest:export"><el-button type="info" @click="exportData">导出数据</el-button></app-permission>
</el-button-group>
</el-row>
</el-row>