Commit 0678fb7ca02834996616cde27c76bca9c20d9b0c

Authored by YunaiV
1 parent 7a87fdbd

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

2. 增加 API 正常日志的 API 接口
Showing 19 changed files with 485 additions and 22 deletions
src/main/java/cn/iocoder/dashboard/framework/logger/apilog/config/ApiLogConfiguration.java
... ... @@ -4,6 +4,7 @@ import cn.iocoder.dashboard.framework.logger.apilog.core.filter.ApiAccessLogFilt
4 4 import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService;
5 5 import cn.iocoder.dashboard.framework.web.config.WebProperties;
6 6 import cn.iocoder.dashboard.framework.web.core.enums.FilterOrderEnum;
  7 +import org.springframework.beans.factory.annotation.Value;
7 8 import org.springframework.boot.web.servlet.FilterRegistrationBean;
8 9 import org.springframework.context.annotation.Bean;
9 10 import org.springframework.context.annotation.Configuration;
... ... @@ -18,8 +19,9 @@ public class ApiLogConfiguration {
18 19 */
19 20 @Bean
20 21 public FilterRegistrationBean<ApiAccessLogFilter> apiAccessLogFilter(WebProperties webProperties,
  22 + @Value("${spring.application.name}") String applicationName,
21 23 ApiAccessLogFrameworkService apiAccessLogFrameworkService) {
22   - ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, apiAccessLogFrameworkService);
  24 + ApiAccessLogFilter filter = new ApiAccessLogFilter(webProperties, applicationName, apiAccessLogFrameworkService);
23 25 return createFilterBean(filter, FilterOrderEnum.API_ACCESS_LOG_FILTER);
24 26 }
25 27  
... ...
src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/filter/ApiAccessLogFilter.java
... ... @@ -15,7 +15,6 @@ import cn.iocoder.dashboard.util.json.JsonUtils;
15 15 import cn.iocoder.dashboard.util.servlet.ServletUtils;
16 16 import lombok.RequiredArgsConstructor;
17 17 import lombok.extern.slf4j.Slf4j;
18   -import org.springframework.beans.factory.annotation.Value;
19 18 import org.springframework.web.filter.OncePerRequestFilter;
20 19  
21 20 import javax.servlet.FilterChain;
... ... @@ -36,10 +35,9 @@ import java.util.Map;
36 35 public class ApiAccessLogFilter extends OncePerRequestFilter {
37 36  
38 37 private final WebProperties webProperties;
39   - private final ApiAccessLogFrameworkService apiAccessLogFrameworkService;
  38 + private final String applicationName;
40 39  
41   - @Value("${spring.application.name}")
42   - private String applicationName;
  40 + private final ApiAccessLogFrameworkService apiAccessLogFrameworkService;
43 41  
44 42 @Override
45 43 protected boolean shouldNotFilter(HttpServletRequest request) {
... ... @@ -51,7 +49,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
51 49 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
52 50 throws ServletException, IOException {
53 51 // 获得开始时间
54   - Date startTime = new Date();
  52 + Date beginTim = new Date();
55 53 // 提前获得参数,避免 XssFilter 过滤处理
56 54 Map<String, String> queryString = ServletUtil.getParamMap(request);
57 55 String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtil.getBody(request) : null;
... ... @@ -60,25 +58,25 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
60 58 // 继续过滤器
61 59 filterChain.doFilter(request, response);
62 60 // 正常执行,记录日志
63   - createApiAccessLog(request, startTime, queryString, requestBody, null);
  61 + createApiAccessLog(request, beginTim, queryString, requestBody, null);
64 62 } catch (Exception ex) {
65 63 // 异常执行,记录日志
66   - createApiAccessLog(request, startTime, queryString, requestBody, ex);
  64 + createApiAccessLog(request, beginTim, queryString, requestBody, ex);
67 65 throw ex;
68 66 }
69 67 }
70 68  
71   - private void createApiAccessLog(HttpServletRequest request, Date startTime,
  69 + private void createApiAccessLog(HttpServletRequest request, Date beginTime,
72 70 Map<String, String> queryString, String requestBody, Exception ex) {
73 71 try {
74   - ApiAccessLogCreateDTO accessLog = this.buildApiAccessLogDTO(request, startTime, queryString, requestBody, ex);
  72 + ApiAccessLogCreateDTO accessLog = this.buildApiAccessLogDTO(request, beginTime, queryString, requestBody, ex);
75 73 apiAccessLogFrameworkService.createApiAccessLogAsync(accessLog);
76 74 } catch (Exception e) {
77   - log.error("[createApiAccessLog][url({}) 发生异常]", request.getRequestURI(), ex);
  75 + log.error("[createApiAccessLog][url({}) 发生异常]", request.getRequestURI(), e);
78 76 }
79 77 }
80 78  
81   - private ApiAccessLogCreateDTO buildApiAccessLogDTO(HttpServletRequest request, Date startTime,
  79 + private ApiAccessLogCreateDTO buildApiAccessLogDTO(HttpServletRequest request, Date beginTime,
82 80 Map<String, String> queryString, String requestBody, Exception ex) {
83 81 ApiAccessLogCreateDTO accessLog = new ApiAccessLogCreateDTO();
84 82 // 处理用户信息
... ... @@ -106,9 +104,9 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
106 104 accessLog.setUserAgent(ServletUtils.getUserAgent(request));
107 105 accessLog.setUserIp(ServletUtil.getClientIP(request));
108 106 // 持续时间
109   - accessLog.setStartTime(startTime);
  107 + accessLog.setBeginTime(beginTime);
110 108 accessLog.setEndTime(new Date());
111   - accessLog.setDuration((int) DateUtils.diff(accessLog.getEndTime(), accessLog.getStartTime()));
  109 + accessLog.setDuration((int) DateUtils.diff(accessLog.getEndTime(), accessLog.getBeginTime()));
112 110 return accessLog;
113 111 }
114 112  
... ...
src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/service/dto/ApiAccessLogCreateDTO.java
... ... @@ -61,7 +61,7 @@ public class ApiAccessLogCreateDTO {
61 61 * 开始请求时间
62 62 */
63 63 @NotNull(message = "开始请求时间不能为空")
64   - private Date startTime;
  64 + private Date beginTime;
65 65 /**
66 66 * 结束请求时间
67 67 */
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysApiAccessLogController.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.logger;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExcelVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
  10 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogRespVO;
  11 +import cn.iocoder.dashboard.modules.system.convert.logger.SysApiAccessLogConvert;
  12 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
  13 +import cn.iocoder.dashboard.modules.system.service.logger.SysApiAccessLogService;
  14 +import io.swagger.annotations.Api;
  15 +import io.swagger.annotations.ApiImplicitParam;
  16 +import io.swagger.annotations.ApiOperation;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
  18 +import org.springframework.validation.annotation.Validated;
  19 +import org.springframework.web.bind.annotation.GetMapping;
  20 +import org.springframework.web.bind.annotation.RequestMapping;
  21 +import org.springframework.web.bind.annotation.RequestParam;
  22 +import org.springframework.web.bind.annotation.RestController;
  23 +
  24 +import javax.annotation.Resource;
  25 +import javax.servlet.http.HttpServletResponse;
  26 +import javax.validation.Valid;
  27 +import java.io.IOException;
  28 +import java.util.List;
  29 +
  30 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  31 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
  32 +
  33 +@Api(tags = "API 访问日志")
  34 +@RestController
  35 +@RequestMapping("/system/api-access-log")
  36 +@Validated
  37 +public class SysApiAccessLogController {
  38 +
  39 + @Resource
  40 + private SysApiAccessLogService apiAccessLogService;
  41 +
  42 + @GetMapping("/get")
  43 + @ApiOperation("获得API 访问日志")
  44 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  45 + @PreAuthorize("@ss.hasPermission('system:api-access-log:query')")
  46 + public CommonResult<SysApiAccessLogRespVO> getApiAccessLog(@RequestParam("id") Long id) {
  47 + SysApiAccessLogDO apiAccessLog = apiAccessLogService.getApiAccessLog(id);
  48 + return success(SysApiAccessLogConvert.INSTANCE.convert(apiAccessLog));
  49 + }
  50 +
  51 + @GetMapping("/page")
  52 + @ApiOperation("获得API 访问日志分页")
  53 + @PreAuthorize("@ss.hasPermission('system:api-access-log:query')")
  54 + public CommonResult<PageResult<SysApiAccessLogRespVO>> getApiAccessLogPage(@Valid SysApiAccessLogPageReqVO pageVO) {
  55 + PageResult<SysApiAccessLogDO> pageResult = apiAccessLogService.getApiAccessLogPage(pageVO);
  56 + return success(SysApiAccessLogConvert.INSTANCE.convertPage(pageResult));
  57 + }
  58 +
  59 + @GetMapping("/export-excel")
  60 + @ApiOperation("导出API 访问日志 Excel")
  61 + @PreAuthorize("@ss.hasPermission('system:api-access-log:export')")
  62 + @OperateLog(type = EXPORT)
  63 + public void exportApiAccessLogExcel(@Valid SysApiAccessLogExportReqVO exportReqVO,
  64 + HttpServletResponse response) throws IOException {
  65 + List<SysApiAccessLogDO> list = apiAccessLogService.getApiAccessLogList(exportReqVO);
  66 + // 导出 Excel
  67 + List<SysApiAccessLogExcelVO> datas = SysApiAccessLogConvert.INSTANCE.convertList02(list);
  68 + ExcelUtils.write(response, "API 访问日志.xls", "数据", SysApiAccessLogExcelVO.class, datas);
  69 + }
  70 +
  71 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/apiaccesslog/SysApiAccessLogBaseVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +/**
  13 +* API 访问日志 Base VO,提供给添加、修改、详细的子 VO 使用
  14 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  15 +*/
  16 +@Data
  17 +public class SysApiAccessLogBaseVO {
  18 +
  19 + @ApiModelProperty(value = "链路追踪编号", required = true, example = "66600cb6-7852-11eb-9439-0242ac130002")
  20 + @NotNull(message = "链路追踪编号不能为空")
  21 + private String traceId;
  22 +
  23 + @ApiModelProperty(value = "用户编号", required = true, example = "666")
  24 + @NotNull(message = "用户编号不能为空")
  25 + private Long userId;
  26 +
  27 + @ApiModelProperty(value = "用户类型", required = true, example = "2", notes = "参见 UserTypeEnum 枚举")
  28 + @NotNull(message = "用户类型不能为空")
  29 + private Integer userType;
  30 +
  31 + @ApiModelProperty(value = "应用名", required = true, example = "dashboard")
  32 + @NotNull(message = "应用名不能为空")
  33 + private String applicationName;
  34 +
  35 + @ApiModelProperty(value = "请求方法名", required = true, example = "GET")
  36 + @NotNull(message = "请求方法名不能为空")
  37 + private String requestMethod;
  38 +
  39 + @ApiModelProperty(value = "请求地址", required = true, example = "/xxx/yyy")
  40 + @NotNull(message = "请求地址不能为空")
  41 + private String requestUrl;
  42 +
  43 + @ApiModelProperty(value = "Java 方法的参数")
  44 + private String requestParams;
  45 +
  46 + @ApiModelProperty(value = "用户 IP", required = true, example = "127.0.0.1")
  47 + @NotNull(message = "用户 IP不能为空")
  48 + private String userIp;
  49 +
  50 + @ApiModelProperty(value = "浏览器 UA", required = true, example = "Mozilla/5.0")
  51 + @NotNull(message = "浏览器 UA不能为空")
  52 + private String userAgent;
  53 +
  54 + @ApiModelProperty(value = "开始请求时间", required = true)
  55 + @NotNull(message = "开始请求时间不能为空")
  56 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  57 + private Date beginTime;
  58 +
  59 + @ApiModelProperty(value = "结束请求时间", required = true)
  60 + @NotNull(message = "结束请求时间不能为空")
  61 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  62 + private Date endTime;
  63 +
  64 + @ApiModelProperty(value = "执行时长", required = true, example = "100")
  65 + @NotNull(message = "执行时长不能为空")
  66 + private Integer duration;
  67 +
  68 + @ApiModelProperty(value = "结果码", required = true, example = "0")
  69 + @NotNull(message = "结果码不能为空")
  70 + private Integer resultCode;
  71 +
  72 + @ApiModelProperty(value = "结果提示", example = "芋道源码,牛逼!")
  73 + private String resultMsg;
  74 +
  75 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/apiaccesslog/SysApiAccessLogExcelVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
  2 +
  3 +import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelProperty;
  6 +import lombok.Data;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum.USER_TYPE;
  11 +
  12 +/**
  13 + * API 访问日志 Excel VO
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Data
  18 +public class SysApiAccessLogExcelVO {
  19 +
  20 + @ExcelProperty("日志主键")
  21 + private Long id;
  22 +
  23 + @ExcelProperty("链路追踪编号")
  24 + private String traceId;
  25 +
  26 + @ExcelProperty("用户编号")
  27 + private Long userId;
  28 +
  29 + @ExcelProperty(value = "用户类型", converter = DictConvert.class)
  30 + @DictFormat(USER_TYPE)
  31 + private Integer userType;
  32 +
  33 + @ExcelProperty("应用名")
  34 + private String applicationName;
  35 +
  36 + @ExcelProperty("请求方法名")
  37 + private String requestMethod;
  38 +
  39 + @ExcelProperty("请求地址")
  40 + private String requestUrl;
  41 +
  42 + @ExcelProperty("Java 方法的参数")
  43 + private String requestParams;
  44 +
  45 + @ExcelProperty("用户 IP")
  46 + private String userIp;
  47 +
  48 + @ExcelProperty("浏览器 UA")
  49 + private String userAgent;
  50 +
  51 + @ExcelProperty("开始请求时间")
  52 + private Date beginTime;
  53 +
  54 + @ExcelProperty("结束请求时间")
  55 + private Date endTime;
  56 +
  57 + @ExcelProperty("执行时长")
  58 + private Integer duration;
  59 +
  60 + @ExcelProperty("结果码")
  61 + private Integer resultCode;
  62 +
  63 + @ExcelProperty("结果提示")
  64 + private String resultMsg;
  65 +
  66 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/apiaccesslog/SysApiAccessLogExportReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import org.springframework.format.annotation.DateTimeFormat;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +@ApiModel(value = "API 访问日志 Excel 导出 Request VO", description = "参数和 SysApiAccessLogPageReqVO 是一致的")
  13 +@Data
  14 +public class SysApiAccessLogExportReqVO {
  15 +
  16 + @ApiModelProperty(value = "用户编号", example = "666")
  17 + private Long userId;
  18 +
  19 + @ApiModelProperty(value = "用户类型", example = "2")
  20 + private Integer userType;
  21 +
  22 + @ApiModelProperty(value = "应用名", example = "dashboard")
  23 + private String applicationName;
  24 +
  25 + @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配")
  26 + private String requestUrl;
  27 +
  28 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  29 + @ApiModelProperty(value = "开始开始请求时间")
  30 + private Date beginBeginTime;
  31 +
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + @ApiModelProperty(value = "结束开始请求时间")
  34 + private Date endBeginTime;
  35 +
  36 + @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
  37 + private Integer duration;
  38 +
  39 + @ApiModelProperty(value = "结果码", example = "0")
  40 + private Integer resultCode;
  41 +
  42 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/apiaccesslog/SysApiAccessLogPageReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +import org.springframework.format.annotation.DateTimeFormat;
  10 +
  11 +import java.util.Date;
  12 +
  13 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  14 +
  15 +@ApiModel("API 访问日志分页 Request VO")
  16 +@Data
  17 +@EqualsAndHashCode(callSuper = true)
  18 +@ToString(callSuper = true)
  19 +public class SysApiAccessLogPageReqVO extends PageParam {
  20 +
  21 + @ApiModelProperty(value = "用户编号", example = "666")
  22 + private Long userId;
  23 +
  24 + @ApiModelProperty(value = "用户类型", example = "2")
  25 + private Integer userType;
  26 +
  27 + @ApiModelProperty(value = "应用名", example = "dashboard")
  28 + private String applicationName;
  29 +
  30 + @ApiModelProperty(value = "请求地址", example = "/xxx/yyy", notes = "模糊匹配")
  31 + private String requestUrl;
  32 +
  33 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  34 + @ApiModelProperty(value = "开始开始请求时间")
  35 + private Date beginBeginTime;
  36 +
  37 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  38 + @ApiModelProperty(value = "结束开始请求时间")
  39 + private Date endBeginTime;
  40 +
  41 + @ApiModelProperty(value = "执行时长", example = "100", notes = "大于等于,单位:毫秒")
  42 + private Integer duration;
  43 +
  44 + @ApiModelProperty(value = "结果码", example = "0")
  45 + private Integer resultCode;
  46 +
  47 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/vo/apiaccesslog/SysApiAccessLogRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +@ApiModel("API 访问日志 Response VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class SysApiAccessLogRespVO extends SysApiAccessLogBaseVO {
  16 +
  17 + @ApiModelProperty(value = "日志主键", required = true, example = "1024")
  18 + private Long id;
  19 +
  20 + @ApiModelProperty(value = "创建时间", required = true)
  21 + private Date createTime;
  22 +
  23 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/logger/SysApiAccessLogConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.logger;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO;
  5 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExcelVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogRespVO;
  7 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
  8 +import org.mapstruct.Mapper;
  9 +import org.mapstruct.factory.Mappers;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * API 访问日志 Convert
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Mapper
  19 +public interface SysApiAccessLogConvert {
  20 +
  21 + SysApiAccessLogConvert INSTANCE = Mappers.getMapper(SysApiAccessLogConvert.class);
  22 +
  23 + SysApiAccessLogDO convert(ApiAccessLogCreateDTO bean);
  24 +
  25 + SysApiAccessLogRespVO convert(SysApiAccessLogDO bean);
  26 +
  27 + List<SysApiAccessLogRespVO> convertList(List<SysApiAccessLogDO> list);
  28 +
  29 + PageResult<SysApiAccessLogRespVO> convertPage(PageResult<SysApiAccessLogDO> page);
  30 +
  31 + List<SysApiAccessLogExcelVO> convertList02(List<SysApiAccessLogDO> list);
  32 +
  33 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/logger/SysApiAccessLogDO.java
... ... @@ -78,7 +78,7 @@ public class SysApiAccessLogDO extends BaseDO {
78 78 /**
79 79 * 开始请求时间
80 80 */
81   - private Date startTime;
  81 + private Date beginTime;
82 82 /**
83 83 * 结束请求时间
84 84 */
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/logger/SysApiAccessLogMapper.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.dal.mysql.logger;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  6 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * API 访问日志 Mapper
  15 + *
  16 + * @author 芋道源码
  17 + */
  18 +@Mapper
  19 +public interface SysApiAccessLogMapper extends BaseMapperX<SysApiAccessLogDO> {
  20 +
  21 + default PageResult<SysApiAccessLogDO> selectPage(SysApiAccessLogPageReqVO reqVO) {
  22 + return selectPage(reqVO, new QueryWrapperX<SysApiAccessLogDO>()
  23 + .eqIfPresent("user_id", reqVO.getUserId())
  24 + .eqIfPresent("user_type", reqVO.getUserType())
  25 + .eqIfPresent("application_name", reqVO.getApplicationName())
  26 + .likeIfPresent("request_url", reqVO.getRequestUrl())
  27 + .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
  28 + .geIfPresent("duration", reqVO.getDuration())
  29 + .eqIfPresent("result_code", reqVO.getResultCode())
  30 + );
  31 + }
  32 +
  33 + default List<SysApiAccessLogDO> selectList(SysApiAccessLogExportReqVO reqVO) {
  34 + return selectList(new QueryWrapperX<SysApiAccessLogDO>()
  35 + .eqIfPresent("user_id", reqVO.getUserId())
  36 + .eqIfPresent("user_type", reqVO.getUserType())
  37 + .eqIfPresent("application_name", reqVO.getApplicationName())
  38 + .likeIfPresent("request_url", reqVO.getRequestUrl())
  39 + .betweenIfPresent("begin_time", reqVO.getBeginBeginTime(), reqVO.getEndBeginTime())
  40 + .geIfPresent("duration", reqVO.getDuration())
  41 + .eqIfPresent("result_code", reqVO.getResultCode())
  42 + );
  43 + }
  44 +
  45 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java
... ... @@ -10,6 +10,8 @@ import lombok.Getter;
10 10 @AllArgsConstructor
11 11 public enum SysDictTypeEnum {
12 12  
  13 + USER_TYPE("user_type"), // 用户类型
  14 +
13 15 SYS_USER_SEX("sys_user_sex"), // 用户性别
14 16 SYS_COMMON_STATUS("sys_common_status"), // 系统状态
15 17 SYS_OPERATE_TYPE("sys_operate_type"), // 操作类型
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysApiAccessLogService.java
1 1 package cn.iocoder.dashboard.modules.system.service.logger;
2 2  
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
3 4 import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFrameworkService;
  5 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
  7 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
  8 +
  9 +import java.util.List;
4 10  
5 11 /**
6 12 * API 访问日志 Service 接口
... ... @@ -8,4 +14,29 @@ import cn.iocoder.dashboard.framework.logger.apilog.core.service.ApiAccessLogFra
8 14 * @author 芋道源码
9 15 */
10 16 public interface SysApiAccessLogService extends ApiAccessLogFrameworkService {
  17 +
  18 + /**
  19 + * 获得 API 访问日志
  20 + *
  21 + * @param id 编号
  22 + * @return API 访问日志
  23 + */
  24 + SysApiAccessLogDO getApiAccessLog(Long id);
  25 +
  26 + /**
  27 + * 获得 API 访问日志分页
  28 + *
  29 + * @param pageReqVO 分页查询
  30 + * @return API 访问日志分页
  31 + */
  32 + PageResult<SysApiAccessLogDO> getApiAccessLogPage(SysApiAccessLogPageReqVO pageReqVO);
  33 +
  34 + /**
  35 + * 获得 API 访问日志列表, 用于 Excel 导出
  36 + *
  37 + * @param exportReqVO 查询条件
  38 + * @return API 访问日志分页
  39 + */
  40 + List<SysApiAccessLogDO> getApiAccessLogList(SysApiAccessLogExportReqVO exportReqVO);
  41 +
11 42 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysApiAccessLogServiceImpl.java
1 1 package cn.iocoder.dashboard.modules.system.service.logger.impl;
2 2  
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
3 4 import cn.iocoder.dashboard.framework.logger.apilog.core.service.dto.ApiAccessLogCreateDTO;
  5 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogExportReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.apiaccesslog.SysApiAccessLogPageReqVO;
  7 +import cn.iocoder.dashboard.modules.system.convert.logger.SysApiAccessLogConvert;
  8 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysApiAccessLogDO;
  9 +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysApiAccessLogMapper;
4 10 import cn.iocoder.dashboard.modules.system.service.logger.SysApiAccessLogService;
  11 +import org.springframework.scheduling.annotation.Async;
5 12 import org.springframework.stereotype.Service;
6 13 import org.springframework.validation.annotation.Validated;
7 14  
  15 +import javax.annotation.Resource;
8 16 import javax.validation.Valid;
  17 +import java.util.List;
9 18  
10 19 /**
11 20 * API 访问日志 Service 实现类
... ... @@ -16,11 +25,30 @@ import javax.validation.Valid;
16 25 @Validated
17 26 public class SysApiAccessLogServiceImpl implements SysApiAccessLogService {
18 27  
19   -
  28 + @Resource
  29 + private SysApiAccessLogMapper apiAccessLogMapper;
20 30  
21 31 @Override
  32 + @Async
22 33 public void createApiAccessLogAsync(@Valid ApiAccessLogCreateDTO createDTO) {
  34 + // 插入
  35 + SysApiAccessLogDO apiAccessLog = SysApiAccessLogConvert.INSTANCE.convert(createDTO);
  36 + apiAccessLogMapper.insert(apiAccessLog);
  37 + }
  38 +
  39 + @Override
  40 + public SysApiAccessLogDO getApiAccessLog(Long id) {
  41 + return apiAccessLogMapper.selectById(id);
  42 + }
23 43  
  44 + @Override
  45 + public PageResult<SysApiAccessLogDO> getApiAccessLogPage(SysApiAccessLogPageReqVO pageReqVO) {
  46 + return apiAccessLogMapper.selectPage(pageReqVO);
  47 + }
  48 +
  49 + @Override
  50 + public List<SysApiAccessLogDO> getApiAccessLogList(SysApiAccessLogExportReqVO exportReqVO) {
  51 + return apiAccessLogMapper.selectList(exportReqVO);
24 52 }
25 53  
26 54 }
... ...
src/main/resources/application-dev.yaml
... ... @@ -157,7 +157,7 @@ yudao:
157 157 base-package: ${yudao.info.base-package}.modules
158 158 db-schemas: ${spring.datasource.name}
159 159 xss:
160   - enable: true
  160 + enable: false
161 161 exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
162 162 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
163 163 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
... ...
src/main/resources/application-local.yaml
... ... @@ -157,7 +157,7 @@ yudao:
157 157 base-package: ${yudao.info.base-package}.modules
158 158 db-schemas: ${spring.datasource.name}
159 159 xss:
160   - enable: true
  160 + enable: false
161 161 exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
162 162 - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
163 163 - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
... ...
src/main/resources/codegen/java/controller/controller.vm
... ... @@ -52,7 +52,7 @@ public class ${table.className}Controller {
52 52 return success(true);
53 53 }
54 54  
55   - @DeleteMapping("/delete")
  55 + @DeleteMapping("/delete")
56 56 @ApiOperation("删除${table.classComment}")
57 57 @ApiImplicitParam(name = "id", value = "编号", required = true)
58 58 @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
... ...
src/main/resources/codegen/java/service/serviceImpl.vm
... ... @@ -74,12 +74,12 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
74 74  
75 75 @Override
76 76 public PageResult<${table.className}DO> get${simpleClassName}Page(${table.className}PageReqVO pageReqVO) {
77   - return ${classNameVar}Mapper.selectPage(pageReqVO);
  77 + return ${classNameVar}Mapper.selectPage(pageReqVO);
78 78 }
79 79  
80 80 @Override
81 81 public List<${table.className}DO> get${simpleClassName}List(${table.className}ExportReqVO exportReqVO) {
82   - return ${classNameVar}Mapper.selectList(exportReqVO);
  82 + return ${classNameVar}Mapper.selectList(exportReqVO);
83 83 }
84 84  
85 85 }
... ...