mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 22:57:17 +08:00 
			
		
		
		
	refactor: 重构日志持久层接口本地实现类
This commit is contained in:
		| @@ -22,6 +22,7 @@ import cn.hutool.core.collection.CollUtil; | |||||||
| import cn.hutool.core.convert.Convert; | import cn.hutool.core.convert.Convert; | ||||||
| import cn.hutool.core.map.MapUtil; | import cn.hutool.core.map.MapUtil; | ||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
|  | import cn.hutool.core.util.URLUtil; | ||||||
| import cn.hutool.http.HttpStatus; | import cn.hutool.http.HttpStatus; | ||||||
| import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||||
| import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||||
| @@ -43,7 +44,6 @@ import top.continew.starter.log.core.model.LogResponse; | |||||||
| import top.continew.starter.web.autoconfigure.trace.TraceProperties; | import top.continew.starter.web.autoconfigure.trace.TraceProperties; | ||||||
| import top.continew.starter.web.model.R; | import top.continew.starter.web.model.R; | ||||||
|  |  | ||||||
| import java.net.URI; |  | ||||||
| import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||||
| import java.time.ZoneId; | import java.time.ZoneId; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| @@ -66,63 +66,101 @@ public class LogDaoLocalImpl implements LogDao { | |||||||
|     @Override |     @Override | ||||||
|     public void add(LogRecord logRecord) { |     public void add(LogRecord logRecord) { | ||||||
|         LogDO logDO = new LogDO(); |         LogDO logDO = new LogDO(); | ||||||
|         logDO.setDescription(logRecord.getDescription()); |         // 设置请求信息 | ||||||
|         String module = logRecord.getModule(); |  | ||||||
|         logDO.setModule(StrUtils.blankToDefault(module, null, m -> m.replace("API", StringConstants.EMPTY).trim())); |  | ||||||
|         logDO.setCreateTime(LocalDateTime.ofInstant(logRecord.getTimestamp(), ZoneId.systemDefault())); |  | ||||||
|         logDO.setTimeTaken(logRecord.getTimeTaken().toMillis()); |  | ||||||
|         // 请求信息 |  | ||||||
|         LogRequest logRequest = logRecord.getRequest(); |         LogRequest logRequest = logRecord.getRequest(); | ||||||
|  |         this.setRequest(logDO, logRequest); | ||||||
|  |         // 设置响应信息 | ||||||
|  |         LogResponse logResponse = logRecord.getResponse(); | ||||||
|  |         this.setResponse(logDO, logResponse); | ||||||
|  |         // 设置基本信息 | ||||||
|  |         logDO.setDescription(logRecord.getDescription()); | ||||||
|  |         logDO.setModule(StrUtils.blankToDefault(logRecord.getModule(), null, m -> m | ||||||
|  |             .replace("API", StringConstants.EMPTY) | ||||||
|  |             .trim())); | ||||||
|  |         logDO.setTimeTaken(logRecord.getTimeTaken().toMillis()); | ||||||
|  |         logDO.setCreateTime(LocalDateTime.ofInstant(logRecord.getTimestamp(), ZoneId.systemDefault())); | ||||||
|  |         // 设置操作人 | ||||||
|  |         this.setCreateUser(logDO, logRequest, logResponse); | ||||||
|  |         logMapper.insert(logDO); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 设置请求信息 | ||||||
|  |      * | ||||||
|  |      * @param logDO      日志信息 | ||||||
|  |      * @param logRequest 请求信息 | ||||||
|  |      */ | ||||||
|  |     private void setRequest(LogDO logDO, LogRequest logRequest) { | ||||||
|         logDO.setRequestMethod(logRequest.getMethod()); |         logDO.setRequestMethod(logRequest.getMethod()); | ||||||
|         URI requestUrl = logRequest.getUrl(); |         logDO.setRequestUrl(logRequest.getUrl().toString()); | ||||||
|         String requestUri = requestUrl.getPath(); |         logDO.setRequestHeaders(JSONUtil.toJsonStr(logRequest.getHeaders())); | ||||||
|         logDO.setRequestUrl(requestUrl.toString()); |         logDO.setRequestBody(logRequest.getBody()); | ||||||
|         Map<String, String> requestHeaderMap = logRequest.getHeaders(); |  | ||||||
|         logDO.setRequestHeaders(JSONUtil.toJsonStr(requestHeaderMap)); |  | ||||||
|         String requestBody = logRequest.getBody(); |  | ||||||
|         logDO.setRequestBody(requestBody); |  | ||||||
|         logDO.setIp(logRequest.getIp()); |         logDO.setIp(logRequest.getIp()); | ||||||
|         logDO.setAddress(logRequest.getAddress()); |         logDO.setAddress(logRequest.getAddress()); | ||||||
|         logDO.setBrowser(logRequest.getBrowser()); |         logDO.setBrowser(logRequest.getBrowser()); | ||||||
|         logDO.setOs(StrUtil.subBefore(logRequest.getOs(), " or", false)); |         logDO.setOs(StrUtil.subBefore(logRequest.getOs(), " or", false)); | ||||||
|         // 响应信息 |     } | ||||||
|         LogResponse logResponse = logRecord.getResponse(); |  | ||||||
|         Integer statusCode = logResponse.getStatus(); |     /** | ||||||
|         logDO.setStatusCode(statusCode); |      * 设置响应信息 | ||||||
|  |      * | ||||||
|  |      * @param logDO       日志信息 | ||||||
|  |      * @param logResponse 响应信息 | ||||||
|  |      */ | ||||||
|  |     private void setResponse(LogDO logDO, LogResponse logResponse) { | ||||||
|         Map<String, String> responseHeaders = logResponse.getHeaders(); |         Map<String, String> responseHeaders = logResponse.getHeaders(); | ||||||
|         logDO.setResponseHeaders(JSONUtil.toJsonStr(responseHeaders)); |         logDO.setResponseHeaders(JSONUtil.toJsonStr(responseHeaders)); | ||||||
|         logDO.setTraceId(responseHeaders.get(traceProperties.getHeaderName())); |         logDO.setTraceId(responseHeaders.get(traceProperties.getHeaderName())); | ||||||
|         String responseBody = logResponse.getBody(); |         String responseBody = logResponse.getBody(); | ||||||
|         logDO.setResponseBody(responseBody); |         logDO.setResponseBody(responseBody); | ||||||
|         // 状态 |         // 状态 | ||||||
|  |         Integer statusCode = logResponse.getStatus(); | ||||||
|  |         logDO.setStatusCode(statusCode); | ||||||
|         logDO.setStatus(statusCode >= HttpStatus.HTTP_BAD_REQUEST ? LogStatusEnum.FAILURE : LogStatusEnum.SUCCESS); |         logDO.setStatus(statusCode >= HttpStatus.HTTP_BAD_REQUEST ? LogStatusEnum.FAILURE : LogStatusEnum.SUCCESS); | ||||||
|         if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) { |         if (StrUtil.isNotBlank(responseBody)) { | ||||||
|             R result = JSONUtil.toBean(responseBody, R.class); |             R result = JSONUtil.toBean(responseBody, R.class); | ||||||
|             if (!result.isSuccess()) { |             if (!result.isSuccess()) { | ||||||
|                 logDO.setStatus(LogStatusEnum.FAILURE); |                 logDO.setStatus(LogStatusEnum.FAILURE); | ||||||
|                 logDO.setErrorMsg(result.getMsg()); |                 logDO.setErrorMsg(result.getMsg()); | ||||||
|             } |             } | ||||||
|             // 操作人 |         } | ||||||
|             if (requestUri.startsWith(SysConstants.LOGOUT_URI)) { |     } | ||||||
|                 Long loginId = Convert.toLong(result.getData(), -1L); |  | ||||||
|                 logDO.setCreateUser(-1 != loginId ? loginId : null); |     /** | ||||||
|             } else if (result.isSuccess() && requestUri.startsWith(SysConstants.LOGIN_URI)) { |      * 设置操作人 | ||||||
|  |      * | ||||||
|  |      * @param logDO       日志信息 | ||||||
|  |      * @param logRequest  请求信息 | ||||||
|  |      * @param logResponse 响应信息 | ||||||
|  |      */ | ||||||
|  |     private void setCreateUser(LogDO logDO, LogRequest logRequest, LogResponse logResponse) { | ||||||
|  |         String requestUri = URLUtil.getPath(logDO.getRequestUrl()); | ||||||
|  |         // 解析退出接口信息 | ||||||
|  |         String responseBody = logResponse.getBody(); | ||||||
|  |         if (requestUri.startsWith(SysConstants.LOGOUT_URI) && StrUtil.isNotBlank(responseBody)) { | ||||||
|  |             R result = JSONUtil.toBean(responseBody, R.class); | ||||||
|  |             logDO.setCreateUser(Convert.toLong(result.getData(), null)); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         // 解析登录接口信息 | ||||||
|  |         if (requestUri.startsWith(SysConstants.LOGIN_URI) && LogStatusEnum.SUCCESS.equals(logDO.getStatus())) { | ||||||
|  |             String requestBody = logRequest.getBody(); | ||||||
|             AccountLoginReq loginReq = JSONUtil.toBean(requestBody, AccountLoginReq.class); |             AccountLoginReq loginReq = JSONUtil.toBean(requestBody, AccountLoginReq.class); | ||||||
|             logDO.setCreateUser(ExceptionUtils.exToNull(() -> userService.getByUsername(loginReq.getUsername()) |             logDO.setCreateUser(ExceptionUtils.exToNull(() -> userService.getByUsername(loginReq.getUsername()) | ||||||
|                 .getId())); |                 .getId())); | ||||||
|  |             return; | ||||||
|         } |         } | ||||||
|         } |         // 解析 Token 信息 | ||||||
|         // 操作人 |         Map<String, String> requestHeaders = logRequest.getHeaders(); | ||||||
|         String headerName = HttpHeaders.AUTHORIZATION; |         String headerName = HttpHeaders.AUTHORIZATION; | ||||||
|         boolean isContains = CollUtil.containsAny(requestHeaderMap.keySet(), Set.of(headerName, headerName |         boolean isContainsAuthHeader = CollUtil.containsAny(requestHeaders.keySet(), Set.of(headerName, headerName | ||||||
|             .toLowerCase())); |             .toLowerCase())); | ||||||
|         if (!requestUri.startsWith(SysConstants.LOGOUT_URI) && MapUtil.isNotEmpty(requestHeaderMap) && isContains) { |         if (MapUtil.isNotEmpty(requestHeaders) && isContainsAuthHeader) { | ||||||
|             String authorization = requestHeaderMap.getOrDefault(headerName, requestHeaderMap.get(headerName |             String authorization = requestHeaders.getOrDefault(headerName, requestHeaders.get(headerName | ||||||
|                 .toLowerCase())); |                 .toLowerCase())); | ||||||
|             String token = authorization.replace(SaManager.getConfig() |             String token = authorization.replace(SaManager.getConfig() | ||||||
|                 .getTokenPrefix() + StringConstants.SPACE, StringConstants.EMPTY); |                 .getTokenPrefix() + StringConstants.SPACE, StringConstants.EMPTY); | ||||||
|             logDO.setCreateUser(Convert.toLong(StpUtil.getLoginIdByToken(token))); |             logDO.setCreateUser(Convert.toLong(StpUtil.getLoginIdByToken(token))); | ||||||
|         } |         } | ||||||
|         logMapper.insert(logDO); |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user