文件上传对接操作日志记录

This commit is contained in:
tianliyong 2022-11-28 19:51:09 +08:00
parent 05b2739f0c
commit b0a374c800
7 changed files with 108 additions and 24 deletions

View File

@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/** /**
* OSS 启动类 * OSS 启动类
@ -14,6 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
*/ */
@Slf4j @Slf4j
@MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"})
@EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"})
@SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"})
public class Bootstrap { public class Bootstrap {

View File

@ -1,6 +1,7 @@
package cn.axzo.oss.client.controller; package cn.axzo.oss.client.controller;
import cn.axzo.core.utils.converter.BeanConverter; import cn.axzo.core.utils.converter.BeanConverter;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.common.utils.BeanConvertUtil;
import cn.axzo.oss.http.api.ServerFileServiceApi; import cn.axzo.oss.http.api.ServerFileServiceApi;
import cn.axzo.oss.http.model.*; import cn.axzo.oss.http.model.*;
@ -10,10 +11,12 @@ import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.service.api.FileService;
import cn.azxo.framework.common.model.CommonResponse; import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;
@ -30,18 +33,27 @@ public class ServerFileController implements ServerFileServiceApi {
@Autowired @Autowired
private FileService fileService; private FileService fileService;
@Autowired
private HttpServletRequest httpServletRequest;
@Override @Override
public CommonResponse<ServerFileUploadResponse> upload(@Valid @RequestBody ServerFileUploadRequest request) { public CommonResponse<ServerFileUploadResponse> upload(@Valid @RequestBody ServerFileUploadRequest request) {
ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class);
request.setFileContent(null); request.setFileContent(null);
return CommonResponse.success(BeanConverter.convert(fileService.upload(dto), ServerFileUploadResponse.class)); // 获取feign调用请求头携带的用户信息
String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE");
ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class);
return CommonResponse.success(BeanConverter.convert(fileService.upload(dto, liteSaasContext), ServerFileUploadResponse.class));
} }
@Override @Override
public CommonResponse<FileInformationResponse> uploadV2(ServerFileUploadRequest request) { public CommonResponse<FileInformationResponse> uploadV2(ServerFileUploadRequest request) {
ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class);
request.setFileContent(null); request.setFileContent(null);
return CommonResponse.success(BeanConverter.convert(fileService.uploadV2(dto), FileInformationResponse.class)); // 获取feign调用请求头携带的用户信息
String contextInfoLiteJsonStr = httpServletRequest.getHeader("X-CONTEXT-INFO-LITE");
ContextInfo.LiteSaasContext liteSaasContext = JSONUtil.toBean(contextInfoLiteJsonStr, ContextInfo.LiteSaasContext.class);
return CommonResponse.success(BeanConverter.convert(fileService.uploadV2(dto, liteSaasContext), FileInformationResponse.class));
} }
/** /**

View File

@ -1,6 +1,8 @@
package cn.axzo.oss.client.controller; package cn.axzo.oss.client.controller;
import cn.axzo.core.utils.converter.BeanConverter; import cn.axzo.core.utils.converter.BeanConverter;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.framework.auth.domain.ContextInfoHolder;
import cn.axzo.oss.client.vo.FileInformationVo; import cn.axzo.oss.client.vo.FileInformationVo;
import cn.axzo.oss.client.vo.FindFileUrlVo; import cn.axzo.oss.client.vo.FindFileUrlVo;
import cn.axzo.oss.client.vo.WebFileUploadVo; import cn.axzo.oss.client.vo.WebFileUploadVo;
@ -38,17 +40,46 @@ public class WebFileController {
public CommonResponse<WebFileUploadVo> upload(@Valid @RequestParam String appCode, public CommonResponse<WebFileUploadVo> upload(@Valid @RequestParam String appCode,
@Valid @RequestParam String bizScene, @Valid @RequestParam String bizScene,
@Valid @RequestParam MultipartFile file) { @Valid @RequestParam MultipartFile file) {
//获取用户信息
ContextInfo.LiteSaasContext liteSaasContext = null;
ContextInfo contextInfo = ContextInfoHolder.get();
if (contextInfo != null) {
liteSaasContext = contextInfo.lite();
}
ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder() ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder()
.appCode(appCode) .appCode(appCode)
.bizScene(bizScene) .bizScene(bizScene)
.fileName(file.getOriginalFilename()) .fileName(file.getOriginalFilename())
.fileContent(file.getBytes()) .fileContent(file.getBytes())
.build(); .build();
ServerFileUploadResponse response = fileService.upload(fileUploadDto); ServerFileUploadResponse response = fileService.upload(fileUploadDto, liteSaasContext);
WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class); WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class);
return CommonResponse.success(result); return CommonResponse.success(result);
} }
@PostMapping("/v2/file")
@CrossOrigin
@SneakyThrows
public CommonResponse<FileInformationVo> uploadV2(@Valid @RequestParam String appCode,
@Valid @RequestParam String bizScene,
@Valid @RequestParam MultipartFile file) {
//获取用户信息
ContextInfo.LiteSaasContext liteSaasContext = null;
ContextInfo contextInfo = ContextInfoHolder.get();
if (contextInfo != null) {
liteSaasContext = contextInfo.lite();
}
ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder()
.appCode(appCode)
.bizScene(bizScene)
.fileName(file.getOriginalFilename())
.fileContent(file.getBytes())
.build();
FileInformationResponse response = fileService.uploadV2(fileUploadDto, liteSaasContext);
FileInformationVo result = BeanConvertUtil.copyBean(response, FileInformationVo.class);
return CommonResponse.success(result);
}
@SneakyThrows @SneakyThrows
@PostMapping("/v1/file/getUrl") @PostMapping("/v1/file/getUrl")
@CrossOrigin @CrossOrigin
@ -61,21 +92,4 @@ public class WebFileController {
List<FindFileUrlResponse> response = fileService.findFileUrl(dto); List<FindFileUrlResponse> response = fileService.findFileUrl(dto);
return CommonResponse.success(BeanConverter.convert(response, FindFileUrlVo.class)); return CommonResponse.success(BeanConverter.convert(response, FindFileUrlVo.class));
} }
@PostMapping("/v2/file")
@CrossOrigin
@SneakyThrows
public CommonResponse<FileInformationVo> uploadV2(@Valid @RequestParam String appCode,
@Valid @RequestParam String bizScene,
@Valid @RequestParam MultipartFile file) {
ServerFileUploadDto fileUploadDto = ServerFileUploadDto.builder()
.appCode(appCode)
.bizScene(bizScene)
.fileName(file.getOriginalFilename())
.fileContent(file.getBytes())
.build();
FileInformationResponse response = fileService.uploadV2(fileUploadDto);
FileInformationVo result = BeanConvertUtil.copyBean(response, FileInformationVo.class);
return CommonResponse.success(result);
}
} }

View File

@ -22,6 +22,10 @@
<groupId>cn.axzo.oss</groupId> <groupId>cn.axzo.oss</groupId>
<artifactId>oss-manager-api</artifactId> <artifactId>oss-manager-api</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.axzo.platform</groupId>
<artifactId>axzo-log-api</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,5 +1,6 @@
package cn.axzo.oss.service.api; package cn.axzo.oss.service.api;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
@ -31,11 +32,11 @@ public interface FileService {
* *
* @param request * @param request
*/ */
ServerFileUploadResponse upload(ServerFileUploadDto request); ServerFileUploadResponse upload(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext);
List<FindFileUrlResponse> findFileUrl(FindFileUrlDto dto); List<FindFileUrlResponse> findFileUrl(FindFileUrlDto dto);
List<FindFileKeyResponse> findFileKey(FindFileKeyDto dto); List<FindFileKeyResponse> findFileKey(FindFileKeyDto dto);
FileInformationResponse uploadV2(ServerFileUploadDto request); FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext);
} }

