diff --git a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java index d82dbe1..3776998 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/Bootstrap.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; /** * OSS 启动类 @@ -14,6 +15,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; */ @Slf4j @MapperScan(basePackages = {"cn.axzo.oss.dal.mapper"}) +@EnableFeignClients(basePackages = {"cn.axzo.log.platform.client"}) @SpringBootApplication(scanBasePackages = {"cn.axzo.oss"}) public class Bootstrap { diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 0be984e..0933f33 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -1,6 +1,7 @@ package cn.axzo.oss.client.controller; 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.http.api.ServerFileServiceApi; 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.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; +import cn.hutool.json.JSONUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.List; @@ -30,18 +33,27 @@ public class ServerFileController implements ServerFileServiceApi { @Autowired private FileService fileService; + @Autowired + private HttpServletRequest httpServletRequest; + @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); 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 public CommonResponse uploadV2(ServerFileUploadRequest request) { ServerFileUploadDto dto = BeanConvertUtil.copyBean(request, ServerFileUploadDto.class); 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)); } /** diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java index e8531e4..07a51e9 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/WebFileController.java @@ -1,6 +1,8 @@ package cn.axzo.oss.client.controller; 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.FindFileUrlVo; import cn.axzo.oss.client.vo.WebFileUploadVo; @@ -38,17 +40,46 @@ public class WebFileController { public CommonResponse upload(@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(); - ServerFileUploadResponse response = fileService.upload(fileUploadDto); + ServerFileUploadResponse response = fileService.upload(fileUploadDto, liteSaasContext); WebFileUploadVo result = BeanConvertUtil.copyBean(response, WebFileUploadVo.class); return CommonResponse.success(result); } + @PostMapping("/v2/file") + @CrossOrigin + @SneakyThrows + public CommonResponse 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 @PostMapping("/v1/file/getUrl") @CrossOrigin @@ -61,21 +92,4 @@ public class WebFileController { List response = fileService.findFileUrl(dto); return CommonResponse.success(BeanConverter.convert(response, FindFileUrlVo.class)); } - - @PostMapping("/v2/file") - @CrossOrigin - @SneakyThrows - public CommonResponse 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); - } } diff --git a/oss-service-api/pom.xml b/oss-service-api/pom.xml index a69251c..b90326c 100644 --- a/oss-service-api/pom.xml +++ b/oss-service-api/pom.xml @@ -22,6 +22,10 @@ cn.axzo.oss oss-manager-api + + cn.axzo.platform + axzo-log-api + diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index 8de549d..eb5d8f9 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -1,5 +1,6 @@ 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.FindFileUrlDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; @@ -31,11 +32,11 @@ public interface FileService { * * @param request */ - ServerFileUploadResponse upload(ServerFileUploadDto request); + ServerFileUploadResponse upload(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); List findFileUrl(FindFileUrlDto dto); List findFileKey(FindFileKeyDto dto); - FileInformationResponse uploadV2(ServerFileUploadDto request); + FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 3b016dd..66ba8f1 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -1,5 +1,10 @@ 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.FileStatus; 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.ServerFileUploadResponse; import cn.axzo.oss.service.api.FileService; +import cn.azxo.framework.common.utils.LogUtil; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -60,6 +69,12 @@ public class FileServiceImpl implements FileService { @Autowired private FileUploadConfigManager fileUploadConfigManager; + @Autowired + private Environment environment; + + + @Autowired + private LogPlatClient logPlatClient; /** * 删除文件 @@ -113,17 +128,47 @@ public class FileServiceImpl implements FileService { * @param dto */ @Override - public ServerFileUploadResponse upload(ServerFileUploadDto dto) { + public ServerFileUploadResponse upload(ServerFileUploadDto dto, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(dto); + //操作日志记录 + operateLog(JSON.toJSONString(dto), liteSaasContext); return setResponse(ossFile); } @Override - public FileInformationResponse uploadV2(ServerFileUploadDto request) { + public FileInformationResponse uploadV2(ServerFileUploadDto request, ContextInfo.LiteSaasContext liteSaasContext) { File ossFile = uploadFileAndGetFile(request); + //操作日志记录 + operateLog(JSON.toJSONString(request), liteSaasContext); 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) { log.info("update fileName:{},appCode:{},bizScene:{}", dto.getFileName(), dto.getAppCode(), dto.getBizScene()); diff --git a/pom.xml b/pom.xml index 69dfc62..97760d7 100644 --- a/pom.xml +++ b/pom.xml @@ -20,6 +20,7 @@ 2.0.0-SNAPSHOT 2.0.0-SNAPSHOT 3.10.2 + 1.0.0-SNAPSHOT @@ -95,6 +96,11 @@ aliyun-sdk-oss ${aliyun-oss.version} + + cn.axzo.platform + axzo-log-api + ${axzo-log-api.version} +