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 4ecb38f..547b533 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,9 +1,12 @@ package cn.axzo.oss.client.controller; +import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.http.api.ServerFileServiceApi; import cn.axzo.oss.http.model.ServerFileDeleteRequest; import cn.axzo.oss.http.model.ServerFileUploadRequest; import cn.axzo.oss.http.model.ServerFileUploadResponse; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.service.api.FileService; import cn.azxo.framework.common.model.CommonResponse; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @@ -20,7 +23,11 @@ import javax.validation.Valid; @RestController public class ServerFileController implements ServerFileServiceApi { + private final FileService fileService; + public ServerFileController(FileService fileService) { + this.fileService = fileService; + } @Override public CommonResponse upload(@Valid @RequestBody ServerFileUploadRequest request) { @@ -29,6 +36,8 @@ public class ServerFileController implements ServerFileServiceApi { @Override public CommonResponse delete(@Valid @RequestBody ServerFileDeleteRequest request) { - return null; + ServerFileDeleteDto dto = BeanConvertUtil.copyBean(request, ServerFileDeleteDto.class); + fileService.delete(dto); + return CommonResponse.success(); } } diff --git a/oss-common/pom.xml b/oss-common/pom.xml index 07e736d..8d70337 100644 --- a/oss-common/pom.xml +++ b/oss-common/pom.xml @@ -70,6 +70,10 @@ org.projectlombok lombok + + commons-codec + commons-codec + diff --git a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java index 5563e0a..7de66a0 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/constans/CommonConstants.java @@ -8,4 +8,12 @@ package cn.axzo.oss.common.constans; * @since 2021-07-15 11:45 */ public abstract class CommonConstants { + + /** + * 是否删除 + */ + public interface TableDelete { + Integer UN_DELETE = 0; + Integer DELETE = 1; + } } diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java new file mode 100644 index 0000000..32a54cd --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/BeanConvertUtil.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.common.utils; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeansException; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:53 + * @Version 0.0.1 + **/ +@Slf4j +public class BeanConvertUtil { + + public static T copyBean(Object source, Class targetCls) { + T target = null; + if (Utility.objIsNotNull(source)) { + try { + target = BeanUtils.instantiateClass(targetCls); + BeanUtils.copyProperties(source, target); + } catch (BeansException e) { + log.warn("copyBean error, e = {}", e); + } + } + return target; + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java new file mode 100644 index 0000000..f834e39 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/JsonUtil.java @@ -0,0 +1,21 @@ +package cn.axzo.oss.common.utils; + +import com.alibaba.fastjson.JSONObject; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 23:37 + * @Version 0.0.1 + **/ +public class JsonUtil { + + /** + * 对象转json字符串 + * @param obj + * @return + */ + public static String obj2Str(Object obj){ + return JSONObject.toJSONString(obj); + } +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java new file mode 100644 index 0000000..3ee13e7 --- /dev/null +++ b/oss-common/src/main/java/cn/axzo/oss/common/utils/Utility.java @@ -0,0 +1,74 @@ +package cn.axzo.oss.common.utils; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Objects; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Hex; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:54 + * @Version 0.0.1 + **/ + +@Slf4j +public class Utility { + + /** + * 判断对象为null + * @param obj + * @return + */ + public static boolean objIsNull(Object obj){ + return Objects.isNull(obj); + } + + /** + * 判断对象不为null + * @param obj + * @return + */ + public static boolean objIsNotNull(Object obj){ + return !Objects.isNull(obj); + } + + /** + * 字符串为空 + * @return + */ + public static boolean isBlank(String str){ + int strLen; + if (str == null || (strLen = str.length()) == 0){ + return Boolean.TRUE; + } + for (int i = 0; i< strLen; i++){ + if ((Character.isWhitespace(str.charAt(i)) == false)){ + return false; + } + } + return true; + } + + /** + * 获取md5摘要 + * @param content + * @return + */ + public static String getMd5(String content){ + if (isBlank(content)){ + return content; + } + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + md5.reset(); + md5.update(content.getBytes(StandardCharsets.UTF_8)); + return Hex.encodeHexString(md5.digest()); + } catch (NoSuchAlgorithmException e) { + log.warn("getMd5 fail = {}",e.getMessage()); + } + return content; + } +} diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java index 8da293e..e009589 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileDao.java @@ -13,4 +13,10 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface FileDao extends IService { + /** + * 根据url md5获取文件信息 + * @param urlMd5 + * @return + */ + File getFileByUrlMd5(String urlMd5); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java index 83924b6..bd5c4fe 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileDaoImpl.java @@ -1,5 +1,7 @@ package cn.axzo.oss.dal.repository.impl; +import cn.axzo.oss.common.constans.CommonConstants; +import cn.axzo.oss.common.constans.CommonConstants.TableDelete; import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.mapper.FileMapper; import cn.axzo.oss.dal.repository.FileDao; @@ -17,4 +19,9 @@ import org.springframework.stereotype.Repository; @Repository("fileDao") public class FileDaoImpl extends ServiceImpl implements FileDao { + @Override + public File getFileByUrlMd5(String urlMd5) { + return lambdaQuery().eq(File::getUrlMd5, urlMd5).eq(File::getIsDelete, TableDelete.UN_DELETE) + .last("limit 1").one(); + } } diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java index 5c7e07c..7bc9314 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/ServerFileDeleteRequest.java @@ -17,6 +17,4 @@ public class ServerFileDeleteRequest { @NotBlank(message = "url must not be null") private String url; - private String appCode; - } diff --git a/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java new file mode 100644 index 0000000..464f6a1 --- /dev/null +++ b/oss-integration/src/main/java/cn/axzo/oss/integration/s3/base/BaseS3Service.java @@ -0,0 +1,13 @@ +package cn.axzo.oss.integration.s3.base; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 23:46 + * @Version 0.0.1 + **/ +public interface BaseS3Service { + int RECORD_LIMIT = 100; + // ttl 15m; 60 * 15 = 900s + int DEFAULT_TTL_S = 900; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java new file mode 100644 index 0000000..7237a23 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileManager.java @@ -0,0 +1,14 @@ +package cn.axzo.oss.manager.api; + +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +public interface FileManager { + + boolean delete(ServerFileDeleteDto dto); +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java new file mode 100644 index 0000000..87ac31e --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/ServerFileDeleteDto.java @@ -0,0 +1,15 @@ +package cn.axzo.oss.manager.api.dto.request; + +import lombok.Data; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:50 + * @Version 0.0.1 + **/ +@Data +public class ServerFileDeleteDto { + private String url; + private String operator; +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java new file mode 100644 index 0000000..83b4ee5 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/response/ServerFileDeleteResponse.java @@ -0,0 +1,11 @@ +package cn.axzo.oss.manager.api.dto.response; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:51 + * @Version 0.0.1 + **/ +public class ServerFileDeleteResponse { + +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java new file mode 100644 index 0000000..382212c --- /dev/null +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileManagerImpl.java @@ -0,0 +1,24 @@ +package cn.axzo.oss.manager.impl; + +import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +@Service +@Slf4j +public class FileManagerImpl implements FileManager { + + @Override + public boolean delete(ServerFileDeleteDto dto) { +return Boolean.TRUE; + } +} 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 new file mode 100644 index 0000000..13b31a2 --- /dev/null +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -0,0 +1,18 @@ +package cn.axzo.oss.service.api; + +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +public interface FileService { + + /** + * 删除文件 + * @param dto + */ + void delete(ServerFileDeleteDto dto); +} 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 new file mode 100644 index 0000000..0f2852b --- /dev/null +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -0,0 +1,61 @@ +package cn.axzo.oss.service.impl; + +import cn.axzo.oss.common.constans.CommonConstants.TableDelete; +import cn.axzo.oss.common.utils.JsonUtil; +import cn.axzo.oss.common.utils.Utility; +import cn.axzo.oss.dal.entity.File; +import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.manager.api.FileManager; +import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; +import cn.axzo.oss.service.api.FileService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author admin + * @Description + * @Date 2021/7/28 22:48 + * @Version 0.0.1 + **/ +@Service +@Slf4j +public class FileServiceImpl implements FileService { + + private final FileManager fileManager; + + private final FileDao fileDao; + + public FileServiceImpl(FileManager fileManager, FileDao fileDao) { + this.fileManager = fileManager; + this.fileDao = fileDao; + } + + /** + * 删除文件 + * @param dto + */ + @Override + public void delete(ServerFileDeleteDto dto) { + log.info("delete dto = {}", JsonUtil.obj2Str(dto)); + if (Utility.isBlank(dto.getUrl())){ + log.warn("delete url is null"); + return; + } + String urlMd5 = Utility.getMd5(dto.getUrl()); + log.info("delete urlMd5 = {}", urlMd5); + File file = fileDao.getFileByUrlMd5(urlMd5); + if (Utility.objIsNull(file)){ + log.warn("delete file is null, urlMd5 = {}", urlMd5); + return; + } + boolean deleteFlag = fileManager.delete(dto); + log.info("delete deleteFlag = {}", deleteFlag); + if (deleteFlag){ + file.setIsDelete(TableDelete.DELETE); + file.setUpdateBy(dto.getOperator()); + file.setUpdateAt(null); + fileDao.updateById(file); + } + } +} diff --git a/pom.xml b/pom.xml index 39ffefb..1ab4c50 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ 2.0 2.2.1.RELEASE Hoxton.SR6 + 1.10 @@ -157,6 +158,11 @@ xxl-job-core ${xxl.job.version} + + commons-codec + commons-codec + ${commons-codec.version} +