1. 优化代码生成器的模板

2. 增加 API 正常日志的 API 接口
This commit is contained in:
YunaiV 2021-02-27 01:29:18 +08:00
parent 7a87fdbd79
commit 0678fb7ca0
19 changed files with 485 additions and 22 deletions

View File

@ -4,6 +4,7 @@ import cn.iocoder.dashboard.framework.logger.apilog.core.filter.ApiAccessLogFilt
import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService; import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService;
import cn.iocoder.dashboard.framework.web.config.WebProperties; import cn.iocoder.dashboard.framework.web.config.WebProperties;
import cn.iocoder.dashboard.framework.web.core.enums.FilterOrderEnum; import cn.iocoder.dashboard.framework.web.core.enums.FilterOrderEnum;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -18,8 +19,9 @@ public class ApiLogConfiguration {
*/ */
@Bean @Bean
public FilterRegistrationBean<ApiAccessLogFilter> apiAccessLogFilter(WebProperties webProperties, public FilterRegistrationBean<ApiAccessLogFilter> apiAccessLogFilter(WebProperties webProperties,
@Value("${spring.application.name}") String applicationName,
ApiAccessLogFrameworkService apiAccessLogFrameworkService) { ApiAccessLogFrameworkService apiAccessLogFrameworkService) {
ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, apiAccessLogFrameworkService); ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService);
return createFilterBean(filter, FilterOrderEnum.API_ACCESS_LOG_FILTER); return createFilterBean(filter, FilterOrderEnum.API_ACCESS_LOG_FILTER);
} }

View File