View File

@ -1,5 +1,10 @@
package cn.axzo.oss.service.impl; package cn.axzo.oss.service.impl;
import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.framework.auth.domain.ContextInfoHolder;
import cn.axzo.framework.auth.domain.UserInfo;
import cn.axzo.log.platform.client.LogPlatClient;
import cn.axzo.log.platform.client.model.OperateLogReq;
import cn.axzo.oss.common.constans.CommonConstants; import cn.axzo.oss.common.constans.CommonConstants;
import cn.axzo.oss.common.constans.CommonConstants.FileStatus; import cn.axzo.oss.common.constans.CommonConstants.FileStatus;
import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.common.constans.CommonConstants.TableDelete;
@ -25,13 +30,17 @@ import cn.axzo.oss.manager.api.dto.response.FindFileKeyResponse;
import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse; import cn.axzo.oss.manager.api.dto.response.FindFileUrlResponse;
import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse;
import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.service.api.FileService;
import cn.azxo.framework.common.utils.LogUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -60,6 +69,12 @@ public class FileServiceImpl implements FileService {
@Autowired @Autowired
private FileUploadConfigManager fileUploadConfigManager; private FileUploadConfigManager fileUploadConfigManager;
@Autowired
private Environment environment;
@Autowired
private LogPlatClient logPlatClient;
/** /**
* 删除文件 * 删除文件
@ -113,17 +128,47 @@ public class FileServiceImpl implements FileService {
* @param dto * @param dto
*/ */
@Override @Override
public ServerFileUploadResponse upload(ServerFileUploadDto dto) { public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) {
File ossFile = uploadFileAndGetFile(dto); File ossFile = uploadFileAndGetFile(dto);
//操作日志记录
operateLog(JSON.toJSONString(dto), liteSaasContext);
return setResponse(ossFile); return setResponse(ossFile);
} }
@Override @Override
public FileInformationResponse uploadV2(ServerFileUploadDto request) { public FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) {
File ossFile = uploadFileAndGetFile(request); File ossFile = uploadFileAndGetFile(request);
//操作日志记录
operateLog(JSON.toJSONString(request), liteSaasContext);
return setFileInfoResp(ossFile); return setFileInfoResp(ossFile);
} }
/**
* 操作日志记录
*/
private void operateLog(String param, ContextInfo.LiteSaasContext liteSaasContext) {
if (liteSaasContext == null || liteSaasContext.getIdentityId() == null || liteSaasContext.getIdentityType() == null) {
log.warn("获取用户上下文信息失败");
return;
}
//记录日志
try {
OperateLogReq log = OperateLogReq.builder()
.serviceName(environment.getProperty("spring.application.name"))
.featureName("oss文件上传")
.operateTime(new Date())
.identityId(liteSaasContext.getIdentityId())
.identityType(liteSaasContext.getIdentityType())
.operateParam(param)
.workspaceId(liteSaasContext.getWorkspaceId())
.operateType(1)
.build();
logPlatClient.createOperateLog(log);
} catch (Exception e) {
log.warn("服务间调用异常-发送日志失败: errMsg={}.", e.getMessage());
}
}
private File uploadFileAndGetFile(ServerFileUploadDto dto) { private File uploadFileAndGetFile(ServerFileUploadDto dto) {
log.info("update fileName:{},appCode:{},bizScene:{}", log.info("update fileName:{},appCode:{},bizScene:{}",
dto.getFileName(), dto.getAppCode(), dto.getBizScene()); dto.getFileName(), dto.getAppCode(), dto.getBizScene());

View File

@ -20,6 +20,7 @@
<axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version> <axzo-bom.version>2.0.0-SNAPSHOT</axzo-bom.version>
<axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version> <axzo-dependencies.version>2.0.0-SNAPSHOT</axzo-dependencies.version>
<aliyun-oss.version>3.10.2</aliyun-oss.version> <aliyun-oss.version>3.10.2</aliyun-oss.version>
<axzo-log-api.version>1.0.0-SNAPSHOT</axzo-log-api.version>
</properties> </properties>
<modules> <modules>
@ -95,6 +96,11 @@
<artifactId>aliyun-sdk-oss</artifactId> <artifactId>aliyun-sdk-oss</artifactId>
<version>${aliyun-oss.version}</version> <version>${aliyun-oss.version}</version>
</dependency> </dependency>
<dependency>
<groupId>cn.axzo.platform</groupId>
<artifactId>axzo-log-api</artifactId>
<version>${axzo-log-api.version}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>