Commit 0678fb7ca02834996616cde27c76bca9c20d9b0c
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
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
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 | } | ... | ... |