@ -15,7 +15,6 @@ import cn.iocoder.dashboard.util.json.JsonUtils;
import cn.iocoder.dashboard.util.servlet.ServletUtils; import cn.iocoder.dashboard.util.servlet.ServletUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
@ -36,10 +35,9 @@ import java.util.Map;
public class ApiAccessLogFilter extends OncePerRequestFilter { public class ApiAccessLogFilter extends OncePerRequestFilter {
private final WebProperties webProperties; private final WebProperties webProperties;
private final ApiAccessLogFrameworkService apiAccessLogFrameworkService; private final String applicationName;
@Value("${spring.application.name}") private final ApiAccessLogFrameworkService apiAccessLogFrameworkService;
private String applicationName;
@Override @Override
protected boolean shouldNotFilter(HttpServletRequest request) { protected boolean shouldNotFilter(HttpServletRequest request) {
@ -51,7 +49,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException { throws ServletException, IOException {
// 获得开始时间 // 获得开始时间
Date startTime = new Date(); Date beginTim = new Date();
// 提前获得参数避免 XssFilter 过滤处理 // 提前获得参数避免 XssFilter 过滤处理
Map<String, String> queryString = ServletUtil.getParamMap(request); Map<String, String> queryString = ServletUtil.getParamMap(request);
String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtil.getBody(request) : null; String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtil.getBody(request) : null;
@ -60,25 +58,25 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
// 继续过滤器 // 继续过滤器
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
// 正常执行记录日志 // 正常执行记录日志
createApiAccessLog(request, startTime, queryString, requestBody, null); createApiAccessLog(request, beginTim, queryString, requestBody, null);
} catch (Exception ex) { } catch (Exception ex) {
// 异常执行记录日志 // 异常执行记录日志
createApiAccessLog(request, startTime, queryString, requestBody, ex); createApiAccessLog(request, beginTim, queryString, requestBody, ex);
throw ex; throw ex;
} }
} }
private void createApiAccessLog(HttpServletRequest request, Date startTime, private void createApiAccessLog(HttpServletRequest request, Date beginTime,
Map<String, String> queryString, String requestBody, Exception ex) { Map<String, String> queryString, String requestBody, Exception ex) {
try { try {
ApiAccessLogCreateDTO accessLog = this.buildApiAccessLogDTO(request, startTime, queryString, requestBody, ex); ApiAccessLogCreateDTO accessLog = this.buildApiAccessLogDTO(request, beginTime, queryString, requestBody, ex);
apiAccessLogFrameworkService.createApiAccessLogAsync(accessLog); apiAccessLogFrameworkService.createApiAccessLogAsync(accessLog);
} catch (Exception e) { } catch (Exception e) {
log.error("[createApiAccessLog][url({}) 发生异常]", request.getRequestURI(), ex); log.error("[createApiAccessLog][url({}) 发生异常]", request.getRequestURI(), e);
} }
} }
private ApiAccessLogCreateDTO buildApiAccessLogDTO(HttpServletRequest request, Date startTime, private ApiAccessLogCreateDTO buildApiAccessLogDTO(HttpServletRequest request, Date beginTime,
Map<String, String> queryString, String requestBody, Exception ex) { Map<String, String> queryString, String requestBody, Exception ex) {
ApiAccessLogCreateDTO accessLog = new ApiAccessLogCreateDTO(); ApiAccessLogCreateDTO accessLog = new ApiAccessLogCreateDTO();
// 处理用户信息 // 处理用户信息
@ -106,9 +104,9 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
accessLog.setUserAgent(ServletUtils.getUserAgent(request)); accessLog.setUserAgent(ServletUtils.getUserAgent(request));
accessLog.setUserIp(ServletUtil.getClientIP(request)); accessLog.setUserIp(ServletUtil.getClientIP(request));
// 持续时间 // 持续时间
accessLog.setStartTime(startTime); accessLog.setBeginTime(beginTime);
accessLog.setEndTime(new Date()); accessLog.setEndTime(new Date());
accessLog.setDuration((int) DateUtils.diff(accessLog.getEndTime(), accessLog.getStartTime())); accessLog.setDuration((int) DateUtils.diff(accessLog.getEndTime(), accessLog.getBeginTime()));
return accessLog; return accessLog;
} }

View File

@ -61,7 +61,7 @@ public class ApiAccessLogCreateDTO {
* 开始请求时间 * 开始请求时间
*/ */
@NotNull(message = "开始请求时间不能为空") @NotNull(message = "开始请求时间不能为空")
private Date startTime; private Date beginTime;
/** /**
* 结束请求时间 * 结束请求时间
*/ */

View File

@ -0,0 +1,71 @@
package cn.iocoder.dashboard.modules.system.controller.logger;
import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExcelVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogRespVO;
import cn.iocoder.dashboard.modules.system.convert.logger.SysApiAccessLogConvert;
import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
import cn.iocoder.dashboard.modules.system.service.logger.SysApiAccessLogService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Api(tags = "API 访问日志")
@RestController
@RequestMapping("/system/api-access-log")
@Validated
public class SysApiAccessLogController {
@Resource
private SysApiAccessLogService apiAccessLogService;
@GetMapping("/get")
@ApiOperation("获得API 访问日志")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
@PreAuthorize("@ss.hasPermission('system:api-access-log:query')")
public CommonResult<SysApiAccessLogRespVO> getApiAccessLog(@RequestParam("id") Long id) {
SysApiAccessLogDO apiAccessLog = apiAccessLogService.getApiAccessLog(id);
return success(SysApiAccessLogConvert.INSTANCE.convert(apiAccessLog));
}
@GetMapping("/page")
@ApiOperation("获得API 访问日志分页")
@PreAuthorize("@ss.hasPermission('system:api-access-log:query')")
public CommonResult<PageResult<SysApiAccessLogRespVO>> getApiAccessLogPage(@Valid SysApiAccessLogPageReqVO pageVO) {
PageResult<SysApiAccessLogDO> pageResult = apiAccessLogService.getApiAccessLogPage(pageVO);
return success(SysApiAccessLogConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/export-excel")
@ApiOperation("导出API 访问日志 Excel")
@PreAuthorize("@ss.hasPermission('system:api-access-log:export')")
@OperateLog(type = EXPORT)
public void exportApiAccessLogExcel(@Valid SysApiAccessLogExportReqVO exportReqVO,
HttpServletResponse response) throws IOException {
List<SysApiAccessLogDO> list = apiAccessLogService.getApiAccessLogList(exportReqVO);
// 导出 Excel
List<SysApiAccessLogExcelVO> datas = SysApiAccessLogConvert.INSTANCE.convertList02(list);
ExcelUtils.write(response, "API 访问日志.xls", "数据", SysApiAccessLogExcelVO.class, datas);
}
}

View File

@ -0,0 +1,75 @@
package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* API 访问日志 Base VO提供给添加修改详细的子 VO 使用
* 如果子 VO 存在差异的字段请不要添加到这里影响 Swagger 文档生成
*/
@Data
public class SysApiAccessLogBaseVO {
@ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002")
@NotNull(message = "链路追踪编号不能为空")
private String traceId;
@ApiModelProperty(value = "用户编号", required = true, example = "666")
@NotNull(message = "用户编号不能为空")
private Long userId;
@ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举")
@NotNull(message = "用户类型不能为空")
private Integer userType;
@ApiModelProperty(value = "应用名", required = true, example = "dashboard")
@NotNull(message = "应用名不能为空")
private String applicationName;
@ApiModelProperty(value = "请求方法名", required = true, example = "GET")
@NotNull(message = "请求方法名不能为空")
private String requestMethod;
@ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy")
@NotNull(message = "请求地址不能为空")
private String requestUrl;
@ApiModelProperty(value = "Java 方法的参数")
private String requestParams;
@ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1")
@NotNull(message = "用户 IP不能为空")
private String userIp;
@ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0")
@NotNull(message = "浏览器 UA不能为空")
private String userAgent;
@ApiModelProperty(value = "开始请求时间", required = true)
@NotNull(message = "开始请求时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginTime;
@ApiModelProperty(value = "结束请求时间", required = true)
@NotNull(message = "结束请求时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endTime;
@ApiModelProperty(value = "执行时长", required = true, example = "100")
@NotNull(message = "执行时长不能为空")
private Integer duration;
@ApiModelProperty(value = "结果码", required = true, example = "0")
@NotNull(message = "结果码不能为空")
private Integer resultCode;
@ApiModelProperty(value = "结果提示", example = "芋道源码,牛逼!")
private String resultMsg;
}

View File

@ -0,0 +1,66 @@
package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
import static cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum.USER_TYPE;
/**
* API 访问日志 Excel VO
*
* @author 芋道源码
*/
@Data
public class SysApiAccessLogExcelVO {
@ExcelProperty("日志主键")
private Long id;
@ExcelProperty("链路追踪编号")
private String traceId;
@ExcelProperty("用户编号")
private Long userId;
@ExcelProperty(value = "用户类型", converter = DictConvert.class)
@DictFormat(USER_TYPE)
private Integer userType;
@ExcelProperty("应用名")
private String applicationName;
@ExcelProperty("请求方法名")
private String requestMethod;
@ExcelProperty("请求地址")
private String requestUrl;
@ExcelProperty("Java 方法的参数")
private String requestParams;
@ExcelProperty("用户 IP")
private String userIp;
@ExcelProperty("浏览器 UA")
private String userAgent;
@ExcelProperty("开始请求时间")
private Date beginTime;
@ExcelProperty("结束请求时间")
private Date endTime;
@ExcelProperty("执行时长")
private Integer duration;
@ExcelProperty("结果码")
private Integer resultCode;
@ExcelProperty("结果提示")
private String resultMsg;
}

View File

@ -0,0 +1,42 @@
package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel(value = "API 访问日志 Excel 导出 Request VO", description = "参数和 SysApiAccessLogPageReqVO 是一致的")
@Data
public class SysApiAccessLogExportReqVO {
@ApiModelProperty(value = "用户编号", example = "666")
private Long userId;
@ApiModelProperty(value = "用户类型", example = "2")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "dashboard")
private String applicationName;
@ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配")
private String requestUrl;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始开始请求时间")
private Date beginBeginTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束开始请求时间")
private Date endBeginTime;
@ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
private Integer duration;
@ApiModelProperty(value = "结果码", example = "0")
private Integer resultCode;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
import cn.iocoder.dashboard.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("API 访问日志分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SysApiAccessLogPageReqVO extends PageParam {
@ApiModelProperty(value = "用户编号", example = "666")
private Long userId;
@ApiModelProperty(value = "用户类型", example = "2")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "dashboard")
private String applicationName;
@ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配")
private String requestUrl;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始开始请求时间")
private Date beginBeginTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束开始请求时间")
private Date endBeginTime;
@ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
private Integer duration;
@ApiModelProperty(value = "结果码", example = "0")
private Integer resultCode;
}

View File

@ -0,0 +1,23 @@
package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@ApiModel("API 访问日志 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class SysApiAccessLogRespVO extends SysApiAccessLogBaseVO {
@ApiModelProperty(value = "日志主键", required = true, example = "1024")
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -0,0 +1,33 @@
package cn.iocoder.dashboard.modules.system.convert.logger;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExcelVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogRespVO;
import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
/**
* API 访问日志 Convert
*
* @author 芋道源码
*/
@Mapper
public interface SysApiAccessLogConvert {
SysApiAccessLogConvert INSTANCE = Mappers.getMapper(SysApiAccessLogConvert.class);
SysApiAccessLogDO convert(ApiAccessLogCreateDTO bean);
SysApiAccessLogRespVO convert(SysApiAccessLogDO bean);
List<SysApiAccessLogRespVO> convertList(List<SysApiAccessLogDO> list);
PageResult<SysApiAccessLogRespVO> convertPage(PageResult<SysApiAccessLogDO> page);
List<SysApiAccessLogExcelVO> convertList02(List<SysApiAccessLogDO> list);
}

View File

@ -78,7 +78,7 @@ public class SysApiAccessLogDO extends BaseDO {
/** /**
* 开始请求时间 * 开始请求时间
*/ */
private Date startTime; private Date beginTime;
/** /**
* 结束请求时间 * 结束请求时间
*/ */

View File

@ -0,0 +1,45 @@
package cn.iocoder.dashboard.modules.system.dal.mysql.logger;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* API 访问日志 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface SysApiAccessLogMapper extends BaseMapperX<SysApiAccessLogDO> {
default PageResult<SysApiAccessLogDO> selectPage(SysApiAccessLogPageReqVO reqVO) {
return selectPage(reqVO, new QueryWrapperX<SysApiAccessLogDO>()
.eqIfPresent("user_id", reqVO.getUserId())
.eqIfPresent("user_type", reqVO.getUserType())
.eqIfPresent("application_name", reqVO.getApplicationName())
.likeIfPresent("request_url", reqVO.getRequestUrl())
.betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
.geIfPresent("duration", reqVO.getDuration())
.eqIfPresent("result_code", reqVO.getResultCode())
);
}
default List<SysApiAccessLogDO> selectList(SysApiAccessLogExportReqVO reqVO) {
return selectList(new QueryWrapperX<SysApiAccessLogDO>()
.eqIfPresent("user_id", reqVO.getUserId())
.eqIfPresent("user_type", reqVO.getUserType())
.eqIfPresent("application_name", reqVO.getApplicationName())
.likeIfPresent("request_url", reqVO.getRequestUrl())
.betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
.geIfPresent("duration", reqVO.getDuration())
.eqIfPresent("result_code", reqVO.getResultCode())
);
}
}

View File

@ -10,6 +10,8 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum SysDictTypeEnum { public enum SysDictTypeEnum {
USER_TYPE("user_type"), // 用户类型
SYS_USER_SEX("sys_user_sex"), // 用户性别 SYS_USER_SEX("sys_user_sex"), // 用户性别
SYS_COMMON_STATUS("sys_common_status"), // 系统状态 SYS_COMMON_STATUS("sys_common_status"), // 系统状态
SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型 SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型

View File

@ -1,6 +1,12 @@
package cn.iocoder.dashboard.modules.system.service.logger; package cn.iocoder.dashboard.modules.system.service.logger;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService; import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
import java.util.List;
/** /**
* API 访问日志 Service 接口 * API 访问日志 Service 接口
@ -8,4 +14,29 @@ import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFra
* @author 芋道源码 * @author 芋道源码
*/ */
public interface SysApiAccessLogService extends ApiAccessLogFrameworkService { public interface SysApiAccessLogService extends ApiAccessLogFrameworkService {
/**
* 获得 API 访问日志
*
* @param id 编号
* @return API 访问日志
*/
SysApiAccessLogDO getApiAccessLog(Long id);
/**
* 获得 API 访问日志分页
*
* @param pageReqVO 分页查询
* @return API 访问日志分页
*/
PageResult<SysApiAccessLogDO> getApiAccessLogPage(SysApiAccessLogPageReqVO pageReqVO);
/**
* 获得 API 访问日志列表, 用于 Excel 导出
*
* @param exportReqVO 查询条件
* @return API 访问日志分页
*/
List<SysApiAccessLogDO> getApiAccessLogList(SysApiAccessLogExportReqVO exportReqVO);
} }

View File

@ -1,11 +1,20 @@
package cn.iocoder.dashboard.modules.system.service.logger.impl; package cn.iocoder.dashboard.modules.system.service.logger.impl;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO; import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
import cn.iocoder.dashboard.modules.system.convert.logger.SysApiAccessLogConvert;
import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysApiAccessLogMapper;
import cn.iocoder.dashboard.modules.system.service.logger.SysApiAccessLogService; import cn.iocoder.dashboard.modules.system.service.logger.SysApiAccessLogService;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
/** /**
* API 访问日志 Service 实现类 * API 访问日志 Service 实现类
@ -16,11 +25,30 @@ import javax.validation.Valid;
@Validated @Validated
public class SysApiAccessLogServiceImpl implements SysApiAccessLogService { public class SysApiAccessLogServiceImpl implements SysApiAccessLogService {
@Resource
private SysApiAccessLogMapper apiAccessLogMapper;
@Override @Override
@Async
public void createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO) { public void createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO) {
// 插入
SysApiAccessLogDO apiAccessLog = SysApiAccessLogConvert.INSTANCE.convert(createDTO);
apiAccessLogMapper.insert(apiAccessLog);
}
@Override
public SysApiAccessLogDO getApiAccessLog(Long id) {
return apiAccessLogMapper.selectById(id);
}
@Override
public PageResult<SysApiAccessLogDO> getApiAccessLogPage(SysApiAccessLogPageReqVO pageReqVO) {
return apiAccessLogMapper.selectPage(pageReqVO);
}
@Override
public List<SysApiAccessLogDO> getApiAccessLogList(SysApiAccessLogExportReqVO exportReqVO) {
return apiAccessLogMapper.selectList(exportReqVO);
} }
} }

View File

@ -157,7 +157,7 @@ yudao:
base-package: ${yudao.info.base-package}.modules base-package: ${yudao.info.base-package}.modules
db-schemas: ${spring.datasource.name} db-schemas: ${spring.datasource.name}
xss: xss:
enable: true enable: false
exclude-urls: # 如下两个 url仅仅是为了演示去掉配置也没关系 exclude-urls: # 如下两个 url仅仅是为了演示去掉配置也没关系
- ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求

View File

@ -157,7 +157,7 @@ yudao:
base-package: ${yudao.info.base-package}.modules base-package: ${yudao.info.base-package}.modules
db-schemas: ${spring.datasource.name} db-schemas: ${spring.datasource.name}
xss: xss:
enable: true enable: false
exclude-urls: # 如下两个 url仅仅是为了演示去掉配置也没关系 exclude-urls: # 如下两个 url仅仅是为了演示去掉配置也没关系
- ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求

View File

@ -52,7 +52,7 @@ public class ${table.className}Controller {
return success(true); return success(true);
} }
@DeleteMapping("/delete") @DeleteMapping("/delete")
@ApiOperation("删除${table.classComment}") @ApiOperation("删除${table.classComment}")
@ApiImplicitParam(name = "id", value = "编号", required = true) @ApiImplicitParam(name = "id", value = "编号", required = true)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")

View File

@ -74,12 +74,12 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
@Override @Override
public PageResult<${table.className}DO> get${simpleClassName}Page(${table.className}PageReqVO pageReqVO) { public PageResult<${table.className}DO> get${simpleClassName}Page(${table.className}PageReqVO pageReqVO) {
return ${classNameVar}Mapper.selectPage(pageReqVO); return ${classNameVar}Mapper.selectPage(pageReqVO);
} }
@Override @Override
public List<${table.className}DO> get${simpleClassName}List(${table.className}ExportReqVO exportReqVO) { public List<${table.className}DO> get${simpleClassName}List(${table.className}ExportReqVO exportReqVO) {
return ${classNameVar}Mapper.selectList(exportReqVO); return ${classNameVar}Mapper.selectList(exportReqVO);
} }
} }