diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java index 06813c8..c72b2e4 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/SmsInitConfig.java @@ -1,18 +1,20 @@ package com.schisandra.auth.application.config; -import com.schisandra.auth.common.constants.SmsConfigConstant; +import cn.hutool.core.util.ObjectUtil; +import com.schisandra.auth.application.context.SmsConfigContext; import com.schisandra.auth.common.redis.RedisUtil; import com.schisandra.auth.infra.entity.SmsConfigInfo; import com.schisandra.auth.infra.rpc.SmsConfigRpc; +import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.core.factory.SmsFactory; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.event.ContextRefreshedEvent; -import org.springframework.context.event.EventListener; +import org.springframework.context.SmartLifecycle; +import org.springframework.stereotype.Component; import javax.annotation.Resource; -//@Configuration -public class SmsInitConfig { +@Component +@Slf4j +public class SmsInitConfig implements SmartLifecycle { @Resource SmsReadConfig smsReadConfig; @Resource @@ -21,12 +23,31 @@ public class SmsInitConfig { @Resource RedisUtil redisUtil; + private final String smsConfigPrefix="sys.config.sms"; - @EventListener - public void init(ContextRefreshedEvent event) { - SmsConfigInfo configInfo = smsConfigRpc.getConfigInfo(SmsConfigConstant.SMS_CONFIG_KEY); - redisUtil.set(SmsConfigConstant.SMS_CONFIG_KEY, configInfo.getConfigValue()); + public void init() { + SmsConfigInfo configInfo = smsConfigRpc.getConfigInfo(SmsConfigContext.SMS_CONFIG_KEY); + String key = redisUtil.buildKey(smsConfigPrefix, SmsConfigContext.SMS_CONFIG_KEY); + redisUtil.set(key, configInfo.getConfigValue()); + if (ObjectUtil.isEmpty(configInfo)){ + log.info("短信配置获取失败!"); + } // 初始化短信配置 SmsFactory.createSmsBlend(smsReadConfig, configInfo.getConfigValue()); } + + @Override + public void start() { + this.init(); + } + + @Override + public void stop() { + + } + + @Override + public boolean isRunning() { + return false; + } } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/ThreadPoolConfig.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/ThreadPoolConfig.java new file mode 100644 index 0000000..1186053 --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/config/ThreadPoolConfig.java @@ -0,0 +1,28 @@ +package com.schisandra.auth.application.config; + +import com.schisandra.auth.application.factory.CustomNameThreadFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 线程池的config管理 + * + * @author: landaiqing + * @date: 2024/2/18 + */ +@Configuration +public class ThreadPoolConfig { + + @Bean(name = "rotateCaptchaThreadPool") + public ThreadPoolExecutor getLabelThreadPool() { + return new ThreadPoolExecutor(20, 100, 5, + TimeUnit.SECONDS, new LinkedBlockingDeque<>(40), + new CustomNameThreadFactory("rotateCaptcha"), + new ThreadPoolExecutor.CallerRunsPolicy()); + } + +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/constants/SmsConfigConstant.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/context/SmsConfigContext.java similarity index 70% rename from schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/constants/SmsConfigConstant.java rename to schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/context/SmsConfigContext.java index bab3a9c..474fc4b 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/constants/SmsConfigConstant.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/context/SmsConfigContext.java @@ -1,7 +1,7 @@ -package com.schisandra.auth.common.constants; +package com.schisandra.auth.application.context; /** - * @Classname SmsConfigConstant + * @Classname SmsConfigContext * @BelongsProject: schisandra-cloud-storage * @BelongsPackage: com.schisandra.auth.common.constants * @Author: landaiqing @@ -9,6 +9,6 @@ package com.schisandra.auth.common.constants; * @Description: TODO * @Version: 1.0 */ -public class SmsConfigConstant { +public class SmsConfigContext { public static final String SMS_CONFIG_KEY = "sms_config_id"; } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/context/package-info.md b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/context/package-info.md deleted file mode 100644 index 5d0b822..0000000 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/context/package-info.md +++ /dev/null @@ -1 +0,0 @@ -controller 应用上下文 \ No newline at end of file diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java index 0be7798..c07c4e2 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/ReactRotateCaptchaController.java @@ -18,6 +18,7 @@ import java.awt.image.BufferedImage; import java.io.InputStream; import java.util.HashMap; import java.util.Random; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -40,25 +41,28 @@ public class ReactRotateCaptchaController { */ @PostMapping("get") public CaptchaResult get() throws Exception { - HashMap map = new HashMap<>(); RotateImageUtils rotateImageUtils = new RotateImageUtils(); - - InputStream inputStream= ReactRotateCaptchaController.class.getClassLoader().getResourceAsStream("image/test1.jpg"); - BufferedImage image = ImageIO.read(inputStream); - Random random = new Random(); - double randomNumber = random.nextInt(280) + 40; - String key = AESUtils.getKey(); - String token = AESUtils.encrypt(String.valueOf(randomNumber), key); - String prefix = redisUtil.buildKey(authRotateCaptchaPrefix, token); - redisUtil.setNx(prefix, String.valueOf(randomNumber), 60L, TimeUnit.SECONDS); - try { - BufferedImage image1 = rotateImageUtils.rotateImage(image, randomNumber, Color.black); - map.put("token",token); - map.put("str", RotateImageUtils.BufferedImageToBase64(image1)); - return CaptchaResult.ok(map); - } catch (Exception e) { - return CaptchaResult.fail(); - } + CompletableFuture futurePrice = CompletableFuture.supplyAsync(() -> { + HashMap map = new HashMap<>(); + try { + Random random = new Random(); + double randomNumber = random.nextInt(280) + 40; + InputStream inputStream = ReactRotateCaptchaController.class.getClassLoader().getResourceAsStream("image/test1.jpg"); + BufferedImage image = ImageIO.read(inputStream); + String key = AESUtils.getKey(); + String token = AESUtils.encrypt(String.valueOf(randomNumber), key); + String prefix = redisUtil.buildKey(authRotateCaptchaPrefix, token); + redisUtil.setNx(prefix, String.valueOf(randomNumber), 60L, TimeUnit.SECONDS); + BufferedImage image1 = rotateImageUtils.rotateImage(image, randomNumber, Color.black); + String img = RotateImageUtils.BufferedImageToBase64(image1); + map.put("token", token); + map.put("str", img); + } catch (Exception e) { + log.error("ReactRotateCaptchaController.get.error:{}", e.getMessage(), e); + } + return map; + }); + return CaptchaResult.ok(futurePrice.join()); } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraSmsController.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraSmsController.java index b978f1d..2fbcd30 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraSmsController.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/controller/SchisandraSmsController.java @@ -1,17 +1,11 @@ package com.schisandra.auth.application.controller; -import com.schisandra.auth.application.config.SmsReadConfig; -import com.schisandra.auth.application.factory.SmsTypeHandlerFactory; -import com.schisandra.auth.application.handler.SchisandraSmsTypeHandler; -import com.schisandra.auth.common.constants.SmsConfigConstant; +import com.schisandra.auth.application.context.SmsConfigContext; import com.schisandra.auth.common.entity.Result; import com.schisandra.auth.common.redis.RedisUtil; import com.schisandra.auth.common.utils.SmsCodeUtils; -import com.schisandra.auth.infra.entity.SmsConfigInfo; -import com.schisandra.auth.infra.rpc.SmsConfigRpc; import lombok.extern.slf4j.Slf4j; -import org.dromara.sms4j.api.SmsBlend; import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.core.factory.SmsFactory; import org.springframework.web.bind.annotation.GetMapping; @@ -28,11 +22,6 @@ import static java.util.concurrent.TimeUnit.SECONDS; public class SchisandraSmsController { @Resource private RedisUtil redisUtil; - @Resource - private SmsReadConfig smsReadConfig; - - @Resource - SmsConfigRpc smsConfigRpc; private final String authPhonePrefix="auth.phone"; private final String smsConfigPrefix="sys.config.sms"; @@ -48,11 +37,11 @@ public class SchisandraSmsController { String prefix = redisUtil.buildKey(authPhonePrefix, phone); String code = SmsCodeUtils.generateValidateCode(4).toString(); if (!redisUtil.exist(prefix)){ - SmsConfigInfo configInfo = smsConfigRpc.getConfigInfo(SmsConfigConstant.SMS_CONFIG_KEY); - String key = redisUtil.buildKey(smsConfigPrefix, SmsConfigConstant.SMS_CONFIG_KEY); - redisUtil.set(key, configInfo.getConfigValue()); - SmsFactory.createSmsBlend(smsReadConfig, configInfo.getConfigValue()); - String configId = redisUtil.get(SmsConfigConstant.SMS_CONFIG_KEY); + String key = redisUtil.buildKey(smsConfigPrefix, SmsConfigContext.SMS_CONFIG_KEY); + String configId = redisUtil.get(key); + if (configId == null){ + log.error("短信配置不存在!"); + } SmsResponse smsResponse=SmsFactory.getSmsBlend(configId).sendMessage(phone,code); if (smsResponse.isSuccess()){ redisUtil.setNx(prefix, code, 60L* 5,SECONDS); @@ -61,7 +50,7 @@ public class SchisandraSmsController { return Result.fail("短信发送失败,请重试!"); } }else { - return Result.fail("已发送。请注意查看!"); + return Result.fail("已发送,请注意查看!"); } } diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/factory/CustomNameThreadFactory.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/factory/CustomNameThreadFactory.java new file mode 100644 index 0000000..db670ee --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/factory/CustomNameThreadFactory.java @@ -0,0 +1,49 @@ +package com.schisandra.auth.application.factory; + +import org.apache.commons.lang3.StringUtils; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 自定义名称的线程工厂 + * + * @author: landaiqing + * @date: 2024/2/18 + */ +public class CustomNameThreadFactory implements ThreadFactory { + + private static final AtomicInteger poolNumber = new AtomicInteger(1); + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix; + + public CustomNameThreadFactory(String name) { + SecurityManager s = System.getSecurityManager(); + group = (s != null) ? s.getThreadGroup() : + Thread.currentThread().getThreadGroup(); + if (StringUtils.isBlank(name)) { + name = "pool"; + } + namePrefix = name + "-" + + poolNumber.getAndIncrement() + + "-thread-"; + } + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(group, r, + namePrefix + threadNumber.getAndIncrement(), + 0); + // 设置线程为非守护线程 + if (t.isDaemon()){ + t.setDaemon(false); + } + // 设置线程优先级为正常优先级 + if (t.getPriority() != Thread.NORM_PRIORITY){ + t.setPriority(Thread.NORM_PRIORITY); + } + return t; + } + +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/AlibabaSmsHandler.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/AlibabaSmsHandler.java index 2b05326..b381e00 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/AlibabaSmsHandler.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/AlibabaSmsHandler.java @@ -5,6 +5,7 @@ import com.schisandra.auth.application.dto.SchisandraSmsConfigDTO; import com.schisandra.auth.common.enums.SmsSupplierType; import com.schisandra.auth.domain.bo.SchisandraSmsConfigBO; import com.schisandra.auth.domain.service.SchisandraSmsConfigDomainService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.dromara.sms4j.aliyun.config.AlibabaConfig; import org.dromara.sms4j.provider.config.BaseConfig; @@ -22,6 +23,7 @@ import javax.annotation.Resource; * @Version: 1.0 */ @Component +@Slf4j public class AlibabaSmsHandler implements SchisandraSmsTypeHandler{ @Resource SchisandraSmsConfigDomainService schisandraSmsConfigDomainService; @@ -35,6 +37,7 @@ public class AlibabaSmsHandler implements SchisandraSmsTypeHandler{ SchisandraSmsConfigBO schisandraSmsConfigBO = schisandraSmsConfigDomainService.queryByConfigId(configId); SchisandraSmsConfigDTO schisandraSmsConfigDTO = SchisandraSmsConfigDTOConvert.INSTANCE.convertBOToDTO(schisandraSmsConfigBO); if (ObjectUtils.isEmpty(schisandraSmsConfigDTO)){ + log.error("阿里云短信配置信息获取失败"); return null; } AlibabaConfig alibabaConfig=new AlibabaConfig(); diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/TencentSmsHandler.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/TencentSmsHandler.java new file mode 100644 index 0000000..fa0ee90 --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-application/schisandra-cloud-storage-auth-application-controller/src/main/java/com/schisandra/auth/application/handler/TencentSmsHandler.java @@ -0,0 +1,61 @@ +package com.schisandra.auth.application.handler; + +import com.schisandra.auth.application.convert.SchisandraSmsConfigDTOConvert; +import com.schisandra.auth.application.dto.SchisandraSmsConfigDTO; +import com.schisandra.auth.common.enums.SmsSupplierType; +import com.schisandra.auth.domain.bo.SchisandraSmsConfigBO; +import com.schisandra.auth.domain.service.SchisandraSmsConfigDomainService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.dromara.sms4j.provider.config.BaseConfig; +import org.dromara.sms4j.tencent.config.TencentConfig; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * @Classname TencentSmsHandler + * @BelongsProject: schisandra-cloud-storage + * @BelongsPackage: com.schisandra.auth.application.handler + * @Author: landaiqing + * @CreateTime: 2024-05-12 13:07 + * @Description: TODO + * @Version: 1.0 + */ +@Component +@Slf4j +public class TencentSmsHandler implements SchisandraSmsTypeHandler{ + @Resource + SchisandraSmsConfigDomainService schisandraSmsConfigDomainService; + @Override + public SmsSupplierType getHandlerType() { + return SmsSupplierType.TENCENT; + } + + @Override + public BaseConfig addConfig(String configId) { + SchisandraSmsConfigBO schisandraSmsConfigBO = schisandraSmsConfigDomainService.queryByConfigId(configId); + SchisandraSmsConfigDTO schisandraSmsConfigDTO = SchisandraSmsConfigDTOConvert.INSTANCE.convertBOToDTO(schisandraSmsConfigBO); + if (ObjectUtils.isEmpty(schisandraSmsConfigDTO)){ + log.error("腾讯短信配置信息获取失败"); + return null; + } + TencentConfig tencentConfig=new TencentConfig(); + tencentConfig.setAccessKeyId(schisandraSmsConfigDTO.getAccessKeyId()); + tencentConfig.setAccessKeySecret(schisandraSmsConfigDTO.getAccessKeySecret()); + tencentConfig.setConfigId(schisandraSmsConfigDTO.getConfigId()); + tencentConfig.setAction(schisandraSmsConfigDTO.getAction()); + tencentConfig.setService(schisandraSmsConfigDTO.getService()); + tencentConfig.setRequestUrl(schisandraSmsConfigDTO.getRequestUrl()); + tencentConfig.setConnTimeout(schisandraSmsConfigDTO.getConnTimeout()); + tencentConfig.setTerritory(schisandraSmsConfigDTO.getRegion()); + tencentConfig.setVersion(schisandraSmsConfigDTO.getVersion()); + tencentConfig.setTemplateId(schisandraSmsConfigDTO.getTemplateId()); + tencentConfig.setSignature(schisandraSmsConfigDTO.getSignature()); + tencentConfig.setSdkAppId(schisandraSmsConfigDTO.getSdkAppId()); + tencentConfig.setMaxRetries(schisandraSmsConfigDTO.getMaxRetries()); + tencentConfig.setMaximum(Math.toIntExact(schisandraSmsConfigDTO.getMaximum())); + tencentConfig.setWeight(schisandraSmsConfigDTO.getWeight()); + return tencentConfig; + } +} diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/enums/SmsSupplierType.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/enums/SmsSupplierType.java index aef910d..933be61 100644 --- a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/enums/SmsSupplierType.java +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/enums/SmsSupplierType.java @@ -19,7 +19,7 @@ public enum SmsSupplierType { /** * 腾讯云 */ - TENCENT("tenxun"), + TENCENT("tencent"), /** * 合一短信 */ diff --git a/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/CacheUtil.java b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/CacheUtil.java new file mode 100644 index 0000000..d06ae04 --- /dev/null +++ b/schisandra-cloud-storage-auth/schisandra-cloud-storage-auth-common/src/main/java/com/schisandra/auth/common/utils/CacheUtil.java @@ -0,0 +1,51 @@ +package com.schisandra.auth.common.utils; + +import com.alibaba.fastjson.JSON; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +/** + * @Classname CacheUtil + * @Author: landaiqing + * @CreateTime: 2024-03-03 21:31 + * @Description: 缓存工具类 + * @Version: 1.0 + */ +@Component +public class CacheUtil { + private Cache localCache = + CacheBuilder.newBuilder() + .maximumSize(5000) + .expireAfterWrite(10, TimeUnit.SECONDS) + .build(); + + public List getResult(String cacheKey, Class clazz, + Function> function) { + List resultList = new ArrayList<>(); + String content = localCache.getIfPresent(cacheKey); + if (StringUtils.isNotBlank(content)) { + resultList = JSON.parseArray(content, clazz); + } else { + resultList = function.apply(cacheKey); + if (!CollectionUtils.isEmpty(resultList)) { + localCache.put(cacheKey, JSON.toJSONString(resultList)); + } + } + return resultList; + } + + public Map getMapResult(String cacheKey, Class clazz, + Function> function) { + return new HashMap<>(); + } +} diff --git a/schisandra-cloud-storage-gateway/src/main/resources/application.yml b/schisandra-cloud-storage-gateway/src/main/resources/application.yml index 181eff3..4ff787c 100644 --- a/schisandra-cloud-storage-gateway/src/main/resources/application.yml +++ b/schisandra-cloud-storage-gateway/src/main/resources/application.yml @@ -16,6 +16,12 @@ spring: - Path=/auth/** filters: - StripPrefix=1 + - id: system + uri: lb://schisandra-cloud-storage-system-dev + predicates: + - Path=/system/** + filters: + - StripPrefix=1 # redis配置 redis: # Redis数据库索引(默认为0) diff --git a/schisandra-cloud-storage-gen/src/main/resources/genCode/gen.yml b/schisandra-cloud-storage-gen/src/main/resources/genCode/gen.yml index 467bb5e..8bde129 100644 --- a/schisandra-cloud-storage-gen/src/main/resources/genCode/gen.yml +++ b/schisandra-cloud-storage-gen/src/main/resources/genCode/gen.yml @@ -8,7 +8,7 @@ # 数据库连接信息 jdbc: dbName: schisandra-cloud-storage - tableName: schisandra_oss_config + tableName: schisandra_oss_ali url: jdbc:mysql://1.95.0.111:3306/ username: root password: LDQ20020618xxx diff --git a/schisandra-cloud-storage-gen/src/main/resources/genCode/ossMapper.yml b/schisandra-cloud-storage-gen/src/main/resources/genCode/ossMapper.yml index 701043c..d2e5ddd 100644 --- a/schisandra-cloud-storage-gen/src/main/resources/genCode/ossMapper.yml +++ b/schisandra-cloud-storage-gen/src/main/resources/genCode/ossMapper.yml @@ -54,7 +54,7 @@ mappers: ext: java - fileId: 011 template: genCode/template/DemoDao.java.vm - filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/dao + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/mapper name: ${modelName}Dao ext: java - fileId: 012 diff --git a/schisandra-cloud-storage-gen/src/main/resources/genCode/systemLogMapper.yml b/schisandra-cloud-storage-gen/src/main/resources/genCode/systemLogMapper.yml new file mode 100644 index 0000000..d2e5ddd --- /dev/null +++ b/schisandra-cloud-storage-gen/src/main/resources/genCode/systemLogMapper.yml @@ -0,0 +1,69 @@ +# auth模块映射关系 ${module} 占位符 +# 模板文件和生成类的映射关系 多个文件 数组形式配置 +mappers: + - + - fileId: 001 + template: genCode/template/DemoDTO.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-application/schisandra-cloud-storage-${module}-application-controller/src/main/java/com/schisandra/${module}/application/dto + name: ${modelName}DTO + ext: java + - fileId: 002 + template: genCode/template/DemoController.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-application/schisandra-cloud-storage-${module}-application-controller/src/main/java/com/schisandra/${module}/application/controller + name: ${modelName}Controller + ext: java + - fileId: 003 + template: genCode/template/DemoDTOConverter.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-application/schisandra-cloud-storage-${module}-application-controller/src/main/java/com/schisandra/${module}/application/convert + name: ${modelName}DTOConverter + ext: java + - fileId: 004 + template: genCode/template/DemoBO.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-domain/src/main/java/com/schisandra/${module}/domain/entity + name: ${modelName}BO + ext: java + - fileId: 005 + template: genCode/template/DemoDomainService.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-domain/src/main/java/com/schisandra/${module}/domain/service + name: ${modelName}DomainService + ext: java + - fileId: 006 + template: genCode/template/DemoDomainServiceImpl.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-domain/src/main/java/com/schisandra/${module}/domain/service/impl + name: ${modelName}DomainServiceImpl + ext: java + - fileId: 007 + template: genCode/template/DemoBOConverter.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-domain/src/main/java/com/schisandra/${module}/domain/convert + name: ${modelName}BOConverter + ext: java + - fileId: 008 + template: genCode/template/DemoService.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/service + name: ${modelName}Service + ext: java + - fileId: 009 + template: genCode/template/DemoTable.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/entity + name: ${modelName} + ext: java + - fileId: 010 + template: genCode/template/DemoServiceImpl.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/service/impl + name: ${modelName}ServiceImpl + ext: java + - fileId: 011 + template: genCode/template/DemoDao.java.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/mapper + name: ${modelName}Dao + ext: java + - fileId: 012 + template: genCode/template/DemoXml.xml.vm + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/resources/mapper + name: ${modelName}Dao + ext: xml + + + + + diff --git a/schisandra-cloud-storage-gen/src/main/resources/genCode/systemMapper.yml b/schisandra-cloud-storage-gen/src/main/resources/genCode/systemMapper.yml index 701043c..d2e5ddd 100644 --- a/schisandra-cloud-storage-gen/src/main/resources/genCode/systemMapper.yml +++ b/schisandra-cloud-storage-gen/src/main/resources/genCode/systemMapper.yml @@ -54,7 +54,7 @@ mappers: ext: java - fileId: 011 template: genCode/template/DemoDao.java.vm - filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/dao + filePath: /schisandra-cloud-storage-${module}/schisandra-cloud-storage-${module}-infra/src/main/java/com/schisandra/${module}/infra/basic/mapper name: ${modelName}Dao ext: java - fileId: 012 diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssAliController.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssAliController.java new file mode 100644 index 0000000..760719d --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssAliController.java @@ -0,0 +1,239 @@ +package com.schisandra.oss.application.controller; + +import com.alibaba.fastjson.JSON; +import com.google.common.base.Preconditions; + +import com.schisandra.oss.application.convert.SchisandraOssAliDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssAliDTO; +import com.schisandra.oss.common.entity.Result; +import com.schisandra.oss.domain.bo.SchisandraOssAliBO; +import com.schisandra.oss.domain.service.SchisandraOssAliDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * controller + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@RestController +@RequestMapping("/oss/") +@Slf4j +public class SchisandraOssAliController { + + @Resource + private SchisandraOssAliDomainService schisandraOssAliDomainService; + + /** + * 新增 + */ + @RequestMapping("add") + public Result add(@RequestBody SchisandraOssAliDTO schisandraOssAliDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraOssAliController.add.dto:{}", JSON.toJSONString(schisandraOssAliDTO)); + } + Preconditions.checkNotNull(schisandraOssAliDTO.getId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUserId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getEndpoint(), "OSS地址不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeyId(), "AccessKey ID不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeySecret(), "AccessKey Secret不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSecurityToken(), "security Token不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getBucketName(), "Bucket名称不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getBasePath(), "数据存储路径不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUserAgent(), "用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionRequestTimeout(), "从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTimeout(), "建立连接的超时时间(单位:毫秒)。默认为50000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSocketTimeout(), "Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getMaxConnections(), "允许打开的最大HTTP连接数。默认为1024不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTTL(), "连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUseReaper(), "是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getIdleConnectionTime(), "连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProtocol(), "连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyHost(), "代理服务器主机地址。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPort(), "代理服务器端口。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyUsername(), "代理服务器验证的用户名。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPassword(), "代理服务器验证的密码。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyDomain(), "代理服务器的域,该域可以执行NTLM认证不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyWorkstation(), "代理主机的NTLM身份验证服务器不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSupportCname(), "是否支持CNAME作为Endpoint,默认支持CNAME。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCnameExcludeList(), "设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSldEnabled(), "是否开启二级域名(Second Level Domain)的访问方式,默认不开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeout(), "请求超时时间,单位:毫秒。默认情况下是5分钟。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeoutEnabled(), "是否启用请求超时校验。默认情况下,它是禁用的。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSlowRequestsThreshold(), "设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getDefaultHeaders(), "设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCrcCheckEnabled(), "是否在上传和下载时启用CRC校验,默认启用不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSignatureVersion(), "所有请求设置签名版本不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getTickOffset(), "设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRedirectEnable(), "是否开启HTTP重定向。 说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getVerifySSLEnable(), "是否开启SSL证书校验。 * 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getLogConnectionPoolStats(), "是否开启日志记录连接池统计信息不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUseSystemPropertyValues(), "是否使用系统属性值不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getPartSize(), "分片大小,默认5MB不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getStatus(), "状态不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedBy(), "创建人不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedTime(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateTime(), "更新时间不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateBy(), "更新人不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getExtraJson(), "额外字段不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreateBucket(), "当桶不存在,是否创建不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCheckBucket(), "启动检测桶,是否存在不能为空"); + SchisandraOssAliBO SchisandraOssAliBO = SchisandraOssAliDTOConverter.INSTANCE.convertDTOToBO(schisandraOssAliDTO); + return Result.ok(schisandraOssAliDomainService.add(SchisandraOssAliBO)); + } catch (Exception e) { + log.error("SchisandraOssAliController.register.error:{}", e.getMessage(), e); + return Result.fail("新增失败"); + } + + } + + /** + * 修改 + */ + @RequestMapping("update") + public Result update(@RequestBody SchisandraOssAliDTO schisandraOssAliDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraOssAliController.update.dto:{}", JSON.toJSONString(schisandraOssAliDTO)); + } + Preconditions.checkNotNull(schisandraOssAliDTO.getId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUserId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getEndpoint(), "OSS地址不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeyId(), "AccessKey ID不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeySecret(), "AccessKey Secret不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSecurityToken(), "security Token不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getBucketName(), "Bucket名称不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getBasePath(), "数据存储路径不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUserAgent(), "用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionRequestTimeout(), "从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTimeout(), "建立连接的超时时间(单位:毫秒)。默认为50000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSocketTimeout(), "Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getMaxConnections(), "允许打开的最大HTTP连接数。默认为1024不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTTL(), "连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUseReaper(), "是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getIdleConnectionTime(), "连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProtocol(), "连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyHost(), "代理服务器主机地址。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPort(), "代理服务器端口。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyUsername(), "代理服务器验证的用户名。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPassword(), "代理服务器验证的密码。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyDomain(), "代理服务器的域,该域可以执行NTLM认证不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyWorkstation(), "代理主机的NTLM身份验证服务器不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSupportCname(), "是否支持CNAME作为Endpoint,默认支持CNAME。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCnameExcludeList(), "设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSldEnabled(), "是否开启二级域名(Second Level Domain)的访问方式,默认不开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeout(), "请求超时时间,单位:毫秒。默认情况下是5分钟。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeoutEnabled(), "是否启用请求超时校验。默认情况下,它是禁用的。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSlowRequestsThreshold(), "设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getDefaultHeaders(), "设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCrcCheckEnabled(), "是否在上传和下载时启用CRC校验,默认启用不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSignatureVersion(), "所有请求设置签名版本不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getTickOffset(), "设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRedirectEnable(), "是否开启HTTP重定向。 说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getVerifySSLEnable(), "是否开启SSL证书校验。 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getLogConnectionPoolStats(), "是否开启日志记录连接池统计信息不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUseSystemPropertyValues(), "是否使用系统属性值不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getPartSize(), "分片大小,默认5MB不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getStatus(), "状态不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedBy(), "创建人不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedTime(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateTime(), "更新时间不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateBy(), "更新人不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getExtraJson(), "额外字段不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreateBucket(), "当桶不存在,是否创建不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCheckBucket(), "启动检测桶,是否存在不能为空"); + SchisandraOssAliBO schisandraOssAliBO = SchisandraOssAliDTOConverter.INSTANCE.convertDTOToBO(schisandraOssAliDTO); + return Result.ok(schisandraOssAliDomainService.update(schisandraOssAliBO)); + } catch (Exception e) { + log.error("SchisandraOssAliController.update.error:{}", e.getMessage(), e); + return Result.fail("更新信息失败"); + } + + } + + /** + * 删除 + */ + @RequestMapping("delete") + public Result delete(@RequestBody SchisandraOssAliDTO schisandraOssAliDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraOssAliController.delete.dto:{}", JSON.toJSONString(schisandraOssAliDTO)); + } + Preconditions.checkNotNull(schisandraOssAliDTO.getId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUserId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getEndpoint(), "OSS地址不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeyId(), "AccessKey ID不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getAccessKeySecret(), "AccessKey Secret不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSecurityToken(), "security Token不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getBucketName(), "Bucket名称不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getBasePath(), "数据存储路径不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUserAgent(), "用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getMaxErrorRetry(), "请求失败后最大的重试次数。默认3次。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionRequestTimeout(), "从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTimeout(), "建立连接的超时时间(单位:毫秒)。默认为50000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSocketTimeout(), "Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getMaxConnections(), "允许打开的最大HTTP连接数。默认为1024不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getConnectionTTL(), "连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUseReaper(), "是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getIdleConnectionTime(), "连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProtocol(), "连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyHost(), "代理服务器主机地址。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPort(), "代理服务器端口。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyUsername(), "代理服务器验证的用户名。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyPassword(), "代理服务器验证的密码。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyDomain(), "代理服务器的域,该域可以执行NTLM认证不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getProxyWorkstation(), "代理主机的NTLM身份验证服务器不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSupportCname(), "是否支持CNAME作为Endpoint,默认支持CNAME。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCnameExcludeList(), "设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSldEnabled(), "是否开启二级域名(Second Level Domain)的访问方式,默认不开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeout(), "请求超时时间,单位:毫秒。默认情况下是5分钟。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRequestTimeoutEnabled(), "是否启用请求超时校验。默认情况下,它是禁用的。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSlowRequestsThreshold(), "设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getDefaultHeaders(), "设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCrcCheckEnabled(), "是否在上传和下载时启用CRC校验,默认启用不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getSignatureVersion(), "所有请求设置签名版本不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getTickOffset(), "设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getRedirectEnable(), "是否开启HTTP重定向。 说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getVerifySSLEnable(), "是否开启SSL证书校验。 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getLogConnectionPoolStats(), "是否开启日志记录连接池统计信息不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUseSystemPropertyValues(), "是否使用系统属性值不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getPartSize(), "分片大小,默认5MB不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getStatus(), "状态不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedBy(), "创建人不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreatedTime(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateTime(), "更新时间不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getUpdateBy(), "更新人不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getExtraJson(), "额外字段不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCreateBucket(), "当桶不存在,是否创建不能为空"); + Preconditions.checkNotNull(schisandraOssAliDTO.getCheckBucket(), "启动检测桶,是否存在不能为空"); + SchisandraOssAliBO schisandraOssAliBO = SchisandraOssAliDTOConverter.INSTANCE.convertDTOToBO(schisandraOssAliDTO); + return Result.ok(schisandraOssAliDomainService.delete(schisandraOssAliBO)); + } catch (Exception e) { + log.error("SchisandraOssAliController.delete.error:{}", e.getMessage(), e); + return Result.fail("删除信息失败"); + } + + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssConfigController.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssConfigController.java deleted file mode 100644 index 496beb8..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssConfigController.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.schisandra.oss.application.controller; - -import com.alibaba.fastjson.JSON; - -import com.google.common.base.Preconditions; -import com.schisandra.oss.application.convert.SchisandraOssConfigDTOConverter; -import com.schisandra.oss.application.dto.SchisandraOssConfigDTO; -import com.schisandra.oss.common.entity.Result; -import com.schisandra.oss.domain.bo.SchisandraOssConfigBO; -import com.schisandra.oss.domain.service.SchisandraOssConfigDomainService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * controller - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@RestController -@RequestMapping("/oss/") -@Slf4j -public class SchisandraOssConfigController { - - @Resource - private SchisandraOssConfigDomainService schisandraOssConfigDomainService; - - /** - * 新增 - */ - @RequestMapping("add") - public Result add(@RequestBody SchisandraOssConfigDTO schisandraOssConfigDTO) { - - try { - if (log.isInfoEnabled()) { - log.info("SchisandraOssConfigController.add.dto:{}", JSON.toJSONString(schisandraOssConfigDTO)); - } - Preconditions.checkNotNull(schisandraOssConfigDTO.getId(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getOssType(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getEndpoint(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getAccessKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getSecretKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getBucketName(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getBasePath(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getRegion(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getTaskNum(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPartSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getImgSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getFileSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getConnectTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getWriteTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getReadTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getZone(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPublicKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPrivateKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCustomHost(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getHost(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPort(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUser(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPassword(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCharset(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getExtraJson(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCreateDate(), "创建时间不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUpdateBy(), "更新者不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUpdateDate(), "更新时间不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getIsDeleted(), "是否删除 0未删除 1已删除不能为空"); - SchisandraOssConfigBO SchisandraOssConfigBO = SchisandraOssConfigDTOConverter.INSTANCE.convertDTOToBO(schisandraOssConfigDTO); - return Result.ok(schisandraOssConfigDomainService.add(SchisandraOssConfigBO)); - } catch (Exception e) { - log.error("SchisandraOssConfigController.register.error:{}", e.getMessage(), e); - return Result.fail("新增失败"); - } - - } - - /** - * 修改 - */ - @RequestMapping("update") - public Result update(@RequestBody SchisandraOssConfigDTO schisandraOssConfigDTO) { - - try { - if (log.isInfoEnabled()) { - log.info("SchisandraOssConfigController.update.dto:{}", JSON.toJSONString(schisandraOssConfigDTO)); - } - Preconditions.checkNotNull(schisandraOssConfigDTO.getId(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getOssType(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getEndpoint(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getAccessKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getSecretKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getBucketName(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getBasePath(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getRegion(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getTaskNum(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPartSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getImgSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getFileSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getConnectTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getWriteTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getReadTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getZone(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPublicKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPrivateKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCustomHost(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getHost(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPort(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUser(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPassword(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCharset(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getExtraJson(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCreateDate(), "创建时间不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUpdateBy(), "更新者不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUpdateDate(), "更新时间不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getIsDeleted(), "是否删除 0未删除 1已删除不能为空"); - SchisandraOssConfigBO schisandraOssConfigBO = SchisandraOssConfigDTOConverter.INSTANCE.convertDTOToBO(schisandraOssConfigDTO); - return Result.ok(schisandraOssConfigDomainService.update(schisandraOssConfigBO)); - } catch (Exception e) { - log.error("SchisandraOssConfigController.update.error:{}", e.getMessage(), e); - return Result.fail("更新信息失败"); - } - - } - - /** - * 删除 - */ - @RequestMapping("delete") - public Result delete(@RequestBody SchisandraOssConfigDTO schisandraOssConfigDTO) { - - try { - if (log.isInfoEnabled()) { - log.info("SchisandraOssConfigController.delete.dto:{}", JSON.toJSONString(schisandraOssConfigDTO)); - } - Preconditions.checkNotNull(schisandraOssConfigDTO.getId(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getOssType(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getEndpoint(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getAccessKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getSecretKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getBucketName(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getBasePath(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getRegion(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getTaskNum(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPartSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getImgSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getFileSize(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getConnectTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getWriteTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getReadTimeout(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getZone(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPublicKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPrivateKey(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCustomHost(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getHost(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPort(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUser(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getPassword(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCharset(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getExtraJson(), "不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getCreateDate(), "创建时间不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUpdateBy(), "更新者不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getUpdateDate(), "更新时间不能为空"); - Preconditions.checkNotNull(schisandraOssConfigDTO.getIsDeleted(), "是否删除 0未删除 1已删除不能为空"); - SchisandraOssConfigBO schisandraOssConfigBO = SchisandraOssConfigDTOConverter.INSTANCE.convertDTOToBO(schisandraOssConfigDTO); - return Result.ok(schisandraOssConfigDomainService.delete(schisandraOssConfigBO)); - } catch (Exception e) { - log.error("SchisandraOssConfigController.delete.error:{}", e.getMessage(), e); - return Result.fail("删除信息失败"); - } - - } - -} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java new file mode 100644 index 0000000..45b152c --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/controller/SchisandraOssMinioController.java @@ -0,0 +1,198 @@ +package com.schisandra.oss.application.controller; + +import com.alibaba.fastjson.JSON; +import com.google.common.base.Preconditions; +import com.schisandra.oss.application.convert.SchisandraOssMinioDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssMinioDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.minio.MinioOssClient; +import com.schisandra.oss.application.oss.core.minio.model.MinioOssClientConfig; +import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig; +import com.schisandra.oss.common.entity.Result; +import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; +import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +/** + * controller + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@RestController +@RequestMapping("/oss/") +@Slf4j +public class SchisandraOssMinioController { + + @Resource + private SchisandraOssMinioDomainService schisandraOssMinioDomainService; + +// @Resource +// private MinioOssClient minioOssClient; + + @PostMapping("initMinio") + public StandardOssClient initMinio() { + SchisandraOssMinioBO minioBO = schisandraOssMinioDomainService.getMinioConfig(1L); + SchisandraOssMinioDTO minio = SchisandraOssMinioDTOConverter.INSTANCE.convertBOToDTO(minioBO); + if (ObjectUtils.isEmpty(minio)) { + log.error("minio配置信息获取失败"); + } + MinioOssConfig minioOssConfig = new MinioOssConfig(); + minioOssConfig.setBasePath(minio.getBasePath()); + minioOssConfig.setBucketName(minio.getBucketName()); + minioOssConfig.setAccessKey(minio.getAccessKey()); + minioOssConfig.setSecretKey(minio.getSecretKey()); + minioOssConfig.setEndpoint(minio.getEndpoint()); + minioOssConfig.init(); + if (Boolean.parseBoolean(minio.getOpenAdvancedSetup())) { + MinioOssClientConfig minioOssClientConfig = new MinioOssClientConfig(); + minioOssClientConfig.setWriteTimeout(minio.getWriteTimeout()); + minioOssClientConfig.setConnectTimeout(minio.getConnectTimeout()); + minioOssClientConfig.setReadTimeout(minio.getReadTimeout()); + minioOssClientConfig.setFollowSslRedirects(Boolean.parseBoolean(minio.getFollowSslRedirects())); + minioOssClientConfig.setRetryOnConnectionFailure(Boolean.parseBoolean(minio.getRetryOnConnectionFailure())); + minioOssClientConfig.setPingInterval(minio.getPingInterval()); + minioOssClientConfig.setFollowRedirects(Boolean.parseBoolean(minio.getFollowRedirects())); + minioOssClientConfig.setCallTimeout(minio.getCallTimeout()); + minioOssConfig.setClientConfig(minioOssClientConfig); + } + return minioOssClient(minioOssConfig); + + } + + public StandardOssClient minioOssClient(MinioOssConfig minioOssConfig) { + return new MinioOssClient(minioClient(minioOssConfig), minioOssConfig); + } + + public MinioClient minioClient(MinioOssConfig minioOssConfig) { + MinioOssClientConfig clientConfig = minioOssConfig.getClientConfig(); + OkHttpClient okHttpClient = new OkHttpClient.Builder() + .connectTimeout(clientConfig.getConnectTimeout(), TimeUnit.MILLISECONDS) + .writeTimeout(clientConfig.getWriteTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(clientConfig.getReadTimeout(), TimeUnit.MILLISECONDS) + .callTimeout(clientConfig.getCallTimeout(), TimeUnit.MILLISECONDS) + .followRedirects(clientConfig.isFollowRedirects()) + .followSslRedirects(clientConfig.isFollowSslRedirects()) + .retryOnConnectionFailure(clientConfig.isRetryOnConnectionFailure()) + .pingInterval(clientConfig.getPingInterval(), TimeUnit.MILLISECONDS) + .build(); + return MinioClient.builder() + .endpoint(minioOssConfig.getEndpoint()) + .credentials(minioOssConfig.getAccessKey(), minioOssConfig.getSecretKey()) + .httpClient(okHttpClient) + .build(); + } + + /** + * 新增 + */ + @RequestMapping("addMinio") + public Result addMinioOss(@RequestBody SchisandraOssMinioDTO schisandraOssMinioDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraOssMinioController.add.dto:{}", JSON.toJSONString(schisandraOssMinioDTO)); + } + parameterCheck(schisandraOssMinioDTO); + SchisandraOssMinioBO SchisandraOssMinioBO = SchisandraOssMinioDTOConverter.INSTANCE.convertDTOToBO(schisandraOssMinioDTO); + return Result.ok(schisandraOssMinioDomainService.add(SchisandraOssMinioBO)); + } catch (Exception e) { + log.error("SchisandraOssMinioController.register.error:{}", e.getMessage(), e); + return Result.fail("新增失败"); + } + + } + + /** + * 修改 + */ + @RequestMapping("updateMinio") + public Result updateMinioOss(@RequestBody SchisandraOssMinioDTO schisandraOssMinioDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraOssMinioController.update.dto:{}", JSON.toJSONString(schisandraOssMinioDTO)); + } + parameterCheck(schisandraOssMinioDTO); + SchisandraOssMinioBO schisandraOssMinioBO = SchisandraOssMinioDTOConverter.INSTANCE.convertDTOToBO(schisandraOssMinioDTO); + return Result.ok(schisandraOssMinioDomainService.update(schisandraOssMinioBO)); + } catch (Exception e) { + log.error("SchisandraOssMinioController.update.error:{}", e.getMessage(), e); + return Result.fail("更新信息失败"); + } + + } + + /** + * 删除 + */ + @RequestMapping("deleteMinio") + public Result deleteMinioOss(@RequestBody SchisandraOssMinioDTO schisandraOssMinioDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraOssMinioController.delete.dto:{}", JSON.toJSONString(schisandraOssMinioDTO)); + } + parameterCheck(schisandraOssMinioDTO); + SchisandraOssMinioBO schisandraOssMinioBO = SchisandraOssMinioDTOConverter.INSTANCE.convertDTOToBO(schisandraOssMinioDTO); + return Result.ok(schisandraOssMinioDomainService.delete(schisandraOssMinioBO)); + } catch (Exception e) { + log.error("SchisandraOssMinioController.delete.error:{}", e.getMessage(), e); + return Result.fail("删除信息失败"); + } + + } + + @RequestMapping("testMinio") + public void test() { +// System.out.println(minioOssClient.getBasePath()); + } + + + private void parameterCheck(SchisandraOssMinioDTO schisandraOssMinioDTO) { + Preconditions.checkNotNull(schisandraOssMinioDTO.getId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getUserId(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getEndpoint(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getAccessKey(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getSecretKey(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getBucketName(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getPort(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getBasePath(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getFileHost(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getDownloadHost(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getUploadHost(), "不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getCreateBucket(), "当桶不存在,是否创建不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getCheckBucket(), "启动检测桶,是否存在不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getConnectTimeout(), "连接超时时间(单位:毫秒)不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getWriteTimeout(), "写超时时间(单位:毫秒)不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getReadTimeout(), "读超时时间(单位:毫秒)不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getCallTimeout(), "调用超时时间(单位:毫秒)不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getFollowRedirects(), "是否支持重定向,默认支持不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getFollowSslRedirects(), "是否支持HTTP到HTTPS,HTTPS到HTTP的重定向,默认支持不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getRetryOnConnectionFailure(), "是否开始连接失败重试,默认不支持不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getPingInterval(), "连接健康检测间隔时长(单位:毫秒)不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getPartSize(), "分片大小,默认5MB不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getTaskNum(), "并发线程数,默认等于CPU的核数不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getImgSize(), "图片大小限制,单位:m不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getFileSize(), "文件大小限制,单位:m不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getExtraJson(), "额外json不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getStatus(), "状态不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getCreatedBy(), "创建人不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getCreatedTime(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getUpdateTime(), "更新时间不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getUpdateBy(), "更新人不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getIsDeleted(), "是否删除 0 未删除 1已删除不能为空"); + Preconditions.checkNotNull(schisandraOssMinioDTO.getOpenAdvancedSetup(), "是否开启高级设置不能为空"); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssAliDTOConverter.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssAliDTOConverter.java new file mode 100644 index 0000000..089fe77 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssAliDTOConverter.java @@ -0,0 +1,23 @@ +package com.schisandra.oss.application.convert; + + + import com.schisandra.oss.application.dto.SchisandraOssAliDTO; + import com.schisandra.oss.domain.bo.SchisandraOssAliBO; + import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * dto转换器 + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@Mapper +public interface SchisandraOssAliDTOConverter { + + SchisandraOssAliDTOConverter INSTANCE = Mappers.getMapper(SchisandraOssAliDTOConverter.class); + + SchisandraOssAliBO convertDTOToBO(SchisandraOssAliDTO schisandraOssAliDTO); + SchisandraOssAliDTO convertBOToDTO(SchisandraOssAliBO schisandraOssAli); + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssConfigDTOConverter.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssConfigDTOConverter.java deleted file mode 100644 index 90e9d54..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssConfigDTOConverter.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.schisandra.oss.application.convert; - - -import com.schisandra.oss.application.dto.SchisandraOssConfigDTO; -import com.schisandra.oss.domain.bo.SchisandraOssConfigBO; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * dto转换器 - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Mapper -public interface SchisandraOssConfigDTOConverter { - - SchisandraOssConfigDTOConverter INSTANCE = Mappers.getMapper(SchisandraOssConfigDTOConverter.class); - - SchisandraOssConfigBO convertDTOToBO(SchisandraOssConfigDTO schisandraOssConfigDTO); - -} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssMinioDTOConverter.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssMinioDTOConverter.java new file mode 100644 index 0000000..4f6914e --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/convert/SchisandraOssMinioDTOConverter.java @@ -0,0 +1,23 @@ +package com.schisandra.oss.application.convert; + + + import com.schisandra.oss.application.dto.SchisandraOssMinioDTO; + import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; + import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * dto转换器 + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@Mapper +public interface SchisandraOssMinioDTOConverter { + + SchisandraOssMinioDTOConverter INSTANCE = Mappers.getMapper(SchisandraOssMinioDTOConverter.class); + + SchisandraOssMinioBO convertDTOToBO(SchisandraOssMinioDTO schisandraOssMinioDTO); + + SchisandraOssMinioDTO convertBOToDTO(SchisandraOssMinioBO schisandraOssMinioBO); +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssAliDTO.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssAliDTO.java new file mode 100644 index 0000000..c178ec0 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssAliDTO.java @@ -0,0 +1,270 @@ +package com.schisandra.oss.application.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * dto + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@Data +public class SchisandraOssAliDTO implements Serializable { + + /** + * + */ + private Long id; + + /** + * + */ + private Long userId; + + /** + * OSS地址 + */ + private String endpoint; + + /** + * AccessKey ID + */ + private String accessKeyId; + + /** + * AccessKey Secret + */ + private String accessKeySecret; + + /** + * security Token + */ + private String securityToken; + + /** + * Bucket名称 + */ + private String bucketName; + + /** + * 数据存储路径 + */ + private String basePath; + + /** + * 用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。 + */ + private String userAgent; + + /** + * 请求失败后最大的重试次数。默认3次。 + */ + private String maxErrorRetry; + + /** + * 从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。 + */ + private Integer connectionRequestTimeout; + + /** + * 建立连接的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private Integer connectionTimeout; + + /** + * Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private Integer socketTimeout; + + /** + * 允许打开的最大HTTP连接数。默认为1024 + */ + private Integer maxConnections; + + /** + * 连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。 + */ + private Long connectionTTL; + + /** + * 是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启 + */ + private String useReaper; + + /** + * 连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。 + */ + private Long idleConnectionTime; + + /** + * 连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。 + */ + private String protocol; + + /** + * 代理服务器主机地址。 + */ + private String proxyHost; + + /** + * 代理服务器端口。 + */ + private String proxyPort; + + /** + * 代理服务器验证的用户名。 + */ + private String proxyUsername; + + /** + * 代理服务器验证的密码。 + */ + private String proxyPassword; + + /** + * 代理服务器的域,该域可以执行NTLM认证 + */ + private String proxyDomain; + + /** + * 代理主机的NTLM身份验证服务器 + */ + private String proxyWorkstation; + + /** + * 是否支持CNAME作为Endpoint,默认支持CNAME。 + */ + private String supportCname; + + /** + * 设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。 + */ + private String cnameExcludeList; + + /** + * 是否开启二级域名(Second Level Domain)的访问方式,默认不开启。 + */ + private String sldEnabled; + + /** + * 请求超时时间,单位:毫秒。默认情况下是5分钟。 + */ + private Integer requestTimeout; + + /** + * 是否启用请求超时校验。默认情况下,它是禁用的。 + */ + private String requestTimeoutEnabled; + + /** + * 设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。 + */ + private Long slowRequestsThreshold; + + /** + * 设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。 + */ + private String defaultHeaders; + + /** + * 是否在上传和下载时启用CRC校验,默认启用 + */ + private String crcCheckEnabled; + + /** + * 所有请求设置签名版本 + */ + private String signatureVersion; + + /** + * 设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。 + */ + private Long tickOffset; + + /** + * 是否开启HTTP重定向。 +说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。 + */ + private String redirectEnable; + + /** + * 是否开启SSL证书校验。 + * 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。 + */ + private String verifySSLEnable; + + /** + * 是否开启日志记录连接池统计信息 + */ + private String logConnectionPoolStats; + + /** + * 是否使用系统属性值 + */ + private String useSystemPropertyValues; + + /** + * 分片大小,默认5MB + */ + private Integer partSize; + + /** + * 并发线程数,默认等于CPU的核数 + */ + private Integer taskNum; + + /** + * 状态 + */ + private String status; + + /** + * 是否开启高级设置 + */ + private String openAdvancedSetup; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 是否删除 0 未删除 1已删除 + */ + private Integer isDeleted; + + /** + * 额外字段 + */ + private String extraJson; + + /** + * 当桶不存在,是否创建 + */ + private String createBucket; + + /** + * 启动检测桶,是否存在 + */ + private String checkBucket; + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssConfigDTO.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssConfigDTO.java deleted file mode 100644 index 92c611c..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssConfigDTO.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.schisandra.oss.application.dto; - -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * dto - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Data -public class SchisandraOssConfigDTO implements Serializable { - - /** - * - */ - private Long id; - - /** - * - */ - private String ossType; - - /** - * - */ - private String endpoint; - - /** - * - */ - private String accessKey; - - /** - * - */ - private String secretKey; - - /** - * - */ - private String bucketName; - - /** - * - */ - private String basePath; - - /** - * - */ - private String region; - - /** - * - */ - private Integer taskNum; - - /** - * - */ - private String partSize; - - /** - * - */ - private Double imgSize; - - /** - * - */ - private Double fileSize; - - /** - * - */ - private Integer connectTimeout; - - /** - * - */ - private Integer writeTimeout; - - /** - * - */ - private Integer readTimeout; - - /** - * - */ - private String zone; - - /** - * - */ - private String publicKey; - - /** - * - */ - private String privateKey; - - /** - * - */ - private String customHost; - - /** - * - */ - private String host; - - /** - * - */ - private String port; - - /** - * - */ - private String user; - - /** - * - */ - private String password; - - /** - * - */ - private String charset; - - /** - * - */ - private String extraJson; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新者 - */ - private String updateBy; - - /** - * 更新时间 - */ - private Date updateDate; - - /** - * 是否删除 0未删除 1已删除 - */ - private Integer isDeleted; - -} - diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssMinioDTO.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssMinioDTO.java new file mode 100644 index 0000000..e651b75 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/dto/SchisandraOssMinioDTO.java @@ -0,0 +1,183 @@ +package com.schisandra.oss.application.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * dto + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@Data +public class SchisandraOssMinioDTO implements Serializable { + + /** + * + */ + private Long id; + + /** + * + */ + private Long userId; + + /** + * + */ + private String endpoint; + + /** + * + */ + private String accessKey; + + /** + * + */ + private String secretKey; + + /** + * + */ + private String bucketName; + + /** + * + */ + private Integer port; + + /** + * + */ + private String basePath; + + /** + * + */ + private String fileHost; + + /** + * + */ + private String downloadHost; + + /** + * + */ + private String uploadHost; + + /** + * 当桶不存在,是否创建 + */ + private String createBucket; + + /** + * 启动检测桶,是否存在 + */ + private String checkBucket; + + /** + * 连接超时时间(单位:毫秒) + */ + private Long connectTimeout; + + /** + * 写超时时间(单位:毫秒) + */ + private Long writeTimeout; + + /** + * 读超时时间(单位:毫秒) + */ + private Long readTimeout; + + /** + * 调用超时时间(单位:毫秒) + */ + private Long callTimeout; + + /** + * 是否支持重定向,默认支持 + */ + private String followRedirects; + + /** + * 是否支持HTTP到HTTPS,HTTPS到HTTP的重定向,默认支持 + */ + private String followSslRedirects; + + /** + * 是否开始连接失败重试,默认不支持 + */ + private String retryOnConnectionFailure; + + /** + * 连接健康检测间隔时长(单位:毫秒) + */ + private Integer pingInterval; + + /** + * 分片大小,默认5MB + */ + private Long partSize; + + /** + * 并发线程数,默认等于CPU的核数 + */ + private Integer taskNum; + + /** + * 图片大小限制,单位:m + */ + private Integer imgSize; + + /** + * 文件大小限制,单位:m + */ + private Integer fileSize; + + /** + * 额外json + */ + private String extraJson; + + /** + * 状态 + */ + private String status; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 是否删除 0 未删除 1已删除 + */ + private Integer isDeleted; + + /** + * 是否开启高级设置 + */ + private String openAdvancedSetup; + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/constant/OssConstant.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/constant/OssConstant.java new file mode 100644 index 0000000..f62fadf --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/constant/OssConstant.java @@ -0,0 +1,60 @@ +package com.schisandra.oss.application.oss.constant; + +import java.util.concurrent.TimeUnit; + +/** + * @author landaiqing + */ +public class OssConstant { + + public static final String OSS = "oss"; + public static final String ENABLE = "enable"; + public static final String DEFAULT_ENABLE_VALUE = "true"; + + public static final int KB = 1024; + + public static final int MB = 1024 * KB; + /** + * 默认分片大小 + */ + public static final Long DEFAULT_PART_SIZE = 5L * MB; + /** + * 默认缓冲区大小 + */ + public static final int DEFAULT_BUFFER_SIZE = 8 * KB; + /** + * 默认最大分片数 + */ + public static final Long DEFAULT_PART_NUM = 10000L; + /** + * 默认并发线程数 + */ + public static final Integer DEFAULT_TASK_NUM = Runtime.getRuntime().availableProcessors(); + + public static final Long DEFAULT_CONNECTION_TIMEOUT = TimeUnit.MINUTES.toMillis(5); + + /** + * OSS存储类型 + */ + public interface OssType { + String LOCAL = "local"; + String FTP = "ftp"; + String SFTP = "sftp"; + String ALI = "ali"; + String QINIU = "qiniu"; + String MINIO = "minio"; + String BAIDU = "baidu"; + String TENCENT = "tencent"; + String HUAWEI = "huawei"; + String JD = "jd"; + String UP = "up"; + String JINSHAN = "jinshan"; + String WANGYI = "wangyi"; + String UCLOUD = "ucloud"; + String PINGAN = "pingan"; + String QINGYUN = "qingyun"; + String JDBC = "jdbc"; + String AWS = "aws"; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/StandardOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/StandardOssClient.java new file mode 100644 index 0000000..843d62a --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/StandardOssClient.java @@ -0,0 +1,661 @@ +package com.schisandra.oss.application.oss.core; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.model.download.DownloadPart; +import com.schisandra.oss.application.oss.model.download.DownloadPartResult; +import com.schisandra.oss.application.oss.model.upload.UpLoadCheckPoint; +import com.schisandra.oss.application.oss.model.upload.UpLoadPartEntityTag; +import com.schisandra.oss.application.oss.model.upload.UpLoadPartResult; +import com.schisandra.oss.application.oss.model.upload.UploadPart; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.*; + +/** + * @author landaiqing + * @version AbstractOssClient.java, v 1.1 2021/11/5 15:44 chenmin Exp $ + * Created on 2021/11/5 + */ + +public interface StandardOssClient { + + /** + * 上传文件,默认覆盖 + * @param is 输入流 + * @param targetName 目标文件路径 + * @return 文件信息 + */ + default OssInfo upLoad(InputStream is, String targetName) { + return upLoad(is, targetName, true); + } + + /** + * 上传文件 + * @param is 输入流 + * @param targetName 目标文件路径 + * @param isOverride 是否覆盖 + * @return 文件信息 + */ + OssInfo upLoad(InputStream is, String targetName, Boolean isOverride); + + /** + * 断点续传 + * @param file 本地文件路径 + * @param targetName 目标文件路径 + * @return 文件信息 + */ + default OssInfo upLoadCheckPoint(String file, String targetName) { + return upLoadCheckPoint(new File(file), targetName); + } + + /** + * 断点续传 + * @param file 本地文件 + * @param targetName 目标文件路径 + * @return 文件信息 + */ + OssInfo upLoadCheckPoint(File file, String targetName); + + /** + * 断点续传上传 + * @param upLoadFile 上传文件 + * @param targetName 目标对象路径 + * @param slice 分片参数 + * @param ossType OSS类型 + * @return 上传文件信息 + */ + default OssInfo uploadFile(File upLoadFile, String targetName, SliceConfig slice, String ossType) { + String checkpointFile = upLoadFile.getPath() + StrUtil.DOT + ossType; + + UpLoadCheckPoint upLoadCheckPoint = new UpLoadCheckPoint(); + try { + upLoadCheckPoint.load(checkpointFile); + } catch (Exception e) { + FileUtil.del(checkpointFile); + } + + if (!upLoadCheckPoint.isValid()) { + prepareUpload(upLoadCheckPoint, upLoadFile, targetName, checkpointFile, slice); + FileUtil.del(checkpointFile); + } + + ExecutorService executorService = Executors.newFixedThreadPool(slice.getTaskNum()); + List> futures = new ArrayList<>(); + + for (int i = 0; i < upLoadCheckPoint.getUploadParts().size(); i++) { + if (!upLoadCheckPoint.getUploadParts().get(i).isCompleted()) { + futures.add(executorService.submit(new UploadPartTask(this, upLoadCheckPoint, i))); + } + } + + executorService.shutdown(); + + for (Future future : futures) { + try { + UpLoadPartResult partResult = future.get(); + if (partResult.isFailed()) { + throw partResult.getException(); + } + } catch (Exception e) { + throw new OssException(e); + } + } + + try { + if (!executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + } catch (InterruptedException e) { + throw new OssException("关闭线程池失败", e); + } + + List partEntityTags = upLoadCheckPoint.getPartEntityTags(); + completeUpload(upLoadCheckPoint, partEntityTags); + + return getInfo(targetName); + } + + /** + * 完成分片上传 + * @param upLoadCheckPoint 断点对象 + * @param partEntityTags 所有分片 + */ + default void completeUpload(UpLoadCheckPoint upLoadCheckPoint, List partEntityTags) { + FileUtil.del(upLoadCheckPoint.getCheckpointFile()); + } + + /** + * 初始化断点续传对象 + * @param uploadCheckPoint 断点续传对象 + * @param upLoadFile 要上传的文件 + * @param targetName 上传文件名 + * @param checkpointFile 断点文件 + * @param slice 分片参数 + */ + default void prepareUpload(UpLoadCheckPoint uploadCheckPoint, File upLoadFile, String targetName, String checkpointFile, SliceConfig slice) { + throw new OssException("初始化断点续传对象未实现,默认不支持此方法"); + } + + /** + * 拆分上传分片 + * @param fileSize 文件大小 + * @param partSize 分片大小 + * @return 所有分片对象 + */ + default ArrayList splitUploadFile(long fileSize, long partSize) { + ArrayList parts = new ArrayList<>(); + + long partNum = fileSize / partSize; + if (partNum >= OssConstant.DEFAULT_PART_NUM) { + partSize = fileSize / (OssConstant.DEFAULT_PART_NUM - 1); + partNum = fileSize / partSize; + } + + for (long i = 0; i < partNum; i++) { + UploadPart part = new UploadPart(); + part.setNumber((int) (i + 1)); + part.setOffset(i * partSize); + part.setSize(partSize); + part.setCompleted(false); + parts.add(part); + } + + if (fileSize % partSize > 0) { + UploadPart part = new UploadPart(); + part.setNumber(parts.size() + 1); + part.setOffset(parts.size() * partSize); + part.setSize(fileSize % partSize); + part.setCompleted(false); + parts.add(part); + } + + return parts; + } + + /** + * 分片上传Task + */ + @Data + @AllArgsConstructor + @NoArgsConstructor + class UploadPartTask implements Callable { + /** + * OSS客户端 + */ + private StandardOssClient ossClient; + /** + * 断点续传对象 + */ + private UpLoadCheckPoint upLoadCheckPoint; + /** + * 分片索引 + */ + private int partNum; + + @Override + public UpLoadPartResult call() { + InputStream inputStream = FileUtil.getInputStream(upLoadCheckPoint.getUploadFile()); + UpLoadPartResult upLoadPartResult = ossClient.uploadPart(upLoadCheckPoint, partNum, inputStream); + if (!upLoadPartResult.isFailed()) { + upLoadCheckPoint.update(partNum, upLoadPartResult.getEntityTag(), true); + upLoadCheckPoint.dump(); + } + return upLoadPartResult; + } + } + + /** + * 上传分片 + * @param upLoadCheckPoint 断点续传对象 + * @param partNum 分片索引 + * @param inputStream 文件流 + * @return 上传结果 + */ + default UpLoadPartResult uploadPart(UpLoadCheckPoint upLoadCheckPoint, int partNum, InputStream inputStream) { + throw new OssException("上传文件分片方法未实现,默认不支持此方法"); + } + + /** + * 下载文件 + * @param os 输出流 + * @param targetName 目标文件路径 + */ + void downLoad(OutputStream os, String targetName); + + /** + * 断点续传 + * @param localFile 本地文件路径 + * @param targetName 目标文件路径 + */ + default void downLoadCheckPoint(String localFile, String targetName) { + downLoadCheckPoint(new File(localFile), targetName); + } + + /** + * 断点续传 + * @param localFile 本地文件 + * @param targetName 目标文件路径 + */ + void downLoadCheckPoint(File localFile, String targetName); + + /** + * 断点续传下载 + * @param localFile 本地文件 + * @param targetName 目标对象 + * @param slice 分片参数 + * @param ossType OSS类型 + */ + default void downLoadFile(File localFile, String targetName, SliceConfig slice, String ossType) { + + String checkpointFile = localFile.getPath() + StrUtil.DOT + ossType; + + DownloadCheckPoint downloadCheckPoint = new DownloadCheckPoint(); + try { + downloadCheckPoint.load(checkpointFile); + } catch (Exception e) { + FileUtil.del(checkpointFile); + } + + DownloadObjectStat downloadObjectStat = getDownloadObjectStat(targetName); + if (!downloadCheckPoint.isValid(downloadObjectStat)) { + prepareDownload(downloadCheckPoint, localFile, targetName, checkpointFile); + FileUtil.del(checkpointFile); + } + + ExecutorService executorService = Executors.newFixedThreadPool(slice.getTaskNum()); + List> futures = new ArrayList<>(); + + for (int i = 0; i < downloadCheckPoint.getDownloadParts().size(); i++) { + if (!downloadCheckPoint.getDownloadParts().get(i).isCompleted()) { + futures.add(executorService.submit(new DownloadPartTask(this, downloadCheckPoint, i))); + } + } + + executorService.shutdown(); + + for (Future future : futures) { + try { + DownloadPartResult partResult = future.get(); + if (partResult.isFailed()) { + throw partResult.getException(); + } + } catch (Exception e) { + throw new OssException(e); + } + } + + try { + if (!executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + } catch (InterruptedException e) { + throw new OssException("关闭线程池失败", e); + } + + FileUtil.rename(new File(downloadCheckPoint.getTempDownloadFile()), downloadCheckPoint.getDownloadFile(), true); + FileUtil.del(downloadCheckPoint.getCheckPointFile()); + } + + /** + * 分片下载Task + */ + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class DownloadPartTask implements Callable { + + /** + * Oss客户端 + */ + StandardOssClient ossClient; + /** + * 断点续传对象 + */ + DownloadCheckPoint downloadCheckPoint; + /** + * 分片索引 + */ + int partNum; + + @Override + public DownloadPartResult call() { + DownloadPartResult partResult = null; + RandomAccessFile output = null; + InputStream content = null; + try { + DownloadPart downloadPart = downloadCheckPoint.getDownloadParts().get(partNum); + + partResult = new DownloadPartResult(partNum + 1, downloadPart.getStart(), downloadPart.getEnd()); + + output = new RandomAccessFile(downloadCheckPoint.getTempDownloadFile(), "rw"); + output.seek(downloadPart.getFileStart()); + + content = ossClient.downloadPart(downloadCheckPoint.getKey(), downloadPart.getStart(), downloadPart.getEnd()); + + long partSize = downloadPart.getEnd() - downloadPart.getStart(); + byte[] buffer = new byte[Convert.toInt(partSize)]; + int bytesRead = 0; + while ((bytesRead = content.read(buffer)) != -1) { + output.write(buffer, 0, bytesRead); + } + + partResult.setLength(downloadPart.getLength()); + downloadCheckPoint.update(partNum, true); + downloadCheckPoint.dump(); + } catch (Exception e) { + partResult.setException(e); + partResult.setFailed(true); + } finally { + IoUtil.close(output); + IoUtil.close(content); + } + return partResult; + } + } + + /** + * 获取目标文件状态 + * @param targetName 目标对象路径 + * @return 目标文件状态 + */ + default DownloadObjectStat getDownloadObjectStat(String targetName) { + throw new OssException("获取下载对象状态方法未实现,默认不支持此方法"); + } + + /** + * 初始化断点续传下载对象 + * @param downloadCheckPoint 断点对象 + * @param localFile 本地文件 + * @param targetName 目标对象路径 + * @param checkpointFile 下载进度缓存文件 + */ + default void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + throw new OssException("初始化断点续传下载对象方法未实现,默认不支持此方法"); + } + + /** + * 拆分文件分片 + * @param start 开始字节数 + * @param objectSize 对象大小 + * @param partSize 预设分片大小 + * @return 所有分片对象 + */ + default ArrayList splitDownloadFile(long start, long objectSize, long partSize) { + ArrayList parts = new ArrayList<>(); + + long partNum = objectSize / partSize; + if (partNum >= OssConstant.DEFAULT_PART_NUM) { + partSize = objectSize / (OssConstant.DEFAULT_PART_NUM - 1); + } + + long offset = 0L; + for (int i = 0; offset < objectSize; offset += partSize, i++) { + DownloadPart part = new DownloadPart(); + part.setIndex(i); + part.setStart(offset + start); + part.setEnd(getPartEnd(offset, objectSize, partSize) + start); + part.setFileStart(offset); + parts.add(part); + } + + return parts; + } + + /** + * 获取分片结束字节数 + * @param begin 开始字节数 + * @param total 目标对象大小 + * @param per 预设分片大小 + * @return 分片结束字节数 + */ + default long getPartEnd(long begin, long total, long per) { + if (begin + per > total) { + return total - 1; + } + return begin + per - 1; + } + + /** + * 拆分单独一个文件分片 + * @return 一个文件分片 + */ + default ArrayList splitDownloadOneFile() { + ArrayList parts = new ArrayList<>(); + DownloadPart part = new DownloadPart(); + part.setIndex(0); + part.setStart(0); + part.setEnd(-1); + part.setFileStart(0); + parts.add(part); + return parts; + } + + /** + * 获取下载分片范围 + * @param range 分片 + * @param totalSize 目标文件大小 + * @return 返回分片范围 + */ + default long[] getDownloadSlice(long[] range, long totalSize) { + long start = 0; + long size = totalSize; + + if ((range == null) || + (range.length != 2) || + (totalSize < 1) || + (range[0] < 0 && range[1] < 0) || + (range[0] > 0 && range[1] > 0 && range[0] > range[1])|| + (range[0] >= totalSize)) { + //download all + } else { + //dwonload part by range & total size + long begin = range[0]; + long end = range[1]; + if (range[0] < 0) { + begin = 0; + } + if (range[1] < 0 || range[1] >= totalSize) { + end = totalSize -1; + } + start = begin; + size = end - begin + 1; + } + + return new long[]{start, size}; + } + + /** + * 创建下载缓存文件 + * @param downloadTempFile 下载缓存文件 + * @param length 文件大小 + */ + default void createDownloadTemp(String downloadTempFile, long length) { + File file = new File(downloadTempFile); + RandomAccessFile rf = null; + try { + rf = new RandomAccessFile(file, "rw"); + rf.setLength(length); + } catch (Exception e) { + throw new OssException("创建下载缓存文件失败"); + } finally { + IoUtil.close(rf); + } + } + + /** + * 下载分片 + * @param key 目标文件 + * @param start 文件开始字节 + * @param end 文件结束字节 + * @return 此范围的文件流 + * @throws Exception 客户端异常 + */ + default InputStream downloadPart(String key, long start, long end) throws Exception { + throw new OssException("下载文件分片方法未实现,默认不支持此方法"); + } + + /** + * 删除文件 + * @param targetName 目标文件路径 + */ + void delete(String targetName); + + /** + * 复制文件,默认覆盖 + * @param sourceName 源文件路径 + * @param targetName 目标文件路径 + */ + default void copy(String sourceName, String targetName) { + copy(sourceName, targetName, true); + } + + /** + * 复制文件 + * @param sourceName 源文件路径 + * @param targetName 目标文件路径 + * @param isOverride 是否覆盖 + */ + void copy(String sourceName, String targetName, Boolean isOverride); + + /** + * 移动文件,默认覆盖 + * @param sourceName 源文件路径 + * @param targetName 目标路径 + */ + default void move(String sourceName, String targetName) { + move(sourceName, targetName, true); + } + + /** + * 移动文件 + * @param sourceName 源文件路径 + * @param targetName 目标路径 + * @param isOverride 是否覆盖 + */ + default void move(String sourceName, String targetName, Boolean isOverride) { + copy(sourceName, targetName, isOverride); + delete(sourceName); + } + + /** + * 重命名文件 + * @param sourceName 源文件路径 + * @param targetName 目标文件路径 + */ + default void rename(String sourceName, String targetName) { + rename(sourceName, targetName, true); + } + + /** + * 重命名文件 + * @param sourceName 源文件路径 + * @param targetName 目标路径 + * @param isOverride 是否覆盖 + */ + default void rename(String sourceName, String targetName, Boolean isOverride) { + move(sourceName, targetName, isOverride); + } + + /** + * 获取文件信息,默认获取目标文件信息 + * @param targetName 目标文件路径 + * @return 文件基本信息 + */ + default OssInfo getInfo(String targetName) { + return getInfo(targetName, false); + } + + /** + * 获取文件信息 + * isRecursion传false,则只获取当前对象信息; + * isRecursion传true,且当前对象为目录时,会递归获取当前路径下所有文件及目录,按层级返回 + * @param targetName 目标文件路径 + * @param isRecursion 是否递归 + * @return 文件基本信息 + */ + OssInfo getInfo(String targetName, Boolean isRecursion); + + /** + * 是否存在 + * @param targetName 目标文件路径 + * @return true/false + */ + default Boolean isExist(String targetName) { + OssInfo info = getInfo(targetName); + return ObjectUtil.isNotEmpty(info) && ObjectUtil.isNotEmpty(info.getName()); + } + + /** + * 是否为文件 + * 默认根据路径最后一段名称是否有后缀名来判断是否为文件,此方式不准确,当存储平台不提供类似方法时,可使用此方法 + * @param targetName 目标文件路径 + * @return true/false + */ + default Boolean isFile(String targetName) { + String name = FileNameUtil.getName(targetName); + return StrUtil.indexOf(name, StrUtil.C_DOT) > 0; + } + + /** + * 是否为目录 + * 与判断是否为文件相反 + * @param targetName 目标文件路径 + * @return true/false + */ + default Boolean isDirectory(String targetName) { + return !isFile(targetName); + } + + /** + * 获取标准的OSS客户端底层操作对象 + * @return + */ + Map getClientObject(); + + /** + * 获取完整Key + * @param targetName 目标地址 + * @param isAbsolute 是否绝对路径 + * true:绝对路径;false:相对路径 + * @return 完整路径 + */ + default String getKey(String targetName, Boolean isAbsolute) { + String key = OssPathUtil.convertPath(getBasePath() + targetName, isAbsolute); + if (FileUtil.isWindows() && isAbsolute) { + if (key.contains(StrUtil.COLON) && key.startsWith(StrUtil.SLASH)) { + key = key.substring(1); + } + } + return key; + } + + /** + * 获取文件存储根路径 + * @return 根路径 + */ + String getBasePath(); + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/AliOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/AliOssClient.java new file mode 100644 index 0000000..a3a4fdf --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/AliOssClient.java @@ -0,0 +1,234 @@ +package com.schisandra.oss.application.oss.core.ali; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.aliyun.oss.OSS; +import com.aliyun.oss.common.utils.HttpHeaders; +import com.aliyun.oss.model.*; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.ali.model.AliOssConfig; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.*; + +/** + * https://help.aliyun.com/product/31815.html + * + * @author landaiqing + * @version AliOssClient.java, v 1.1 2021/11/15 11:12 chenmin Exp $ + * Created on 2021/11/15 + */ +@Data +@Slf4j +@AllArgsConstructor +@NoArgsConstructor +public class AliOssClient implements StandardOssClient { + + public static final String OSS_OBJECT_NAME = "oss"; + + private OSS oss; + private AliOssConfig aliOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + + if (isOverride || !oss.doesObjectExist(bucketName, key)) { + oss.putObject(bucketName, key, is, new ObjectMetadata()); + } + return getInfo(targetName); + } + + /** + * 断点续传,使用SDK断点续传API实现,底层通过分块上传实现 + * + * @param file 本地文件 + * @param targetName 目标文件路径 + * @return 文件信息 + */ + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + try { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + + UploadFileRequest uploadFileRequest = new UploadFileRequest(bucketName, key); + String filePath = file.getPath(); + uploadFileRequest.setUploadFile(filePath); + + SliceConfig slice = aliOssConfig.getSliceConfig(); + uploadFileRequest.setTaskNum(slice.getTaskNum()); + uploadFileRequest.setPartSize(slice.getPartSize()); + + uploadFileRequest.setEnableCheckpoint(true); + + String checkpointFile = filePath + StrUtil.DOT + OssConstant.OssType.ALI; + uploadFileRequest.setCheckpointFile(checkpointFile); + + oss.uploadFile(uploadFileRequest); + } catch (Throwable e) { + throw new OssException(e); + } + return getInfo(targetName); + } + + @Override + public void downLoad(OutputStream os, String targetName) { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + OSSObject ossObject = oss.getObject(bucketName, key); + IoUtil.copy(ossObject.getObjectContent(), os); + IoUtil.close(ossObject); + } + + @SneakyThrows + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + String filePath = localFile.getPath(); + + DownloadFileRequest downloadFileRequest = new DownloadFileRequest(bucketName, key); + downloadFileRequest.setDownloadFile(filePath); + + SliceConfig sliceConfig = aliOssConfig.getSliceConfig(); + downloadFileRequest.setPartSize(sliceConfig.getPartSize()); + downloadFileRequest.setTaskNum(sliceConfig.getTaskNum()); + downloadFileRequest.setEnableCheckpoint(true); + + String checkpointFile = filePath + StrUtil.DOT + OssConstant.OssType.ALI; + downloadFileRequest.setCheckpointFile(checkpointFile); + + oss.downloadFile(downloadFileRequest); + } + + @Override + public void delete(String targetName) { + oss.deleteObject(getBucketName(), getKey(targetName, false)); + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + String bucketName = getBucketName(); + String targetKey = getKey(targetName, false); + if (isOverride || !oss.doesObjectExist(bucketName, targetKey)) { + oss.copyObject(bucketName, getKey(sourceName, false), bucketName, targetKey); + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + String bucketName = getBucketName(); + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(bucketName, key); + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + + if (isRecursion && isDirectory(key)) { + ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); + listObjectsRequest.setDelimiter(StrUtil.SLASH); + String prefix = OssPathUtil.convertPath(key, false); + listObjectsRequest.setPrefix(prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH); + ObjectListing listing = oss.listObjects(listObjectsRequest); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + for (OSSObjectSummary ossObjectSummary : listing.getObjectSummaries()) { + if (FileNameUtil.getName(ossObjectSummary.getKey()).equals(FileNameUtil.getName(key))) { + ossInfo.setLastUpdateTime(DateUtil.date(ossObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date(ossObjectSummary.getLastModified()).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(ossObjectSummary.getSize())); + } else { + fileOssInfos.add(getInfo(OssPathUtil.replaceKey(ossObjectSummary.getKey(), getBasePath(), false), false)); + } + } + + for (String commonPrefix : listing.getCommonPrefixes()) { + String target = OssPathUtil.replaceKey(commonPrefix, getBasePath(), false); + if (isDirectory(commonPrefix)) { + directoryInfos.add(getInfo(target, true)); + } else { + fileOssInfos.add(getInfo(target, false)); + } + } + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + + return ossInfo; + } + + @Override + public Boolean isExist(String targetName) { + return oss.doesObjectExist(getBucketName(), getKey(targetName, false)); + } + + @Override + public String getBasePath() { + return aliOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(OSS_OBJECT_NAME, getOss()); + } + }; + } + + public String getBucketName() { + String bucketName = aliOssConfig.getBucketName(); + if (!oss.doesBucketExist(bucketName)) { + oss.createBucket(bucketName); + } + return bucketName; + } + + public OssInfo getBaseInfo(String bucketName, String key) { + OssInfo ossInfo; + + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + ObjectMetadata objectMetadata = oss.getObjectMetadata(bucketName, OssPathUtil.replaceKey(key, "", false)); + ossInfo.setLastUpdateTime(DateUtil.date((Date) objectMetadata.getRawMetadata().get(HttpHeaders.LAST_MODIFIED)).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setCreateTime(DateUtil.date((Date) objectMetadata.getRawMetadata().get(HttpHeaders.DATE)).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(objectMetadata.getContentLength())); + } catch (Exception e) { + log.error("获取{}文件属性失败", key, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + return ossInfo; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/AliOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/AliOssConfiguration.java new file mode 100644 index 0000000..42642dd --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/AliOssConfiguration.java @@ -0,0 +1,111 @@ +package com.schisandra.oss.application.oss.core.ali; + +import cn.hutool.core.text.CharPool; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.OSSClientBuilder; + +import com.aliyun.oss.common.comm.Protocol; +import com.schisandra.oss.application.convert.SchisandraOssAliDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssAliDTO; +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.ali.model.AliOssClientConfig; +import com.schisandra.oss.application.oss.core.ali.model.AliOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssAliBO; +import com.schisandra.oss.domain.service.SchisandraOssAliDomainService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Map; +import java.util.Optional; + +/** + * @author landaiqing + * @version AliOssConfiguration.java, v 1.1 2021/11/16 15:25 chenmin Exp $ + * Created on 2021/11/16 + */ +@Configuration +@Slf4j +public class AliOssConfiguration { + + @Resource + SchisandraOssAliDomainService schisandraOssAliDomainService; + + @Bean + public StandardOssClient aliOssClient() { + SchisandraOssAliBO schisandraOssAliBO = schisandraOssAliDomainService.getAliOssConfig(1L); + SchisandraOssAliDTO schisandraOssAliDTO = SchisandraOssAliDTOConverter.INSTANCE.convertBOToDTO(schisandraOssAliBO); + if (ObjectUtils.isEmpty(schisandraOssAliDTO)) { + log.error("ali oss配置信息获取失败"); + return null; + } + AliOssConfig aliOssConfig = new AliOssConfig(); + aliOssConfig.setEndpoint(schisandraOssAliDTO.getEndpoint()); + aliOssConfig.setAccessKeyId(schisandraOssAliDTO.getAccessKeyId()); + aliOssConfig.setAccessKeySecret(schisandraOssAliDTO.getAccessKeySecret()); + aliOssConfig.setSecurityToken(schisandraOssAliDTO.getSecurityToken()); + if (Boolean.parseBoolean(schisandraOssAliDTO.getOpenAdvancedSetup())) { + AliOssClientConfig aliOssClientConfig = new AliOssClientConfig(); + aliOssClientConfig.setCnameExcludeList(Arrays.asList(Optional.ofNullable(schisandraOssAliDTO.getCnameExcludeList()).orElse("").split(","))); + aliOssClientConfig.setConnectionTimeout(schisandraOssAliDTO.getConnectionTimeout()); + aliOssClientConfig.setConnectionTTL(schisandraOssAliDTO.getConnectionTTL()); + aliOssClientConfig.setProtocol(Protocol.valueOf(schisandraOssAliDTO.getProtocol())); + aliOssClientConfig.setConnectionRequestTimeout(schisandraOssAliDTO.getConnectionRequestTimeout()); + aliOssClientConfig.setMaxConnections(schisandraOssAliDTO.getMaxConnections()); + aliOssClientConfig.setProxyPort(Integer.parseInt(schisandraOssAliDTO.getProxyPort())); + aliOssClientConfig.setProxyDomain(schisandraOssAliDTO.getProxyDomain()); + aliOssClientConfig.setCrcCheckEnabled(Boolean.parseBoolean(schisandraOssAliDTO.getCrcCheckEnabled())); + aliOssClientConfig.setTickOffset(schisandraOssAliDTO.getTickOffset()); + aliOssClientConfig.setProxyHost(schisandraOssAliDTO.getProxyHost()); + aliOssClientConfig.setProxyPassword(schisandraOssAliDTO.getProxyPassword()); + aliOssClientConfig.setProxyUsername(schisandraOssAliDTO.getProxyUsername()); + aliOssClientConfig.setVerifySSLEnable(Boolean.parseBoolean(schisandraOssAliDTO.getVerifySSLEnable())); + aliOssClientConfig.setUseSystemPropertyValues(Boolean.parseBoolean(schisandraOssAliDTO.getUseSystemPropertyValues())); + aliOssClientConfig.setUseReaper(Boolean.parseBoolean(schisandraOssAliDTO.getUseReaper())); + aliOssClientConfig.setSupportCname(Boolean.parseBoolean(schisandraOssAliDTO.getSupportCname())); + aliOssClientConfig.setSocketTimeout(schisandraOssAliDTO.getSocketTimeout()); + aliOssClientConfig.setSldEnabled(Boolean.parseBoolean(schisandraOssAliDTO.getSldEnabled())); + aliOssClientConfig.setProxyWorkstation(schisandraOssAliDTO.getProxyWorkstation()); + aliOssClientConfig.setIdleConnectionTime(schisandraOssAliDTO.getIdleConnectionTime()); + aliOssClientConfig.setLogConnectionPoolStats(Boolean.parseBoolean(schisandraOssAliDTO.getLogConnectionPoolStats())); + aliOssConfig.setClientConfig(aliOssClientConfig); + } + return aliOssClient(aliOssConfig); + } + + public StandardOssClient aliOssClient(AliOssConfig aliOssConfig) { + return new AliOssClient(ossClient(aliOssConfig), aliOssConfig); + } + + public OSS ossClient(AliOssConfig aliOssConfig) { + String securityToken = aliOssConfig.getSecurityToken(); + AliOssClientConfig clientConfiguration = aliOssConfig.getClientConfig(); + if (ObjectUtil.isEmpty(securityToken) && ObjectUtil.isNotEmpty(clientConfiguration)) { + return new OSSClientBuilder().build(aliOssConfig.getEndpoint(), + aliOssConfig.getAccessKeyId(), + aliOssConfig.getAccessKeySecret(), clientConfiguration.toClientConfig()); + } + if (ObjectUtil.isNotEmpty(securityToken) && ObjectUtil.isEmpty(clientConfiguration)) { + return new OSSClientBuilder().build(aliOssConfig.getEndpoint(), + aliOssConfig.getAccessKeyId(), + aliOssConfig.getAccessKeySecret(), securityToken); + } + return new OSSClientBuilder().build(aliOssConfig.getEndpoint(), + aliOssConfig.getAccessKeyId(), + aliOssConfig.getAccessKeySecret(), securityToken, + Optional.ofNullable(clientConfiguration).orElse(new AliOssClientConfig()).toClientConfig()); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/model/AliOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/model/AliOssClientConfig.java new file mode 100644 index 0000000..da2868d --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/model/AliOssClientConfig.java @@ -0,0 +1,159 @@ +package com.schisandra.oss.application.oss.core.ali.model; + +import cn.hutool.core.bean.BeanUtil; +import com.aliyun.oss.ClientBuilderConfiguration; +import com.aliyun.oss.common.comm.Protocol; +import com.aliyun.oss.common.comm.SignVersion; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import static com.aliyun.oss.ClientConfiguration.*; + +/** + * @author landaiqing + * @version AliOssClientConfig.java, v 1.0 2022/4/20 16:12 chenmin Exp $ + * Created on 2022/4/20 + */ +@Data +@Accessors(chain = true) +public class AliOssClientConfig { + /** + * 用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。 + */ + private String userAgent = DEFAULT_USER_AGENT; + /** + * 请求失败后最大的重试次数。默认3次。 + */ + private int maxErrorRetry = DEFAULT_MAX_RETRIES; + /** + * 从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。 + */ + private int connectionRequestTimeout = DEFAULT_CONNECTION_REQUEST_TIMEOUT; + /** + * 建立连接的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private int connectionTimeout = DEFAULT_CONNECTION_TIMEOUT; + /** + * Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private int socketTimeout = DEFAULT_SOCKET_TIMEOUT; + /** + * 允许打开的最大HTTP连接数。默认为1024 + */ + private int maxConnections = DEFAULT_MAX_CONNECTIONS; + /** + * 连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。 + */ + private long connectionTTL = DEFAULT_CONNECTION_TTL; + /** + * 是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启 + */ + private boolean useReaper = DEFAULT_USE_REAPER; + /** + * 连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。 + */ + private long idleConnectionTime = DEFAULT_IDLE_CONNECTION_TIME; + /** + * 连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。 + */ + private Protocol protocol = Protocol.HTTP; + /** + * 代理服务器主机地址。 + */ + private String proxyHost = null; + /** + * 代理服务器端口。 + */ + private int proxyPort = -1; + /** + * 代理服务器验证的用户名。 + */ + private String proxyUsername = null; + /** + * 代理服务器验证的密码。 + */ + private String proxyPassword = null; + /** + * 代理服务器的域,该域可以执行NTLM认证 + */ + private String proxyDomain = null; + /** + * 代理主机的NTLM身份验证服务器 + */ + private String proxyWorkstation = null; + /** + * 是否支持CNAME作为Endpoint,默认支持CNAME。 + */ + private boolean supportCname = false; + /** + * 设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。 + */ + private List cnameExcludeList = new ArrayList(); + /** + * 是否开启二级域名(Second Level Domain)的访问方式,默认不开启。 + */ + private boolean sldEnabled = false; + /** + * 请求超时时间,单位:毫秒。默认情况下是5分钟。 + */ + private int requestTimeout = DEFAULT_REQUEST_TIMEOUT; + /** + * 是否启用请求超时校验。默认情况下,它是禁用的。 + */ + private boolean requestTimeoutEnabled = false; + /** + * 设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。 + */ + private long slowRequestsThreshold = DEFAULT_SLOW_REQUESTS_THRESHOLD; + /** + * 设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。 + */ + private Map defaultHeaders = new LinkedHashMap(); + /** + * 是否在上传和下载时启用CRC校验,默认启用 + */ + private boolean crcCheckEnabled = true; + /** + * 所有请求设置签名版本 + */ + private SignVersion signatureVersion = DEFAULT_SIGNATURE_VERSION; + /** + * 设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。 + */ + private long tickOffset = 0; + /** + * 是否开启HTTP重定向。 + * 说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。 + */ + private boolean redirectEnable = true; + /** + * 是否开启SSL证书校验。 + * 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。 + */ + private boolean verifySSLEnable = true; + /** + * 是否开启日志记录连接池统计信息 + */ + private boolean logConnectionPoolStats = false; + /** + * 是否使用系统属性值 + */ + private boolean useSystemPropertyValues = false; + + public ClientBuilderConfiguration toClientConfig() { + ClientBuilderConfiguration clientConfig = new ClientBuilderConfiguration(); + BeanUtil.copyProperties(this, clientConfig, "proxyPort", "tickOffset"); + if (this.proxyPort != -1) { + clientConfig.setProxyPort(this.proxyPort); + } + if (this.tickOffset != 0) { + clientConfig.setTickOffset(this.tickOffset); + } + return clientConfig; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/model/AliOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/model/AliOssConfig.java new file mode 100644 index 0000000..716ee9c --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/ali/model/AliOssConfig.java @@ -0,0 +1,52 @@ +package com.schisandra.oss.application.oss.core.ali.model; + + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author landaiqing + * @version AliGroupInfo.java, v 1.1 2022/2/18 17:48 chenmin Exp $ + * Created on 2022/2/18 + */ +@Data +@EqualsAndHashCode +public class AliOssConfig { + /** + * 数据存储路径 + */ + private String basePath; + /** + * Bucket名称 + */ + private String bucketName; + /** + * OSS地址 + */ + private String endpoint; + /** + * AccessKey ID + */ + private String accessKeyId; + /** + * AccessKey Secret + */ + private String accessKeySecret; + + private String securityToken; + + private AliOssClientConfig clientConfig; + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } + +} \ No newline at end of file diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java new file mode 100644 index 0000000..38950b7 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssClient.java @@ -0,0 +1,284 @@ +package com.schisandra.oss.application.oss.core.minio; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.io.file.FileNameUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.aliyun.oss.common.utils.HttpHeaders; +import com.google.common.io.ByteStreams; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig; +import com.schisandra.oss.application.oss.exception.OssException; +import com.schisandra.oss.application.oss.model.DirectoryOssInfo; +import com.schisandra.oss.application.oss.model.FileOssInfo; +import com.schisandra.oss.application.oss.model.OssInfo; +import com.schisandra.oss.application.oss.model.download.DownloadCheckPoint; +import com.schisandra.oss.application.oss.model.download.DownloadObjectStat; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import io.minio.*; +import io.minio.messages.Item; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Headers; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.File; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Serializable; +import java.util.*; + +/** + * http://docs.minio.org.cn/docs/master/minio-monitoring-guide + * https://docs.min.io/ + * + * @author landaiqing + * @version MinioOssClient.java, v 1.1 2021/11/24 15:35 chenmin Exp $ + * Created on 2021/11/24 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +@Component +public class MinioOssClient implements StandardOssClient { + + public static final String MINIO_OBJECT_NAME = "minioClient"; + + private MinioClient minioClient; + private MinioOssConfig minioOssConfig; + + @Override + public OssInfo upLoad(InputStream is, String targetName, Boolean isOverride) { + try { + String bucket = getBucket(); + String key = getKey(targetName, true); + minioClient.putObject(PutObjectArgs.builder() + .bucket(bucket) + .object(key) + .stream(is, is.available(), -1) + .build()); + } catch (Exception e) { + throw new OssException(e); + } + return getInfo(targetName); + } + + @Override + public OssInfo upLoadCheckPoint(File file, String targetName) { + try (InputStream inputStream = FileUtil.getInputStream(file)) { + upLoad(inputStream, targetName, true); + } catch (Exception e) { + throw new OssException(e); + } + return getInfo(targetName); + } + + @Override + public void downLoad(OutputStream os, String targetName) { + GetObjectResponse is = null; + try { + GetObjectArgs getObjectArgs = GetObjectArgs.builder() + .bucket(getBucket()) + .object(getKey(targetName, true)) + .build(); + is = minioClient.getObject(getObjectArgs); + ByteStreams.copy(is, os); + } catch (Exception e) { + throw new OssException(e); + } finally { + IoUtil.close(is); + } + } + + @Override + public void downLoadCheckPoint(File localFile, String targetName) { + downLoadFile(localFile, targetName, minioOssConfig.getSliceConfig(), OssConstant.OssType.MINIO); + } + + @Override + public DownloadObjectStat getDownloadObjectStat(String targetName) { + try { + StatObjectArgs statObjectArgs = StatObjectArgs.builder().bucket(getBucket()).object(getKey(targetName, true)).build(); + StatObjectResponse statObjectResponse = minioClient.statObject(statObjectArgs); + long contentLength = statObjectResponse.size(); + String eTag = statObjectResponse.etag(); + return new DownloadObjectStat().setSize(contentLength) + .setLastModified(Date.from(statObjectResponse.lastModified().toInstant())).setDigest(eTag); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void prepareDownload(DownloadCheckPoint downloadCheckPoint, File localFile, String targetName, String checkpointFile) { + downloadCheckPoint.setMagic(DownloadCheckPoint.DOWNLOAD_MAGIC); + downloadCheckPoint.setDownloadFile(localFile.getPath()); + downloadCheckPoint.setBucketName(getBucket()); + downloadCheckPoint.setKey(getKey(targetName, false)); + downloadCheckPoint.setCheckPointFile(checkpointFile); + + downloadCheckPoint.setObjectStat(getDownloadObjectStat(targetName)); + + long downloadSize; + if (downloadCheckPoint.getObjectStat().getSize() > 0) { + Long partSize = minioOssConfig.getSliceConfig().getPartSize(); + long[] slice = getDownloadSlice(new long[0], downloadCheckPoint.getObjectStat().getSize()); + downloadCheckPoint.setDownloadParts(splitDownloadFile(slice[0], slice[1], partSize)); + downloadSize = slice[1]; + } else { + //download whole file + downloadSize = 0; + downloadCheckPoint.setDownloadParts(splitDownloadOneFile()); + } + downloadCheckPoint.setOriginPartSize(downloadCheckPoint.getDownloadParts().size()); + createDownloadTemp(downloadCheckPoint.getTempDownloadFile(), downloadSize); + } + + @Override + public InputStream downloadPart(String key, long start, long end) throws Exception { + GetObjectArgs getObjectArgs = GetObjectArgs.builder() + .bucket(getBucket()) + .object(key) + // 起始字节的位置 + .offset(start) + // 要读取的长度 (可选,如果无值则代表读到文件结尾)。 + .length(end) + .build(); + return minioClient.getObject(getObjectArgs); + } + + @Override + public void delete(String targetName) { + try { + RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder() + .bucket(getBucket()) + .object(getKey(targetName, true)) + .build(); + minioClient.removeObject(removeObjectArgs); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public void copy(String sourceName, String targetName, Boolean isOverride) { + try { + CopyObjectArgs copyObjectArgs = CopyObjectArgs.builder() + .bucket(getBucket()) + .object(getKey(targetName, true)) + .source(CopySource.builder() + .bucket(getBucket()) + .object(getKey(sourceName, true)) + .build()) + .build(); + minioClient.copyObject(copyObjectArgs); + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public OssInfo getInfo(String targetName, Boolean isRecursion) { + try { + String key = getKey(targetName, false); + + OssInfo ossInfo = getBaseInfo(targetName); + if (isRecursion && isDirectory(key)) { + + String prefix = OssPathUtil.convertPath(key, true); + ListObjectsArgs listObjectsArgs = ListObjectsArgs.builder() + .bucket(getBucket()) + .delimiter(StrUtil.SLASH) + .prefix(prefix.endsWith(StrUtil.SLASH) ? prefix : prefix + StrUtil.SLASH) + .build(); + Iterable> results = minioClient.listObjects(listObjectsArgs); + + List fileOssInfos = new ArrayList<>(); + List directoryInfos = new ArrayList<>(); + + for (Result result : results) { + Item item = result.get(); + String childKey = OssPathUtil.replaceKey(item.objectName(), getBasePath(), true); + if (item.isDir()) { + directoryInfos.add(getInfo(childKey, true)); + } else { + fileOssInfos.add(getInfo(childKey, false)); + } + } + + if (ObjectUtil.isNotEmpty(fileOssInfos) && fileOssInfos.get(0) instanceof FileOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "fileInfos", fileOssInfos); + } + if (ObjectUtil.isNotEmpty(directoryInfos) && directoryInfos.get(0) instanceof DirectoryOssInfo) { + ReflectUtil.setFieldValue(ossInfo, "directoryInfos", directoryInfos); + } + } + return ossInfo; + } catch (Exception e) { + throw new OssException(e); + } + } + + @Override + public String getBasePath() { + return minioOssConfig.getBasePath(); + } + + @Override + public Map getClientObject() { + return new HashMap() { + { + put(MINIO_OBJECT_NAME, getMinioClient()); + } + }; + } + + private String getBucket() { + String bucketName = minioOssConfig.getBucketName(); + try { + if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } + } catch (Exception e) { + e.printStackTrace(); + } + return bucketName; + } + + public OssInfo getBaseInfo(String targetName) { + String key = getKey(targetName, true); + OssInfo ossInfo; + String bucketName = getBucket(); + if (isFile(key)) { + ossInfo = new FileOssInfo(); + try { + GetObjectArgs getObjectArgs = GetObjectArgs.builder().bucket(bucketName).object(key).build(); + GetObjectResponse objectResponse = minioClient.getObject(getObjectArgs); + Headers headers = objectResponse.headers(); + + ossInfo.setCreateTime(DateUtil.date(headers.getDate(HttpHeaders.DATE)).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLastUpdateTime(DateUtil.date(headers.getDate(HttpHeaders.LAST_MODIFIED)).toString(DatePattern.NORM_DATETIME_PATTERN)); + ossInfo.setLength(Convert.toStr(headers.get(HttpHeaders.CONTENT_LENGTH))); + } catch (Exception e) { + log.error("获取{}文件属性失败", key, e); + } + } else { + ossInfo = new DirectoryOssInfo(); + } + ossInfo.setName(StrUtil.equals(targetName, StrUtil.SLASH) ? targetName : FileNameUtil.getName(targetName)); + ossInfo.setPath(OssPathUtil.replaceKey(targetName, ossInfo.getName(), true)); + return ossInfo; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssConfiguration.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssConfiguration.java new file mode 100644 index 0000000..7f6d980 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/MinioOssConfiguration.java @@ -0,0 +1,84 @@ +package com.schisandra.oss.application.oss.core.minio; + +import com.schisandra.oss.application.convert.SchisandraOssMinioDTOConverter; +import com.schisandra.oss.application.dto.SchisandraOssMinioDTO; +import com.schisandra.oss.application.oss.core.StandardOssClient; +import com.schisandra.oss.application.oss.core.minio.model.MinioOssClientConfig; +import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig; +import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; +import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import org.apache.commons.lang3.ObjectUtils; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +/** + * @author landaiqing + * @version MinioConfiguration.java, v 1.1 2021/11/24 15:20 chenmin Exp $ + * Created on 2021/11/24 + */ +//@Configuration +@Slf4j +public class MinioOssConfiguration { + + @Resource + private SchisandraOssMinioDomainService schisandraOssMinioDomainService; + +// @Bean + public StandardOssClient minioOssClient() { + SchisandraOssMinioBO minioBO = schisandraOssMinioDomainService.getMinioConfig(1L); + SchisandraOssMinioDTO minio = SchisandraOssMinioDTOConverter.INSTANCE.convertBOToDTO(minioBO); + if (ObjectUtils.isEmpty(minio)) { + log.error("minio配置信息获取失败"); + } + MinioOssConfig minioOssConfig = new MinioOssConfig(); + minioOssConfig.setBasePath(minio.getBasePath()); + minioOssConfig.setBucketName(minio.getBucketName()); + minioOssConfig.setAccessKey(minio.getAccessKey()); + minioOssConfig.setSecretKey(minio.getSecretKey()); + minioOssConfig.setEndpoint(minio.getEndpoint()); + minioOssConfig.init(); + if (Boolean.parseBoolean(minio.getOpenAdvancedSetup())) { + MinioOssClientConfig minioOssClientConfig = new MinioOssClientConfig(); + minioOssClientConfig.setWriteTimeout(minio.getWriteTimeout()); + minioOssClientConfig.setConnectTimeout(minio.getConnectTimeout()); + minioOssClientConfig.setReadTimeout(minio.getReadTimeout()); + minioOssClientConfig.setFollowSslRedirects(Boolean.parseBoolean(minio.getFollowSslRedirects())); + minioOssClientConfig.setRetryOnConnectionFailure(Boolean.parseBoolean(minio.getRetryOnConnectionFailure())); + minioOssClientConfig.setPingInterval(minio.getPingInterval()); + minioOssClientConfig.setFollowRedirects(Boolean.parseBoolean(minio.getFollowRedirects())); + minioOssClientConfig.setCallTimeout(minio.getCallTimeout()); + minioOssConfig.setClientConfig(minioOssClientConfig); + } + return minioOssClient(minioOssConfig); + + + } + + public StandardOssClient minioOssClient(MinioOssConfig minioOssConfig) { + return new MinioOssClient(minioClient(minioOssConfig), minioOssConfig); + } + + public MinioClient minioClient(MinioOssConfig minioOssConfig) { + MinioOssClientConfig clientConfig = minioOssConfig.getClientConfig(); + OkHttpClient okHttpClient = new OkHttpClient.Builder() + .connectTimeout(clientConfig.getConnectTimeout(), TimeUnit.MILLISECONDS) + .writeTimeout(clientConfig.getWriteTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(clientConfig.getReadTimeout(), TimeUnit.MILLISECONDS) + .callTimeout(clientConfig.getCallTimeout(), TimeUnit.MILLISECONDS) + .followRedirects(clientConfig.isFollowRedirects()) + .followSslRedirects(clientConfig.isFollowSslRedirects()) + .retryOnConnectionFailure(clientConfig.isRetryOnConnectionFailure()) + .pingInterval(clientConfig.getPingInterval(), TimeUnit.MILLISECONDS) + .build(); + return MinioClient.builder() + .endpoint(minioOssConfig.getEndpoint()) + .credentials(minioOssConfig.getAccessKey(), minioOssConfig.getSecretKey()) + .httpClient(okHttpClient) + .build(); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/model/MinioOssClientConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/model/MinioOssClientConfig.java new file mode 100644 index 0000000..cc253b1 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/model/MinioOssClientConfig.java @@ -0,0 +1,47 @@ +package com.schisandra.oss.application.oss.core.minio.model; + +import com.schisandra.oss.application.oss.constant.OssConstant; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author landaiqing + * @version MinioOssClientConfig.java, v 1.0 2022/3/24 9:59 chenmin Exp $ + * Created on 2022/3/24 + */ +@Data +public class MinioOssClientConfig implements Serializable { + /** + * 连接超时时间(单位:毫秒) + */ + private Long connectTimeout = OssConstant.DEFAULT_CONNECTION_TIMEOUT; + /** + * 写超时时间(单位:毫秒) + */ + private Long writeTimeout = OssConstant.DEFAULT_CONNECTION_TIMEOUT; + /** + * 读超时时间(单位:毫秒) + */ + private Long readTimeout = OssConstant.DEFAULT_CONNECTION_TIMEOUT; + /** + * 调用超时时间(单位:毫秒) + */ + private Long callTimeout = (long) Integer.MAX_VALUE; + /** + * 是否支持重定向,默认支持 + */ + private boolean followRedirects = true; + /** + * 是否支持HTTP到HTTPS,HTTPS到HTTP的重定向,默认支持 + */ + private boolean followSslRedirects = true; + /** + * 是否开始连接失败重试,默认不支持 + */ + private boolean retryOnConnectionFailure = false; + /** + * 连接健康检测间隔时长(单位:毫秒) + */ + private int pingInterval; +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/model/MinioOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/model/MinioOssConfig.java new file mode 100644 index 0000000..1925022 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/core/minio/model/MinioOssConfig.java @@ -0,0 +1,35 @@ +package com.schisandra.oss.application.oss.core.minio.model; + + +import com.schisandra.oss.application.oss.model.SliceConfig; +import com.schisandra.oss.application.oss.utils.OssPathUtil; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author landaiqing + * @version MinioOssConfig.java, v 1.1 2022/2/20 8:58 chenmin Exp $ + * Created on 2022/2/20 + */ +@Data +public class MinioOssConfig implements Serializable { + + private String basePath; + private String endpoint; + private String accessKey; + private String secretKey; + private String bucketName; + + private MinioOssClientConfig clientConfig = new MinioOssClientConfig(); + + /** + * 断点续传参数 + */ + private SliceConfig sliceConfig = new SliceConfig(); + + public void init() { + this.sliceConfig.init(); + basePath = OssPathUtil.valid(basePath); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/enums/OssContentType.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/enums/OssContentType.java new file mode 100644 index 0000000..f6aa472 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/enums/OssContentType.java @@ -0,0 +1,52 @@ +package com.schisandra.oss.application.oss.enums; + +import cn.hutool.core.util.StrUtil; + +public enum OssContentType { + DEFAULT("default","application/octet-stream"), + JPG("jpg", "image/jpeg"), + TIFF("tiff", "image/tiff"), + GIF("gif", "image/gif"), + JFIF("jfif", "image/jpeg"), + PNG("png", "image/png"), + TIF("tif", "image/tiff"), + ICO("ico", "image/x-icon"), + JPEG("jpeg", "image/jpeg"), + WBMP("wbmp", "image/vnd.wap.wbmp"), + FAX("fax", "image/fax"), + NET("net", "image/pnetvue"), + JPE("jpe", "image/jpeg"), + RP("rp", "image/vnd.rn-realpix"), + MP4("mp4", "video/mp4"); + + private String prefix; + + private String type; + + public static String getContentType(String prefix){ + if(StrUtil.isEmpty(prefix)){ + return DEFAULT.getType(); + } + prefix = prefix.substring(prefix.lastIndexOf(".") + 1); + for (OssContentType value : OssContentType.values()) { + if(prefix.equalsIgnoreCase(value.getPrefix())){ + return value.getType(); + } + } + return DEFAULT.getType(); + } + + OssContentType(String prefix, String type) { + this.prefix = prefix; + this.type = type; + } + + public String getPrefix() { + return prefix; + } + + public String getType() { + return type; + } +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/enums/OssType.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/enums/OssType.java new file mode 100644 index 0000000..5db0803 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/enums/OssType.java @@ -0,0 +1,109 @@ +package com.schisandra.oss.application.oss.enums; + +import com.schisandra.oss.application.oss.constant.OssConstant; + +/** + * @author landaiqing + */ +public enum OssType { + + /** + * 本地磁盘存储 + */ + LOCAL(OssConstant.OssType.LOCAL), + + /** + * FTP协议存储 + */ + FTP(OssConstant.OssType.FTP), + + /** + * SFTP存储 + */ + SFTP(OssConstant.OssType.SFTP), + + /** + * 阿里OSS存储 + */ + ALI(OssConstant.OssType.ALI), + + /** + * 七牛云存储 + */ + QINIU(OssConstant.OssType.QINIU), + + /** + * MinIO存储 + */ + MINIO(OssConstant.OssType.MINIO), + + /** + * 百度云存储 + */ + BAIDU(OssConstant.OssType.BAIDU), + + /** + * 腾讯云存储 + */ + TENCENT(OssConstant.OssType.TENCENT), + + /** + * 华为云存储 + */ + HUAWEI(OssConstant.OssType.HUAWEI), + + /** + * 京东云存储 + */ + JD(OssConstant.OssType.JD), + + /** + * 又拍云存储 + */ + UP(OssConstant.OssType.UP), + + /** + * 金山云 + */ + JINSHAN(OssConstant.OssType.JINSHAN), + + /** + * 网易数帆 + */ + WANGYI(OssConstant.OssType.WANGYI), + + /** + * UCloud + */ + UCLOUD(OssConstant.OssType.UCLOUD), + + /** + * 平安云 + */ + PINGAN(OssConstant.OssType.PINGAN), + + /** + * 青云 + */ + QINGYUN(OssConstant.OssType.QINGYUN), + + /** + * JDBC + */ + JDBC(OssConstant.OssType.JDBC), + + /** + * 亚马逊 + */ + AWS(OssConstant.OssType.AWS); + + private final String value; + + OssType(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/DuplicateException.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/DuplicateException.java new file mode 100644 index 0000000..e745203 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/DuplicateException.java @@ -0,0 +1,28 @@ +package com.schisandra.oss.application.oss.exception; + +/** + * @author landaiqing + * @version DuplicateException.java, v 1.1 2021/11/15 15:27 chenmin Exp $ + * Created on 2021/11/15 + */ +public class DuplicateException extends OssException { + public DuplicateException() { + super(); + } + + public DuplicateException(String message) { + super(message); + } + + public DuplicateException(String message, Throwable cause) { + super(message, cause); + } + + public DuplicateException(Throwable cause) { + super(cause); + } + + protected DuplicateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/NotSupportException.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/NotSupportException.java new file mode 100644 index 0000000..14958ad --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/NotSupportException.java @@ -0,0 +1,28 @@ +package com.schisandra.oss.application.oss.exception; + +/** + * @author landaiqing + * @version NotSupportException.java, v 1.1 2021/12/3 15:04 chenmin Exp $ + * Created on 2021/12/3 + */ +public class NotSupportException extends OssException { + public NotSupportException() { + super(); + } + + public NotSupportException(String message) { + super(message); + } + + public NotSupportException(String message, Throwable cause) { + super(message, cause); + } + + public NotSupportException(Throwable cause) { + super(cause); + } + + protected NotSupportException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/OssException.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/OssException.java new file mode 100644 index 0000000..b01014d --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/exception/OssException.java @@ -0,0 +1,27 @@ +package com.schisandra.oss.application.oss.exception; + +/** + * @author landaiqing + * @version OssException.java, v 1.1 2021/12/3 21:02 chenmin Exp $ + * Created on 2021/12/3 + */ +public class OssException extends RuntimeException { + public OssException() { + } + + public OssException(String message) { + super(message); + } + + public OssException(String message, Throwable cause) { + super(message, cause); + } + + public OssException(Throwable cause) { + super(cause); + } + + public OssException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/DirectoryOssInfo.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/DirectoryOssInfo.java new file mode 100644 index 0000000..b4c3a86 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/DirectoryOssInfo.java @@ -0,0 +1,33 @@ +package com.schisandra.oss.application.oss.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; + +/** + * 文件夹信息对象 + * @author landaiqing + * @version DirectoryInfo.java, v 1.1 2021/11/15 10:21 chenmin Exp $ + * Created on 2021/11/15 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class DirectoryOssInfo extends OssInfo { + + /** + * 文件夹列表 + */ + private List fileInfos = new ArrayList<>(); + + /** + * 文件列表 + */ + private List directoryInfos = new ArrayList<>(); + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/FileOssInfo.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/FileOssInfo.java new file mode 100644 index 0000000..ed959e4 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/FileOssInfo.java @@ -0,0 +1,20 @@ +package com.schisandra.oss.application.oss.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import lombok.experimental.Accessors; + +/** + * 文件信息对象 + * @author landaiqing + * @version FileInfo.java, v 1.1 2021/11/15 10:19 chenmin Exp $ + * Created on 2021/11/15 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class FileOssInfo extends OssInfo { + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/OssInfo.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/OssInfo.java new file mode 100644 index 0000000..28396fd --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/OssInfo.java @@ -0,0 +1,34 @@ +package com.schisandra.oss.application.oss.model; + +import lombok.Data; + +/** + * @author landaiqing + * @version Info.java, v 1.1 2021/11/15 10:16 chenmin Exp $ + * Created on 2021/11/15 + */ +@Data +public class OssInfo { + + /** + * 名称 + */ + private String name; + /** + * 存储路径 + */ + private String path; + /** + * 对象大小 + */ + private String length; + /** + * 创建时间 + */ + private String createTime; + /** + * 最新修改时间 + */ + private String lastUpdateTime; + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/SliceConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/SliceConfig.java new file mode 100644 index 0000000..9c5c315 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/SliceConfig.java @@ -0,0 +1,41 @@ +package com.schisandra.oss.application.oss.model; + + +import com.schisandra.oss.application.oss.constant.OssConstant; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +/** + * 断点续传参数 + * @author landaiqing + * @version Slice.java, v 1.1 2022/2/10 17:09 chenmin Exp $ + * Created on 2022/2/10 + */ +@Slf4j +@Data +@AllArgsConstructor +@NoArgsConstructor +public class SliceConfig { + /** + * 分片大小,默认5MB + */ + private Long partSize = OssConstant.DEFAULT_PART_SIZE; + + /** + * 并发线程数,默认等于CPU的核数 + */ + private Integer taskNum = OssConstant.DEFAULT_TASK_NUM; + + public void init() { + if (this.getPartSize() <= 0) { + log.warn("断点续传——分片大小必须大于0"); + this.setPartSize(OssConstant.DEFAULT_PART_SIZE); + } + if (this.getTaskNum() <= 0) { + log.warn("断点续传——并发线程数必须大于0"); + this.setTaskNum(OssConstant.DEFAULT_TASK_NUM); + } + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadCheckPoint.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadCheckPoint.java new file mode 100644 index 0000000..97f3b77 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadCheckPoint.java @@ -0,0 +1,121 @@ +package com.schisandra.oss.application.oss.model.download; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IoUtil; +import lombok.Data; + +import java.io.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author landaiqing + * @version DownloadCheckPoint.java, v 1.1 2022/2/21 15:14 chenmin Exp $ + * Created on 2022/2/21 + */ +@Data +public class DownloadCheckPoint implements Serializable { + + private static final long serialVersionUID = 4682293344365787077L; + public static final String DOWNLOAD_MAGIC = "92611BED-89E2-46B6-89E5-72F273D4B0A3"; + + private String magic; + private int md5; + private String downloadFile; + private String bucketName; + private String key; + private String checkPointFile; + private DownloadObjectStat objectStat; + private List downloadParts = Collections.synchronizedList(new ArrayList<>()); + private long originPartSize; + + /** + * 从缓存文件中加载断点数据 + * @param checkPointFile 断点续传进度记录文件 + */ + public synchronized void load(String checkPointFile) throws IOException, ClassNotFoundException { + InputStream inputStream = FileUtil.getInputStream(checkPointFile); + ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); + DownloadCheckPoint dcp = (DownloadCheckPoint) objectInputStream.readObject(); + assign(dcp); + IoUtil.close(objectInputStream); + IoUtil.close(inputStream); + } + + /** + * 将断点信息写入到断点缓存文件 + */ + public synchronized void dump() throws IOException { + this.md5 = hashCode(); + FileOutputStream outputStream = new FileOutputStream(checkPointFile); + ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream); + objectOutputStream.writeObject(this); + IoUtil.close(objectOutputStream); + IoUtil.close(outputStream); + } + + /** + * 获取下载缓存文件名称 + * @return 缓存文件名 + */ + public String getTempDownloadFile() { + return downloadFile + ".tmp"; + } + + /** + * 更新分片状态 + * @param index 分片索引 + * @param completed 对应分片是否完成 + */ + public synchronized void update(int index, boolean completed) { + downloadParts.get(index).setCompleted(completed); + } + + /** + * 校验下载文件与断点信息是否一致 + * @param objectStat 文件状态 + * @return 校验是否通过 + */ + public synchronized boolean isValid(DownloadObjectStat objectStat) { + // 比较checkpoint的magic和md5 + if (this.magic == null || !this.magic.equals(DOWNLOAD_MAGIC) || this.md5 != hashCode()) { + return false; + } + + // 比较文件大小及最新修改时间 + if (this.objectStat.getSize() != objectStat.getSize() || !this.objectStat.getLastModified().equals(objectStat.getLastModified()) + || !this.objectStat.getDigest().equals(objectStat.getDigest())) { + return false; + } + + return true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((bucketName == null) ? 0 : bucketName.hashCode()); + result = prime * result + ((downloadFile == null) ? 0 : downloadFile.hashCode()); + result = prime * result + ((checkPointFile == null) ? 0 : checkPointFile.hashCode()); + result = prime * result + ((magic == null) ? 0 : magic.hashCode()); + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((objectStat == null) ? 0 : objectStat.hashCode()); + result = prime * result + ((downloadParts == null) ? 0 : downloadParts.hashCode()); + return result; + } + + private void assign(DownloadCheckPoint dcp) { + this.setMagic(dcp.getMagic()); + this.setMd5(dcp.getMd5()); + this.setDownloadFile(dcp.getDownloadFile()); + this.setCheckPointFile(dcp.getCheckPointFile()); + this.setBucketName(dcp.getBucketName()); + this.setKey(dcp.getKey()); + this.setObjectStat(dcp.getObjectStat()); + this.setDownloadParts(dcp.getDownloadParts()); + this.setOriginPartSize(dcp.getOriginPartSize()); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadObjectStat.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadObjectStat.java new file mode 100644 index 0000000..ba66e40 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadObjectStat.java @@ -0,0 +1,34 @@ +package com.schisandra.oss.application.oss.model.download; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author landaiqing + * @version ObjectStat.java, v 1.1 2022/2/21 15:15 chenmin Exp $ + * Created on 2022/2/21 + */ +@Data +@Accessors(chain = true) +public class DownloadObjectStat implements Serializable { + + private static final long serialVersionUID = -2883494783412999919L; + + private long size; + private Date lastModified; + private String digest; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((digest == null) ? 0 : digest.hashCode()); + result = prime * result + ((lastModified == null) ? 0 : lastModified.hashCode()); + result = prime * result + (int) (size ^ (size >>> 32)); + return result; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadPart.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadPart.java new file mode 100644 index 0000000..732d595 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadPart.java @@ -0,0 +1,38 @@ +package com.schisandra.oss.application.oss.model.download; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author landaiqing + * @version DownloadPart.java, v 1.1 2022/2/21 15:15 chenmin Exp $ + * Created on 2022/2/21 + */ +@Data +public class DownloadPart implements Serializable { + + private static final long serialVersionUID = -3655925846487976207L; + + private int index; + private long start; + private long end; + private boolean isCompleted; + private long length; + private long crc; + private long fileStart; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + index; + result = prime * result + (isCompleted ? 1231 : 1237); + result = prime * result + (int) (end ^ (end >>> 32)); + result = prime * result + (int) (start ^ (start >>> 32)); + result = prime * result + (int) (crc ^ (crc >>> 32)); + result = prime * result + (int) (fileStart ^ (fileStart >>> 32)); + return result; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadPartResult.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadPartResult.java new file mode 100644 index 0000000..3ba5a2d --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/download/DownloadPartResult.java @@ -0,0 +1,36 @@ +package com.schisandra.oss.application.oss.model.download; + +import lombok.Data; + +/** + * @author landaiqing + * @version PartResult.java, v 1.1 2022/2/21 15:17 chenmin Exp $ + * Created on 2022/2/21 + */ +@Data +public class DownloadPartResult { + + private int number; + private long start; + private long end; + private boolean failed = false; + private Exception exception; + private Long clientCrc; + private Long serverCrc; + private long length; + + public DownloadPartResult(int number, long start, long end) { + this.number = number; + this.start = start; + this.end = end; + } + + public DownloadPartResult(int number, long start, long end, long length, long clientCrc) { + this.number = number; + this.start = start; + this.end = end; + this.length = length; + this.clientCrc = clientCrc; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadCheckPoint.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadCheckPoint.java new file mode 100644 index 0000000..9deab44 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadCheckPoint.java @@ -0,0 +1,130 @@ +package com.schisandra.oss.application.oss.model.upload; + +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.json.JSONUtil; + +import com.schisandra.oss.application.oss.exception.OssException; +import lombok.Data; + +import java.io.File; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 断点对象 + * @author landaiqing + * @version UpLoadCheckPoint.java, v 1.1 2022/2/9 22:52 chenmin Exp $ + * Created on 2022/2/9 + */ +@Data +public class UpLoadCheckPoint implements Serializable { + + private static final long serialVersionUID = 5424904565837227164L; + + public static final String UPLOAD_MAGIC = "FE8BB4EA-B593-4FAC-AD7A-2459A36E2E62"; + + private String magic; + private int md5; + private String uploadFile; + private UpLoadFileStat uploadFileStat; + private String key; + private String bucket; + private String checkpointFile; + private String uploadId; + private List uploadParts = Collections.synchronizedList(new ArrayList<>()); + private List partEntityTags = Collections.synchronizedList(new ArrayList<>()); + private long originPartSize; + + /** + * 从缓存文件中加载断点数据 + * @param checkpointFile 断点缓存文件 + */ + public synchronized void load(String checkpointFile) { + try { + // TODO 缓存数据进行压缩 + UpLoadCheckPoint ucp = JSONUtil.readJSONObject(new File(checkpointFile), CharsetUtil.CHARSET_UTF_8).toBean(this.getClass()); + assign(ucp); + } catch (Exception e) { + throw new OssException(e); + } + } + + /** + * 将断点信息写入到断点缓存文件 + */ + public synchronized void dump() { + this.setMd5(hashCode()); + try { + FileUtil.writeUtf8String(JSONUtil.toJsonStr(this), checkpointFile); + } catch (Exception e) { + throw new OssException(e); + } + } + + /** + * 更新分块状态 + * @param partIndex 分片索引 + * @param partEntityTag 分片Tag + * @param completed 分片是否完成 + */ + public synchronized void update(int partIndex, UpLoadPartEntityTag partEntityTag, boolean completed) { + this.getPartEntityTags().add(partEntityTag); + this.getUploadParts().get(partIndex).setCompleted(completed); + } + + /** + * 检查断点缓存文件是否与断点一致 + * @return 校验是否通过 + */ + public synchronized boolean isValid() { + // 比较checkpoint的magic和md5 + if (this.getMagic() == null || !this.getMagic().equals(UPLOAD_MAGIC) || this.getMd5() != hashCode()) { + return false; + } + // 检查断点缓存文件是否存在 + if (!FileUtil.exist(checkpointFile)) { + return false; + } + + File file = new File(uploadFile); + // 文件名,大小和上次修改时间必须与当前断点相同。 + // 如果有任何改变,则重新上传 + return this.getUploadFileStat().getSize() == file.length() + && this.getUploadFileStat().getLastModified() == file.lastModified(); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((bucket == null) ? 0 : bucket.hashCode()); + result = prime * result + ((checkpointFile == null) ? 0 : checkpointFile.hashCode()); + result = prime * result + ((magic == null) ? 0 : magic.hashCode()); + result = prime * result + ((partEntityTags == null) ? 0 : partEntityTags.hashCode()); + result = prime * result + ((uploadFile == null) ? 0 : uploadFile.hashCode()); + result = prime * result + ((uploadFileStat == null) ? 0 : uploadFileStat.hashCode()); + result = prime * result + ((uploadId == null) ? 0 : uploadId.hashCode()); + result = prime * result + ((uploadParts == null) ? 0 : uploadParts.hashCode()); + result = prime * result + (int) originPartSize; + return result; + } + + public void assign(UpLoadCheckPoint ucp) { + this.setMagic(ucp.magic); + this.setMd5(ucp.md5); + this.setUploadFile(ucp.uploadFile); + this.setUploadFileStat(ucp.uploadFileStat); + this.setKey(ucp.key); + this.setBucket(ucp.bucket); + this.setCheckpointFile(ucp.checkpointFile); + this.setUploadId(ucp.uploadId); + this.setUploadParts(ucp.uploadParts); + this.setPartEntityTags(ucp.partEntityTags); + this.setOriginPartSize(ucp.originPartSize); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadFileStat.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadFileStat.java new file mode 100644 index 0000000..3d0439b --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadFileStat.java @@ -0,0 +1,50 @@ +package com.schisandra.oss.application.oss.model.upload; + +import lombok.Data; + +import java.io.File; +import java.io.Serializable; + +/** + * 文件状态 + * @author landaiqing + * @version FileStat.java, v 1.1 2022/2/9 22:54 chenmin Exp $ + * Created on 2022/2/9 + */ +@Data +public class UpLoadFileStat implements Serializable { + + private static final long serialVersionUID = -1223810339796425415L; + + /** + * 文件大小 + */ + private long size; + /** + * 文件最新修改时间 + */ + private long lastModified; + /** + * 文件内容签名 + */ + private String digest; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((digest == null) ? 0 : digest.hashCode()); + result = prime * result + (int) (lastModified ^ (lastModified >>> 32)); + result = prime * result + (int) (size ^ (size >>> 32)); + return result; + } + + public static UpLoadFileStat getFileStat(String uploadFile) { + UpLoadFileStat fileStat = new UpLoadFileStat(); + File file = new File(uploadFile); + fileStat.setSize(file.length()); + fileStat.setLastModified(file.lastModified()); + return fileStat; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadPartEntityTag.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadPartEntityTag.java new file mode 100644 index 0000000..003dd6d --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadPartEntityTag.java @@ -0,0 +1,72 @@ +package com.schisandra.oss.application.oss.model.upload; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 分块标签 + * @author landaiqing + * @version PartETag.java, v 1.1 2022/2/10 23:38 chenmin Exp $ + * Created on 2022/2/10 + */ +@Data +@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor +public class UpLoadPartEntityTag implements Serializable { + + private static final long serialVersionUID = 2471854027355307627L; + + /** + * 分块号 + */ + private int partNumber; + + /** + * 标签 + */ + private String eTag; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((this.eTag == null) ? 0 : this.eTag.hashCode()); + result = prime * result + this.partNumber; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (this.getClass() != obj.getClass()) { + return false; + } + UpLoadPartEntityTag other = (UpLoadPartEntityTag) obj; + if (this.eTag == null) { + if (other.eTag != null) { + return false; + } + } else if (!this.eTag.equals(other.eTag)) { + return false; + } + if (this.partNumber != other.partNumber) { + return false; + } + return true; + } + + @Override + public String toString() { + return "PartETag [partNumber=" + this.partNumber + ", eTag=" + this.eTag + "]"; + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadPartResult.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadPartResult.java new file mode 100644 index 0000000..3be087b --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UpLoadPartResult.java @@ -0,0 +1,56 @@ +package com.schisandra.oss.application.oss.model.upload; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 分块结果集 + * @author landaiqing + * @version PartResult.java, v 1.1 2022/2/10 10:01 chenmin Exp $ + * Created on 2022/2/10 + */ +@Accessors(chain = true) +@Data +public class UpLoadPartResult { + + /** + * 分块号 + */ + private int number; + /** + * 分块在文件中的偏移量 + */ + private long offset; + /** + * 分块大小 + */ + private long length; + /** + * 分块失败标识 + */ + private boolean failed = false; + /** + * 分块上传失败异常 + */ + private Exception exception; + /** + * 分块crc + */ + private Long partCrc; + + private UpLoadPartEntityTag entityTag; + + public UpLoadPartResult(int number, long offset, long length) { + this.number = number; + this.offset = offset; + this.length = length; + } + + public UpLoadPartResult(int number, long offset, long length, long partCrc) { + this.number = number; + this.offset = offset; + this.length = length; + this.partCrc = partCrc; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UploadPart.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UploadPart.java new file mode 100644 index 0000000..dda342e --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/model/upload/UploadPart.java @@ -0,0 +1,51 @@ +package com.schisandra.oss.application.oss.model.upload; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 分块 + * @author landaiqing + * @version UploadPart.java, v 1.1 2022/2/9 23:01 chenmin Exp $ + * Created on 2022/2/9 + */ +@Data +public class UploadPart implements Serializable { + + private static final long serialVersionUID = 6692863980224332199L; + + /** + * 分块号(顺序) + */ + private int number; + /** + * 分块在文件中的偏移量 + */ + private long offset; + /** + * 分块大小 + */ + private long size; + /** + * 分块成功标识 + */ + private boolean isCompleted = false; + /** + * 分块crc + */ + private long crc; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (isCompleted ? 1231 : 1237); + result = prime * result + number; + result = prime * result + (int) (offset ^ (offset >>> 32)); + result = prime * result + (int) (size ^ (size >>> 32)); + result = prime * result + (int) (crc ^ (crc >>> 32)); + return result; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/utils/MinIOUtils.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/utils/MinIOUtils.java new file mode 100644 index 0000000..f6084ec --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/utils/MinIOUtils.java @@ -0,0 +1,439 @@ +package com.schisandra.oss.application.oss.utils; + + +import io.minio.*; +import io.minio.http.Method; +import io.minio.messages.Bucket; +import io.minio.messages.DeleteObject; +import io.minio.messages.Item; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +/** + * @Classname MinIOUtils + * @BelongsProject: schisandra-cloud-storage + * @BelongsPackage: com.schisandra.oss.application.oss.utils + * @Author: landaiqing + * @CreateTime: 2024-05-12 23:50 + * @Description: MinIO工具类 + * @Version: 1.0 + */ +@Slf4j +public class MinIOUtils { + + private static MinioClient minioClient; + + private static String endpoint; + private static String bucketName; + private static String accessKey; + private static String secretKey; + private static Double imgSize; + private static Double fileSize; + + + private static final String SEPARATOR = "/"; + + public MinIOUtils() { + } + + public MinIOUtils(String endpoint, String bucketName, String accessKey, String secretKey, Double imgSize, Double fileSize) { + MinIOUtils.endpoint = endpoint; + MinIOUtils.bucketName = bucketName; + MinIOUtils.accessKey = accessKey; + MinIOUtils.secretKey = secretKey; + MinIOUtils.imgSize = imgSize; + MinIOUtils.fileSize = fileSize; + createMinioClient(); + } + + /** + * 创建基于Java端的MinioClient + */ + public void createMinioClient() { + try { + if (null == minioClient) { + log.info("开始创建 MinioClient..."); + minioClient = MinioClient + .builder() + .endpoint(endpoint) + .credentials(accessKey, secretKey) + .build(); + createBucket(bucketName); + log.info("创建完毕 MinioClient..."); + } + } catch (Exception e) { + log.error("MinIO服务器异常:{}", e); + } + } + + /** + * 获取上传文件前缀路径 + * @return + */ + public static String getBasisUrl() { + return endpoint + SEPARATOR + bucketName + SEPARATOR; + } + + /****************************** Operate Bucket Start ******************************/ + + /** + * 启动SpringBoot容器的时候初始化Bucket + * 如果没有Bucket则创建 + * @throws Exception + */ + private static void createBucket(String bucketName) throws Exception { + if (!bucketExists(bucketName)) { + minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); + } + } + + /** + * 判断Bucket是否存在,true:存在,false:不存在 + * @return + * @throws Exception + */ + public static boolean bucketExists(String bucketName) throws Exception { + return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + } + + + /** + * 获得Bucket的策略 + * @param bucketName + * @return + * @throws Exception + */ + public static String getBucketPolicy(String bucketName) throws Exception { + String bucketPolicy = minioClient + .getBucketPolicy( + GetBucketPolicyArgs + .builder() + .bucket(bucketName) + .build() + ); + return bucketPolicy; + } + + + /** + * 获得所有Bucket列表 + * @return + * @throws Exception + */ + public static List getAllBuckets() throws Exception { + return minioClient.listBuckets(); + } + + /** + * 根据bucketName获取其相关信息 + * @param bucketName + * @return + * @throws Exception + */ + public static Optional getBucket(String bucketName) throws Exception { + return getAllBuckets().stream().filter(b -> b.name().equals(bucketName)).findFirst(); + } + + /** + * 根据bucketName删除Bucket,true:删除成功; false:删除失败,文件或已不存在 + * @param bucketName + * @throws Exception + */ + public static void removeBucket(String bucketName) throws Exception { + minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build()); + } + + /****************************** Operate Bucket End ******************************/ + + + /****************************** Operate Files Start ******************************/ + + /** + * 判断文件是否存在 + * @param bucketName 存储桶 + * @param objectName 文件名 + * @return + */ + public static boolean isObjectExist(String bucketName, String objectName) { + boolean exist = true; + try { + minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } catch (Exception e) { + exist = false; + } + return exist; + } + + /** + * 判断文件夹是否存在 + * @param bucketName 存储桶 + * @param objectName 文件夹名称 + * @return + */ + public static boolean isFolderExist(String bucketName, String objectName) { + boolean exist = false; + try { + Iterable> results = minioClient.listObjects( + ListObjectsArgs.builder().bucket(bucketName).prefix(objectName).recursive(false).build()); + for (Result result : results) { + Item item = result.get(); + if (item.isDir() && objectName.equals(item.objectName())) { + exist = true; + } + } + } catch (Exception e) { + exist = false; + } + return exist; + } + + /** + * 根据文件前缀查询文件 + * @param bucketName 存储桶 + * @param prefix 前缀 + * @param recursive 是否使用递归查询 + * @return MinioItem 列表 + * @throws Exception + */ + public static List getAllObjectsByPrefix(String bucketName, + String prefix, + boolean recursive) throws Exception { + List list = new ArrayList<>(); + Iterable> objectsIterator = minioClient.listObjects( + ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).recursive(recursive).build()); + if (objectsIterator != null) { + for (Result o : objectsIterator) { + Item item = o.get(); + list.add(item); + } + } + return list; + } + + /** + * 获取文件流 + * @param bucketName 存储桶 + * @param objectName 文件名 + * @return 二进制流 + */ + public static InputStream getObject(String bucketName, String objectName) throws Exception { + return minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build()); + } + + /** + * 断点下载 + * @param bucketName 存储桶 + * @param objectName 文件名称 + * @param offset 起始字节的位置 + * @param length 要读取的长度 + * @return 二进制流 + */ + public InputStream getObject(String bucketName, String objectName, long offset, long length)throws Exception { + return minioClient.getObject( + GetObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .offset(offset) + .length(length) + .build()); + } + + /** + * 获取路径下文件列表 + * @param bucketName 存储桶 + * @param prefix 文件名称 + * @param recursive 是否递归查找,false:模拟文件夹结构查找 + * @return 二进制流 + */ + public static Iterable> listObjects(String bucketName, String prefix, + boolean recursive) { + return minioClient.listObjects( + ListObjectsArgs.builder() + .bucket(bucketName) + .prefix(prefix) + .recursive(recursive) + .build()); + } + + /** + * 使用MultipartFile进行文件上传 + * @param bucketName 存储桶 + * @param file 文件名 + * @param objectName 对象名 + * @param contentType 类型 + * @return + * @throws Exception + */ + public static ObjectWriteResponse uploadFile(String bucketName, MultipartFile file, + String objectName, String contentType) throws Exception { + InputStream inputStream = file.getInputStream(); + return minioClient.putObject( + PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .contentType(contentType) + .stream(inputStream, inputStream.available(), -1) + .build()); + } + + /** + * 上传本地文件 + * @param bucketName 存储桶 + * @param objectName 对象名称 + * @param fileName 本地文件路径 + */ + public static ObjectWriteResponse uploadFile(String bucketName, String objectName, + String fileName) throws Exception { + return minioClient.uploadObject( + UploadObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .filename(fileName) + .build()); + } + + /** + * 通过流上传文件 + * + * @param bucketName 存储桶 + * @param objectName 文件对象 + * @param inputStream 文件流 + */ + public static ObjectWriteResponse uploadFile(String bucketName, String objectName, InputStream inputStream) throws Exception { + return minioClient.putObject( + PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(inputStream, inputStream.available(), -1) + .build()); + } + + /** + * 创建文件夹或目录 + * @param bucketName 存储桶 + * @param objectName 目录路径 + */ + public static ObjectWriteResponse createDir(String bucketName, String objectName) throws Exception { + return minioClient.putObject( + PutObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .stream(new ByteArrayInputStream(new byte[]{}), 0, -1) + .build()); + } + + /** + * 获取文件信息, 如果抛出异常则说明文件不存在 + * + * @param bucketName 存储桶 + * @param objectName 文件名称 + */ + public static String getFileStatusInfo(String bucketName, String objectName) throws Exception { + return minioClient.statObject( + StatObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .build()).toString(); + } + + /** + * 拷贝文件 + * + * @param bucketName 存储桶 + * @param objectName 文件名 + * @param srcBucketName 目标存储桶 + * @param srcObjectName 目标文件名 + */ + public static ObjectWriteResponse copyFile(String bucketName, String objectName, + String srcBucketName, String srcObjectName) throws Exception { + return minioClient.copyObject( + CopyObjectArgs.builder() + .source(CopySource.builder().bucket(bucketName).object(objectName).build()) + .bucket(srcBucketName) + .object(srcObjectName) + .build()); + } + + /** + * 删除文件 + * @param bucketName 存储桶 + * @param objectName 文件名称 + */ + public static void removeFile(String bucketName, String objectName) throws Exception { + minioClient.removeObject( + RemoveObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .build()); + } + + /** + * 批量删除文件 + * @param bucketName 存储桶 + * @param keys 需要删除的文件列表 + * @return + */ + public static void removeFiles(String bucketName, List keys) { + List objects = new LinkedList<>(); + keys.forEach(s -> { + objects.add(new DeleteObject(s)); + try { + removeFile(bucketName, s); + } catch (Exception e) { + log.error("批量删除失败!error:{}",e); + } + }); + } + + /** + * 获取文件外链 + * @param bucketName 存储桶 + * @param objectName 文件名 + * @param expires 过期时间 <=7 秒 (外链有效时间(单位:秒)) + * @return url + * @throws Exception + */ + public static String getPresignedObjectUrl(String bucketName, String objectName, Integer expires) throws Exception { + GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().expiry(expires).bucket(bucketName).object(objectName).build(); + return minioClient.getPresignedObjectUrl(args); + } + + /** + * 获得文件外链 + * @param bucketName + * @param objectName + * @return url + * @throws Exception + */ + public static String getPresignedObjectUrl(String bucketName, String objectName) throws Exception { + GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder() + .bucket(bucketName) + .object(objectName) + .method(Method.GET).build(); + return minioClient.getPresignedObjectUrl(args); + } + + /** + * 将URLDecoder编码转成UTF8 + * @param str + * @return + * @throws UnsupportedEncodingException + */ + public static String getUtf8ByURLDecoder(String str) throws UnsupportedEncodingException { + String url = str.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); + return URLDecoder.decode(url, "UTF-8"); + } + + /****************************** Operate Files End ******************************/ + +} + + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/utils/OssPathUtil.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/utils/OssPathUtil.java new file mode 100644 index 0000000..250bb43 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-application/schisandra-cloud-storage-oss-application-controller/src/main/java/com/schisandra/oss/application/oss/utils/OssPathUtil.java @@ -0,0 +1,68 @@ +package com.schisandra.oss.application.oss.utils; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @author landaiqing + * @version PathUtil.java, v 1.1 2022/2/18 17:01 chenmin Exp $ + * Created on 2022/2/18 + */ +@Slf4j +public class OssPathUtil { + + public static String valid(String basePath) { + // 根路径未配置时,默认路径为 / + if (ObjectUtil.isEmpty(basePath)) { + basePath = StrUtil.SLASH; + } + // 将路径分隔符统一转为 / + basePath = basePath.replaceAll("\\\\", StrUtil.SLASH).replaceAll("//", StrUtil.SLASH); + + // 将配置默认转为绝对路径 + if (!basePath.startsWith(StrUtil.SLASH)) { + basePath = StrUtil.SLASH + basePath; + } + if (!basePath.endsWith(StrUtil.SLASH)) { + basePath = basePath + StrUtil.SLASH; + } + return basePath; + } + + /** + * 路径转换 + * 将路径分隔符转为统一的 / 分隔 + * @param key 路径 + * @param isAbsolute 是否绝对路径 + * true:绝对路径;false:相对路径 + * @return 以 / 为分隔的路径 + */ + public static String convertPath(String key, Boolean isAbsolute) { + key = key.replaceAll("\\\\", StrUtil.SLASH).replaceAll("//", StrUtil.SLASH); + if (isAbsolute && !key.startsWith(StrUtil.SLASH)) { + key = StrUtil.SLASH + key; + } else if (!isAbsolute && key.startsWith(StrUtil.SLASH)) { + key = key.replaceFirst(StrUtil.SLASH, ""); + } + return key; + } + + /** + * 获取相对根路径的绝对路径 + * @param path 全路径 + * @param basePath 根路径 + * @param isAbsolute 是否绝对路径 + * true:绝对路径;false:相对路径 + * @return 完整路径 + */ + public static String replaceKey(String path, String basePath, Boolean isAbsolute) { + String newPath; + if (StrUtil.SLASH.equals(basePath)) { + newPath = convertPath(path, isAbsolute); + } else { + newPath = convertPath(path, isAbsolute).replaceAll(convertPath(basePath, isAbsolute), ""); + } + return convertPath(newPath, isAbsolute); + } +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml index 76146cf..95b4374 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/pom.xml @@ -100,7 +100,30 @@ caffeine 3.1.8 + + cn.hutool + hutool-all + 5.1.1 + compile + + + io.minio + minio + 8.2.1 + + + + net.coobird + thumbnailator + 0.4.8 + + + + com.aliyun.oss + aliyun-sdk-oss + 3.14.0 + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/src/main/java/com/schisandra/oss/common/utils/ImageUtil.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/src/main/java/com/schisandra/oss/common/utils/ImageUtil.java new file mode 100644 index 0000000..b1a9563 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-common/src/main/java/com/schisandra/oss/common/utils/ImageUtil.java @@ -0,0 +1,194 @@ +package com.schisandra.oss.common.utils; + +import net.coobird.thumbnailator.Thumbnails; +import net.coobird.thumbnailator.geometry.Positions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.font.TextAttribute; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.text.AttributedCharacterIterator; +import java.text.AttributedString; + +/** + * 图像工具类 + */ +public class ImageUtil { + private static final Logger log = LoggerFactory.getLogger(ImageUtil.class); + //压缩率 + private static final transient float IMAGE_RATIO = 0.1f; + //压缩最大宽度 + private static final transient int IMAGE_WIDTH = 800; + // 水印透明度 + private static float alpha = 0.3f; + // 水印文字字体 + private static Font font = new Font("PingFang SC Regular", Font.PLAIN, 36); + // 水印文字颜色 + private static Color color = new Color(111, 111, 111); + //水印文字内容 + private static final String text = "这是一个水印文本"; + // 水印之间的间隔 + private static final int XMOVE = 80; + // 水印之间的间隔 + private static final int YMOVE = 80; + + /** + * 压缩图像 + * + * @param image + * @return + * @throws IOException + */ + public static BufferedImage compress(BufferedImage image) throws IOException { + Thumbnails.Builder imageBuilder = Thumbnails.of(image).outputQuality(IMAGE_RATIO); + if (image.getWidth() > IMAGE_WIDTH) { + return imageBuilder.width(IMAGE_WIDTH).asBufferedImage(); + } else { + return imageBuilder.scale(1).asBufferedImage(); + } + } + + /** + * 图像添加水印 + * + * @param + * @return + */ + public static BufferedImage setWatermark(BufferedImage image) throws IOException { + return Thumbnails.of(image) + .outputQuality(IMAGE_RATIO) + .scale(1) + .watermark(Positions.BOTTOM_RIGHT + , createWatermark(text + , image.getWidth() + , image.getHeight() + ) + , alpha) + .asBufferedImage(); + } + + /** + * 根据文件扩展名判断文件是否图片格式 + * + * @return + */ + public static boolean isImage(String fileName) { + String[] imageExtension = new String[]{"jpeg", "jpg", "gif", "bmp", "png"}; + + for (String e : imageExtension) if (getFileExtention(fileName).toLowerCase().equals(e)) return true; + + return false; + } + + /** + * 获取文件后缀名称 + * + * @param fileName + * @return + */ + public static String getFileExtention(String fileName) { + String extension = fileName.substring(fileName.lastIndexOf(".") + 1); + return extension; + } + + /** + * 根据图片对象获取对应InputStream + * + * @param image + * @param readImageFormat + * @return + * @throws IOException + */ + public static InputStream getInputStream(BufferedImage image, String readImageFormat) throws IOException { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + ImageIO.write(image, readImageFormat, os); + InputStream is = new ByteArrayInputStream(os.toByteArray()); + os.close(); + return is; + } + + /** + * 创建水印图片 + * + * @param text 水印文字 + * @param width 图片宽 + * @param height 图片高 + * @return + */ + public static BufferedImage createWatermark(String text, int width, int height) { + BufferedImage image = new BufferedImage(width + , height, BufferedImage.TYPE_INT_RGB); + // 2.获取图片画笔 + Graphics2D g = image.createGraphics(); + // ---------- 增加下面的代码使得背景透明 ----------------- + image = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT); + g.dispose(); + g = image.createGraphics(); + // ---------- 背景透明代码结束 ----------------- + // 6、处理文字 + AttributedString ats = new AttributedString(text); + ats.addAttribute(TextAttribute.FONT, font, 0, text.length()); + AttributedCharacterIterator iter = ats.getIterator(); + // 7、设置对线段的锯齿状边缘处理 + g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + // 8、设置水印旋转 + g.rotate(Math.toRadians(-30)); + // 9、设置水印文字颜色 + g.setColor(color); + // 10、设置水印文字Font + g.setFont(font); + // 11、设置水印文字透明度 + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha)); + g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); + /** + * 水印铺满图片 + * 计算水印位置 + */ + int x = -width / 2; + int y = -height / 2; + int[] arr = getWidthAndHeight(text, font); + int markWidth = arr[0];// 字体长度 + int markHeight = arr[1];// 字体高度 + // 循环添加水印 + while (x < width * 1.5) { + y = -height / 2; + while (y < height * 1.5) { + g.drawString(text, x, y); + + y += markHeight + YMOVE; + } + x += markWidth + XMOVE; + } + // 13、释放资源 + g.dispose(); + return image; + } + + /** + * 计算字体宽度及高度 + * + * @param text + * @param font + * @return + */ + private static int[] getWidthAndHeight(String text, Font font) { + Rectangle2D r = font.getStringBounds(text, new FontRenderContext( + AffineTransform.getScaleInstance(1, 1), false, false)); + int unitHeight = (int) Math.floor(r.getHeight());// + // 获取整个str用了font样式的宽度这里用四舍五入后+1保证宽度绝对能容纳这个字符串作为图片的宽度 + int width = (int) Math.round(r.getWidth()) + 1; + // 把单个字符的高度+3保证高度绝对能容纳字符串作为图片的高度 + int height = unitHeight + 3; + return new int[]{width, height}; + } +} \ No newline at end of file diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssAliBO.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssAliBO.java new file mode 100644 index 0000000..12bd3a7 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssAliBO.java @@ -0,0 +1,270 @@ +package com.schisandra.oss.domain.bo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * bo + * + * @author landaiqing + * @since 2024-05-14 20:10:20 + */ +@Data +public class SchisandraOssAliBO implements Serializable { + + /** + * + */ + private Long id; + + /** + * + */ + private Long userId; + + /** + * OSS地址 + */ + private String endpoint; + + /** + * AccessKey ID + */ + private String accessKeyId; + + /** + * AccessKey Secret + */ + private String accessKeySecret; + + /** + * security Token + */ + private String securityToken; + + /** + * Bucket名称 + */ + private String bucketName; + + /** + * 数据存储路径 + */ + private String basePath; + + /** + * 用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。 + */ + private String userAgent; + + /** + * 请求失败后最大的重试次数。默认3次。 + */ + private String maxErrorRetry; + + /** + * 从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。 + */ + private Integer connectionRequestTimeout; + + /** + * 建立连接的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private Integer connectionTimeout; + + /** + * Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + private Integer socketTimeout; + + /** + * 允许打开的最大HTTP连接数。默认为1024 + */ + private Integer maxConnections; + + /** + * 连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。 + */ + private Long connectionTTL; + + /** + * 是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启 + */ + private String useReaper; + + /** + * 连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。 + */ + private Long idleConnectionTime; + + /** + * 连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。 + */ + private String protocol; + + /** + * 代理服务器主机地址。 + */ + private String proxyHost; + + /** + * 代理服务器端口。 + */ + private String proxyPort; + + /** + * 代理服务器验证的用户名。 + */ + private String proxyUsername; + + /** + * 代理服务器验证的密码。 + */ + private String proxyPassword; + + /** + * 代理服务器的域,该域可以执行NTLM认证 + */ + private String proxyDomain; + + /** + * 代理主机的NTLM身份验证服务器 + */ + private String proxyWorkstation; + + /** + * 是否支持CNAME作为Endpoint,默认支持CNAME。 + */ + private String supportCname; + + /** + * 设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。 + */ + private String cnameExcludeList; + + /** + * 是否开启二级域名(Second Level Domain)的访问方式,默认不开启。 + */ + private String sldEnabled; + + /** + * 请求超时时间,单位:毫秒。默认情况下是5分钟。 + */ + private Integer requestTimeout; + + /** + * 是否启用请求超时校验。默认情况下,它是禁用的。 + */ + private String requestTimeoutEnabled; + + /** + * 设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。 + */ + private Long slowRequestsThreshold; + + /** + * 设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。 + */ + private String defaultHeaders; + + /** + * 是否在上传和下载时启用CRC校验,默认启用 + */ + private String crcCheckEnabled; + + /** + * 所有请求设置签名版本 + */ + private String signatureVersion; + + /** + * 设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。 + */ + private Long tickOffset; + + /** + * 是否开启HTTP重定向。 +说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。 + */ + private String redirectEnable; + + /** + * 是否开启SSL证书校验。 + * 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。 + */ + private String verifySSLEnable; + + /** + * 是否开启日志记录连接池统计信息 + */ + private String logConnectionPoolStats; + + /** + * 是否使用系统属性值 + */ + private String useSystemPropertyValues; + + /** + * 分片大小,默认5MB + */ + private Integer partSize; + + /** + * 并发线程数,默认等于CPU的核数 + */ + private Integer taskNum; + + /** + * 状态 + */ + private String status; + + /** + * 是否开启高级设置 + */ + private String openAdvancedSetup; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 是否删除 0 未删除 1已删除 + */ + private Integer isDeleted; + + /** + * 额外字段 + */ + private String extraJson; + + /** + * 当桶不存在,是否创建 + */ + private String createBucket; + + /** + * 启动检测桶,是否存在 + */ + private String checkBucket; + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssConfigBO.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssConfigBO.java deleted file mode 100644 index 9e998af..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssConfigBO.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.schisandra.oss.domain.bo; - -import lombok.Data; - -import java.io.Serializable; -import java.util.Date; - -/** - * bo - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Data -public class SchisandraOssConfigBO implements Serializable { - - /** - * - */ - private Long id; - - /** - * - */ - private String ossType; - - /** - * - */ - private String endpoint; - - /** - * - */ - private String accessKey; - - /** - * - */ - private String secretKey; - - /** - * - */ - private String bucketName; - - /** - * - */ - private String basePath; - - /** - * - */ - private String region; - - /** - * - */ - private Integer taskNum; - - /** - * - */ - private String partSize; - - /** - * - */ - private Double imgSize; - - /** - * - */ - private Double fileSize; - - /** - * - */ - private Integer connectTimeout; - - /** - * - */ - private Integer writeTimeout; - - /** - * - */ - private Integer readTimeout; - - /** - * - */ - private String zone; - - /** - * - */ - private String publicKey; - - /** - * - */ - private String privateKey; - - /** - * - */ - private String customHost; - - /** - * - */ - private String host; - - /** - * - */ - private String port; - - /** - * - */ - private String user; - - /** - * - */ - private String password; - - /** - * - */ - private String charset; - - /** - * - */ - private String extraJson; - - /** - * 创建时间 - */ - private Date createDate; - - /** - * 更新者 - */ - private String updateBy; - - /** - * 更新时间 - */ - private Date updateDate; - - /** - * 是否删除 0未删除 1已删除 - */ - private Integer isDeleted; - -} - diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssMinioBO.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssMinioBO.java new file mode 100644 index 0000000..6b8e48a --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/bo/SchisandraOssMinioBO.java @@ -0,0 +1,183 @@ +package com.schisandra.oss.domain.bo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * bo + * + * @author landaiqing + * @since 2024-05-14 19:32:24 + */ +@Data +public class SchisandraOssMinioBO implements Serializable { + + /** + * + */ + private Long id; + + /** + * + */ + private Long userId; + + /** + * + */ + private String endpoint; + + /** + * + */ + private String accessKey; + + /** + * + */ + private String secretKey; + + /** + * + */ + private String bucketName; + + /** + * + */ + private Integer port; + + /** + * + */ + private String basePath; + + /** + * + */ + private String fileHost; + + /** + * + */ + private String downloadHost; + + /** + * + */ + private String uploadHost; + + /** + * 当桶不存在,是否创建 + */ + private String createBucket; + + /** + * 启动检测桶,是否存在 + */ + private String checkBucket; + + /** + * 连接超时时间(单位:毫秒) + */ + private Long connectTimeout; + + /** + * 写超时时间(单位:毫秒) + */ + private Long writeTimeout; + + /** + * 读超时时间(单位:毫秒) + */ + private Long readTimeout; + + /** + * 调用超时时间(单位:毫秒) + */ + private Long callTimeout; + + /** + * 是否支持重定向,默认支持 + */ + private String followRedirects; + + /** + * 是否支持HTTP到HTTPS,HTTPS到HTTP的重定向,默认支持 + */ + private String followSslRedirects; + + /** + * 是否开始连接失败重试,默认不支持 + */ + private String retryOnConnectionFailure; + + /** + * 连接健康检测间隔时长(单位:毫秒) + */ + private Integer pingInterval; + + /** + * 分片大小,默认5MB + */ + private Long partSize; + + /** + * 并发线程数,默认等于CPU的核数 + */ + private Integer taskNum; + + /** + * 图片大小限制,单位:m + */ + private Integer imgSize; + + /** + * 文件大小限制,单位:m + */ + private Integer fileSize; + + /** + * 额外json + */ + private String extraJson; + + /** + * 状态 + */ + private String status; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdTime; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 更新人 + */ + private String updateBy; + + /** + * 是否删除 0 未删除 1已删除 + */ + private Integer isDeleted; + + /** + * 是否开启高级设置 + */ + private String openAdvancedSetup; + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssAliBOConverter.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssAliBOConverter.java new file mode 100644 index 0000000..6517cd0 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssAliBOConverter.java @@ -0,0 +1,23 @@ +package com.schisandra.oss.domain.convert; + + + import com.schisandra.oss.domain.bo.SchisandraOssAliBO; + import com.schisandra.oss.infra.basic.entity.SchisandraOssAli; + import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * bo转换器 + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@Mapper +public interface SchisandraOssAliBOConverter { + + SchisandraOssAliBOConverter INSTANCE = Mappers.getMapper(SchisandraOssAliBOConverter.class); + + SchisandraOssAli convertBOToEntity(SchisandraOssAliBO schisandraOssAliBO); + SchisandraOssAliBO convertEntityToBO(SchisandraOssAli schisandraOssAli); + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssConfigBOConverter.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssConfigBOConverter.java deleted file mode 100644 index 1080d9c..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssConfigBOConverter.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.schisandra.oss.domain.convert; - - -import com.schisandra.oss.domain.bo.SchisandraOssConfigBO; -import com.schisandra.oss.infra.basic.entity.SchisandraOssConfig; -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -/** - * bo转换器 - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Mapper -public interface SchisandraOssConfigBOConverter { - - SchisandraOssConfigBOConverter INSTANCE = Mappers.getMapper(SchisandraOssConfigBOConverter.class); - - SchisandraOssConfig convertBOToEntity(SchisandraOssConfigBO schisandraOssConfigBO); - -} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssMinioBOConverter.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssMinioBOConverter.java new file mode 100644 index 0000000..a776a06 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/convert/SchisandraOssMinioBOConverter.java @@ -0,0 +1,22 @@ +package com.schisandra.oss.domain.convert; + + import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; + import com.schisandra.oss.infra.basic.entity.SchisandraOssMinio; + import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * bo转换器 + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@Mapper +public interface SchisandraOssMinioBOConverter { + + SchisandraOssMinioBOConverter INSTANCE = Mappers.getMapper(SchisandraOssMinioBOConverter.class); + + SchisandraOssMinio convertBOToEntity(SchisandraOssMinioBO schisandraOssMinioBO); + SchisandraOssMinioBO convertEntityToBO(SchisandraOssMinio schisandraOssMinio); + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAliDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAliDomainService.java new file mode 100644 index 0000000..41ccef5 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssAliDomainService.java @@ -0,0 +1,31 @@ +package com.schisandra.oss.domain.service; + +import com.schisandra.oss.domain.bo.SchisandraOssAliBO; + + + +/** + * 领域service + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +public interface SchisandraOssAliDomainService { + + /** + * 添加 信息 + */ + Boolean add(SchisandraOssAliBO schisandraOssAliBO); + + /** + * 更新 信息 + */ + Boolean update(SchisandraOssAliBO schisandraOssAliBO); + + /** + * 删除 信息 + */ + Boolean delete(SchisandraOssAliBO schisandraOssAliBO); + + SchisandraOssAliBO getAliOssConfig(Long userId); +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssConfigDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssConfigDomainService.java deleted file mode 100644 index c1d11a5..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssConfigDomainService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.schisandra.oss.domain.service; - -import com.schisandra.oss.domain.bo.SchisandraOssConfigBO; - -/** - * 领域service - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -public interface SchisandraOssConfigDomainService { - - /** - * 添加 信息 - */ - Boolean add(SchisandraOssConfigBO schisandraOssConfigBO); - - /** - * 更新 信息 - */ - Boolean update(SchisandraOssConfigBO schisandraOssConfigBO); - - /** - * 删除 信息 - */ - Boolean delete(SchisandraOssConfigBO schisandraOssConfigBO); - -} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssMinioDomainService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssMinioDomainService.java new file mode 100644 index 0000000..d145107 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/SchisandraOssMinioDomainService.java @@ -0,0 +1,31 @@ +package com.schisandra.oss.domain.service; + +import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; + + + +/** + * 领域service + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +public interface SchisandraOssMinioDomainService { + + /** + * 添加 信息 + */ + Boolean add(SchisandraOssMinioBO schisandraOssMinioBO); + + /** + * 更新 信息 + */ + Boolean update(SchisandraOssMinioBO schisandraOssMinioBO); + + /** + * 删除 信息 + */ + Boolean delete(SchisandraOssMinioBO schisandraOssMinioBO); + + SchisandraOssMinioBO getMinioConfig(Long userId); +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAliDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAliDomainServiceImpl.java new file mode 100644 index 0000000..56019a1 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssAliDomainServiceImpl.java @@ -0,0 +1,56 @@ +package com.schisandra.oss.domain.service.impl; + + +import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssAliBO; +import com.schisandra.oss.domain.convert.SchisandraOssAliBOConverter; +import com.schisandra.oss.domain.service.SchisandraOssAliDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssAli; +import com.schisandra.oss.infra.basic.service.SchisandraOssAliService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 领域service实现了 + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@Service +@Slf4j +public class SchisandraOssAliDomainServiceImpl implements SchisandraOssAliDomainService { + + @Resource + private SchisandraOssAliService schisandraOssAliService; + + @Override + public Boolean add(SchisandraOssAliBO schisandraOssAliBO) { + SchisandraOssAli schisandraOssAli = SchisandraOssAliBOConverter.INSTANCE.convertBOToEntity(schisandraOssAliBO); + schisandraOssAli.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode()); + return schisandraOssAliService.insert(schisandraOssAli) > 0; + } + + @Override + public Boolean update(SchisandraOssAliBO schisandraOssAliBO) { + SchisandraOssAli schisandraOssAli = SchisandraOssAliBOConverter.INSTANCE.convertBOToEntity(schisandraOssAliBO); + return schisandraOssAliService.update(schisandraOssAli) > 0; + } + + @Override + public Boolean delete(SchisandraOssAliBO schisandraOssAliBO) { + SchisandraOssAli schisandraOssAli = new SchisandraOssAli(); + schisandraOssAli.setId(schisandraOssAliBO.getId()); + schisandraOssAli.setIsDeleted(IsDeletedFlagEnum.DELETED.getCode()); + return schisandraOssAliService.update(schisandraOssAli) > 0; + } + + @Override + public SchisandraOssAliBO getAliOssConfig(Long userId) { + SchisandraOssAli schisandraOssAli = schisandraOssAliService.getAliOssConfig(userId); + SchisandraOssAliBO schisandraOssAliBO = SchisandraOssAliBOConverter.INSTANCE.convertEntityToBO(schisandraOssAli); + return schisandraOssAliBO; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssConfigDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssConfigDomainServiceImpl.java deleted file mode 100644 index cb0981d..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssConfigDomainServiceImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.schisandra.oss.domain.service.impl; - - -import com.schisandra.oss.common.enums.IsDeletedFlagEnum; -import com.schisandra.oss.domain.convert.SchisandraOssConfigBOConverter; -import com.schisandra.oss.domain.bo.SchisandraOssConfigBO; -import com.schisandra.oss.domain.service.SchisandraOssConfigDomainService; -import com.schisandra.oss.infra.basic.entity.SchisandraOssConfig; -import com.schisandra.oss.infra.basic.service.SchisandraOssConfigService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; - -/** - * 领域service实现了 - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Service -@Slf4j -public class SchisandraOssConfigDomainServiceImpl implements SchisandraOssConfigDomainService { - - @Resource - private SchisandraOssConfigService schisandraOssConfigService; - - @Override - public Boolean add(SchisandraOssConfigBO schisandraOssConfigBO) { - SchisandraOssConfig schisandraOssConfig = SchisandraOssConfigBOConverter.INSTANCE.convertBOToEntity(schisandraOssConfigBO); - schisandraOssConfig.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode()); - return schisandraOssConfigService.insert(schisandraOssConfig) > 0; - } - - @Override - public Boolean update(SchisandraOssConfigBO schisandraOssConfigBO) { - SchisandraOssConfig schisandraOssConfig = SchisandraOssConfigBOConverter.INSTANCE.convertBOToEntity(schisandraOssConfigBO); - return schisandraOssConfigService.update(schisandraOssConfig) > 0; - } - - @Override - public Boolean delete(SchisandraOssConfigBO schisandraOssConfigBO) { - SchisandraOssConfig schisandraOssConfig = new SchisandraOssConfig(); - schisandraOssConfig.setId(schisandraOssConfigBO.getId()); - schisandraOssConfig.setIsDeleted(IsDeletedFlagEnum.DELETED.getCode()); - return schisandraOssConfigService.update(schisandraOssConfig) > 0; - } - -} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssMinioDomainServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssMinioDomainServiceImpl.java new file mode 100644 index 0000000..619e645 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-domain/src/main/java/com/schisandra/oss/domain/service/impl/SchisandraOssMinioDomainServiceImpl.java @@ -0,0 +1,56 @@ +package com.schisandra.oss.domain.service.impl; + + +import com.schisandra.oss.common.enums.IsDeletedFlagEnum; +import com.schisandra.oss.domain.bo.SchisandraOssMinioBO; +import com.schisandra.oss.domain.convert.SchisandraOssMinioBOConverter; +import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService; +import com.schisandra.oss.infra.basic.entity.SchisandraOssMinio; +import com.schisandra.oss.infra.basic.service.SchisandraOssMinioService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 领域service实现了 + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@Service +@Slf4j +public class SchisandraOssMinioDomainServiceImpl implements SchisandraOssMinioDomainService { + + @Resource + private SchisandraOssMinioService schisandraOssMinioService; + + @Override + public Boolean add(SchisandraOssMinioBO schisandraOssMinioBO) { + SchisandraOssMinio schisandraOssMinio = SchisandraOssMinioBOConverter.INSTANCE.convertBOToEntity(schisandraOssMinioBO); + schisandraOssMinio.setIsDeleted(IsDeletedFlagEnum.UN_DELETED.getCode()); + return schisandraOssMinioService.insert(schisandraOssMinio) > 0; + } + + @Override + public Boolean update(SchisandraOssMinioBO schisandraOssMinioBO) { + SchisandraOssMinio schisandraOssMinio = SchisandraOssMinioBOConverter.INSTANCE.convertBOToEntity(schisandraOssMinioBO); + return schisandraOssMinioService.update(schisandraOssMinio) > 0; + } + + @Override + public Boolean delete(SchisandraOssMinioBO schisandraOssMinioBO) { + SchisandraOssMinio schisandraOssMinio = new SchisandraOssMinio(); + schisandraOssMinio.setId(schisandraOssMinioBO.getId()); + schisandraOssMinio.setIsDeleted(IsDeletedFlagEnum.DELETED.getCode()); + return schisandraOssMinioService.update(schisandraOssMinio) > 0; + } + + @Override + public SchisandraOssMinioBO getMinioConfig(Long userId) { + SchisandraOssMinio schisandraOssMinio= schisandraOssMinioService.getMinioConfig(userId); + SchisandraOssMinioBO schisandraOssMinioBO = SchisandraOssMinioBOConverter.INSTANCE.convertEntityToBO(schisandraOssMinio); + return schisandraOssMinioBO; + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssAliDao.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssAliDao.java new file mode 100644 index 0000000..670f2a9 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssAliDao.java @@ -0,0 +1,18 @@ +package com.schisandra.oss.infra.basic.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + import com.schisandra.oss.infra.basic.entity.SchisandraOssAli; + import org.springframework.stereotype.Repository; + +/** + * 表数据库访问层 + * + * @author landaiqing + * @since 2024-05-14 20:10:20 + */ +@Repository +public interface SchisandraOssAliDao extends BaseMapper { + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssConfigDao.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssConfigDao.java deleted file mode 100644 index ff9d2ad..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssConfigDao.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.schisandra.oss.infra.basic.dao; - - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.schisandra.oss.infra.basic.entity.SchisandraOssConfig; -import org.springframework.stereotype.Repository; - -/** - * 表数据库访问层 - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Repository -public interface SchisandraOssConfigDao extends BaseMapper { - -} - diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssMinioDao.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssMinioDao.java new file mode 100644 index 0000000..38fc134 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/dao/SchisandraOssMinioDao.java @@ -0,0 +1,18 @@ +package com.schisandra.oss.infra.basic.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + import com.schisandra.oss.infra.basic.entity.SchisandraOssMinio; + import org.springframework.stereotype.Repository; + +/** + * 表数据库访问层 + * + * @author landaiqing + * @since 2024-05-14 19:32:24 + */ +@Repository +public interface SchisandraOssMinioDao extends BaseMapper { + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssAli.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssAli.java new file mode 100644 index 0000000..c1c31e2 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssAli.java @@ -0,0 +1,325 @@ +package com.schisandra.oss.infra.basic.entity; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 实体类 + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@Data +@TableName("schisandra_oss_ali") +public class SchisandraOssAli implements Serializable { + + /** + * + */ + @TableId(value = "`id`", type = IdType.AUTO) + private Long id; + + /** + * + */ + @TableField("`user_id`") + private Long userId; + + /** + * OSS地址 + */ + @TableField("`endpoint`") + private String endpoint; + + /** + * AccessKey ID + */ + @TableField("`access_key_id`") + private String accessKeyId; + + /** + * AccessKey Secret + */ + @TableField("`access_key_secret`") + private String accessKeySecret; + + /** + * security Token + */ + @TableField("`security_token`") + private String securityToken; + + /** + * Bucket名称 + */ + @TableField("`bucket_name`") + private String bucketName; + + /** + * 数据存储路径 + */ + @TableField("`base_path`") + private String basePath; + + /** + * 用户代理,指HTTP的User-Agent头。默认为aliyun-sdk-java。 + */ + @TableField("`user_agent`") + private String userAgent; + + /** + * 请求失败后最大的重试次数。默认3次。 + */ + @TableField("`max_error_retry`") + private String maxErrorRetry; + + /** + * 从连接池中获取连接的超时时间(单位:毫秒)。默认不超时。 + */ + @TableField("`connection_request_timeout`") + private Integer connectionRequestTimeout; + + /** + * 建立连接的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + @TableField("`connection_timeout`") + private Integer connectionTimeout; + + /** + * Socket层传输数据的超时时间(单位:毫秒)。默认为50000毫秒。 + */ + @TableField("`socket_timeout`") + private Integer socketTimeout; + + /** + * 允许打开的最大HTTP连接数。默认为1024 + */ + @TableField("`max_connections`") + private Integer maxConnections; + + /** + * 连接TTL (生存时间)。Http连接由连接管理器用TTL缓存。 + */ + @TableField("`connection_TTL`") + private Long connectionTTL; + + /** + * 是否使用com.aliyun.oss.common.comm.IdleConnectionReaper管理过期连接,默认开启 + */ + @TableField("`use_reaper`") + private String useReaper; + + /** + * 连接空闲超时时间,超时则关闭连接(单位:毫秒)。默认为60000毫秒。 + */ + @TableField("`idle_connection_time`") + private Long idleConnectionTime; + + /** + * 连接OSS所采用的协议(HTTP或HTTPS),默认为HTTP。 + */ + @TableField("`protocol`") + private String protocol; + + /** + * 代理服务器主机地址。 + */ + @TableField("`proxy_host`") + private String proxyHost; + + /** + * 代理服务器端口。 + */ + @TableField("`proxy_port`") + private String proxyPort; + + /** + * 代理服务器验证的用户名。 + */ + @TableField("`proxy_username`") + private String proxyUsername; + + /** + * 代理服务器验证的密码。 + */ + @TableField("`proxy_password`") + private String proxyPassword; + + /** + * 代理服务器的域,该域可以执行NTLM认证 + */ + @TableField("`proxy_domain`") + private String proxyDomain; + + /** + * 代理主机的NTLM身份验证服务器 + */ + @TableField("`proxy_workstation`") + private String proxyWorkstation; + + /** + * 是否支持CNAME作为Endpoint,默认支持CNAME。 + */ + @TableField("`support_cname`") + private String supportCname; + + /** + * 设置不可变排除的CName列表 ---- 任何以该列表中的项目结尾的域都不会进行Cname解析。 + */ + @TableField("`cname_exclude_list`") + private String cnameExcludeList; + + /** + * 是否开启二级域名(Second Level Domain)的访问方式,默认不开启。 + */ + @TableField("`sld_enabled`") + private String sldEnabled; + + /** + * 请求超时时间,单位:毫秒。默认情况下是5分钟。 + */ + @TableField("`request_timeout`") + private Integer requestTimeout; + + /** + * 是否启用请求超时校验。默认情况下,它是禁用的。 + */ + @TableField("`request_timeout_enabled`") + private String requestTimeoutEnabled; + + /** + * 设置慢请求的延迟阈值。如果请求的延迟大于延迟,则将记录该请求。默认情况下,阈值为5分钟。 + */ + @TableField("`slow_requests_threshold`") + private Long slowRequestsThreshold; + + /** + * 设置默认的http头。所有请求头将自动添加到每个请求中。如果在请求中也指定了相同的请求头,则默认的标头将被覆盖。 + */ + @TableField("`default_headers`") + private String defaultHeaders; + + /** + * 是否在上传和下载时启用CRC校验,默认启用 + */ + @TableField("`crc_check_enabled`") + private String crcCheckEnabled; + + /** + * 所有请求设置签名版本 + */ + @TableField("`signature_version`") + private String signatureVersion; + + /** + * 设置OSS服务端时间和本地时间之间的差异,以毫秒为单位。 + */ + @TableField("`tick_offset`") + private Long tickOffset; + + /** + * 是否开启HTTP重定向。 +说明: Java SDK 3.10.1及以上版本支持设置是否开启HTTP重定向,默认开启。 + */ + @TableField("`redirect_enable`") + private String redirectEnable; + + /** + * 是否开启SSL证书校验。 + * 说明: Java SDK 3.10.1及以上版本支持设置是否开启SSL证书校验,默认开启。 + */ + @TableField("`verify_SSL_enable`") + private String verifySSLEnable; + + /** + * 是否开启日志记录连接池统计信息 + */ + @TableField("`log_connection_pool_stats`") + private String logConnectionPoolStats; + + /** + * 是否使用系统属性值 + */ + @TableField("`use_system_property_values`") + private String useSystemPropertyValues; + + /** + * 分片大小,默认5MB + */ + @TableField("`part_size`") + private Integer partSize; + + /** + * 并发线程数,默认等于CPU的核数 + */ + @TableField("`task_num`") + private Integer taskNum; + + /** + * 状态 + */ + @TableField("`status`") + private String status; + + /** + * 是否开启高级设置 + */ + @TableField("`open_advanced_setup`") + private String openAdvancedSetup; + + /** + * 创建人 + */ + @TableField("`created_by`") + private String createdBy; + + /** + * 创建时间 + */ + @TableField("`created_time`") + private Date createdTime; + + /** + * 更新时间 + */ + @TableField("`update_time`") + private Date updateTime; + + /** + * 更新人 + */ + @TableField("`update_by`") + private String updateBy; + + /** + * 是否删除 0 未删除 1已删除 + */ + @TableField("`is_deleted`") + private Integer isDeleted; + + /** + * 额外字段 + */ + @TableField("`extra_json`") + private String extraJson; + + /** + * 当桶不存在,是否创建 + */ + @TableField("`create_bucket`") + private String createBucket; + + /** + * 启动检测桶,是否存在 + */ + @TableField("`check_bucket`") + private String checkBucket; + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssConfig.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssConfig.java deleted file mode 100644 index 1fa8503..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssConfig.java +++ /dev/null @@ -1,197 +0,0 @@ -package com.schisandra.oss.infra.basic.entity; - -import lombok.Data; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.util.Date; - -/** - * 实体类 - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Data -@TableName("schisandra_oss_config") -public class SchisandraOssConfig implements Serializable { - - /** - * - */ - @TableId(value = "`id`", type = IdType.AUTO) - private Long id; - - /** - * - */ - @TableField("`oss_type`") - private String ossType; - - /** - * - */ - @TableField("`endpoint`") - private String endpoint; - - /** - * - */ - @TableField("`access_key`") - private String accessKey; - - /** - * - */ - @TableField("`secret_key`") - private String secretKey; - - /** - * - */ - @TableField("`bucket_name`") - private String bucketName; - - /** - * - */ - @TableField("`base_path`") - private String basePath; - - /** - * - */ - @TableField("`region`") - private String region; - - /** - * - */ - @TableField("`task_num`") - private Integer taskNum; - - /** - * - */ - @TableField("`part_size`") - private String partSize; - - /** - * - */ - @TableField("`img_size`") - private Double imgSize; - - /** - * - */ - @TableField("`file_size`") - private Double fileSize; - - /** - * - */ - @TableField("`connect_timeout`") - private Integer connectTimeout; - - /** - * - */ - @TableField("`write_timeout`") - private Integer writeTimeout; - - /** - * - */ - @TableField("`read_timeout`") - private Integer readTimeout; - - /** - * - */ - @TableField("`zone`") - private String zone; - - /** - * - */ - @TableField("`public_key`") - private String publicKey; - - /** - * - */ - @TableField("`private_key`") - private String privateKey; - - /** - * - */ - @TableField("`custom_host`") - private String customHost; - - /** - * - */ - @TableField("`host`") - private String host; - - /** - * - */ - @TableField("`port`") - private String port; - - /** - * - */ - @TableField("`user`") - private String user; - - /** - * - */ - @TableField("`password`") - private String password; - - /** - * - */ - @TableField("`charset`") - private String charset; - - /** - * - */ - @TableField("`extra_json`") - private String extraJson; - - /** - * 创建时间 - */ - @TableField("`create_date`") - private Date createDate; - - /** - * 更新者 - */ - @TableField("`update_by`") - private String updateBy; - - /** - * 更新时间 - */ - @TableField("`update_date`") - private Date updateDate; - - /** - * 是否删除 0未删除 1已删除 - */ - @TableField("`is_deleted`") - private Integer isDeleted; - -} - diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssMinio.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssMinio.java new file mode 100644 index 0000000..3132cd2 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/entity/SchisandraOssMinio.java @@ -0,0 +1,221 @@ +package com.schisandra.oss.infra.basic.entity; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.util.Date; + +/** + * 实体类 + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@Data +@TableName("schisandra_oss_minio") +public class SchisandraOssMinio implements Serializable { + + /** + * + */ + @TableId(value = "`id`", type = IdType.AUTO) + private Long id; + + /** + * + */ + @TableField("`user_id`") + private Long userId; + + /** + * + */ + @TableField("`endpoint`") + private String endpoint; + + /** + * + */ + @TableField("`accessKey`") + private String accessKey; + + /** + * + */ + @TableField("`secretKey`") + private String secretKey; + + /** + * + */ + @TableField("`bucketName`") + private String bucketName; + + /** + * + */ + @TableField("`port`") + private Integer port; + + /** + * + */ + @TableField("`basePath`") + private String basePath; + + /** + * + */ + @TableField("`file_host`") + private String fileHost; + + /** + * + */ + @TableField("`download_host`") + private String downloadHost; + + /** + * + */ + @TableField("`upload_host`") + private String uploadHost; + + /** + * 当桶不存在,是否创建 + */ + @TableField("`create_bucket`") + private String createBucket; + + /** + * 启动检测桶,是否存在 + */ + @TableField("`check_bucket`") + private String checkBucket; + + /** + * 连接超时时间(单位:毫秒) + */ + @TableField("`connect_timeout`") + private Long connectTimeout; + + /** + * 写超时时间(单位:毫秒) + */ + @TableField("`write_timeout`") + private Long writeTimeout; + + /** + * 读超时时间(单位:毫秒) + */ + @TableField("`read_timeout`") + private Long readTimeout; + + /** + * 调用超时时间(单位:毫秒) + */ + @TableField("`call_timeout`") + private Long callTimeout; + + /** + * 是否支持重定向,默认支持 + */ + @TableField("`follow_redirects`") + private String followRedirects; + + /** + * 是否支持HTTP到HTTPS,HTTPS到HTTP的重定向,默认支持 + */ + @TableField("`follow_ssl_redirects`") + private String followSslRedirects; + + /** + * 是否开始连接失败重试,默认不支持 + */ + @TableField("`retry_on_connection_failure`") + private String retryOnConnectionFailure; + + /** + * 连接健康检测间隔时长(单位:毫秒) + */ + @TableField("`ping_interval`") + private Integer pingInterval; + + /** + * 分片大小,默认5MB + */ + @TableField("`part_size`") + private Long partSize; + + /** + * 并发线程数,默认等于CPU的核数 + */ + @TableField("`task_num`") + private Integer taskNum; + + /** + * 图片大小限制,单位:m + */ + @TableField("`img_size`") + private Integer imgSize; + + /** + * 文件大小限制,单位:m + */ + @TableField("`file_size`") + private Integer fileSize; + + /** + * 额外json + */ + @TableField("`extra_json`") + private String extraJson; + + /** + * 状态 + */ + @TableField("`status`") + private String status; + + /** + * 创建人 + */ + @TableField("`created_by`") + private String createdBy; + + /** + * 创建时间 + */ + @TableField("`created_time`") + private Date createdTime; + + /** + * 更新时间 + */ + @TableField("`update_time`") + private Date updateTime; + + /** + * 更新人 + */ + @TableField("`update_by`") + private String updateBy; + + /** + * 是否删除 0 未删除 1已删除 + */ + @TableField("`is_deleted`") + private Integer isDeleted; + + /** + * 是否开启高级设置 + */ + @TableField("`open_advanced_setup`") + private String openAdvancedSetup; + +} + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssConfigService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAliService.java similarity index 52% rename from schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssConfigService.java rename to schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAliService.java index 10daff8..dc20c43 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssConfigService.java +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssAliService.java @@ -1,14 +1,15 @@ package com.schisandra.oss.infra.basic.service; -import com.schisandra.oss.infra.basic.entity.SchisandraOssConfig; +import com.schisandra.oss.infra.basic.entity.SchisandraOssAli; + /** * 表服务接口 * * @author landaiqing - * @since 2024-05-11 22:58:14 + * @since 2024-05-14 20:45:32 */ -public interface SchisandraOssConfigService { +public interface SchisandraOssAliService { /** * 通过ID查询单条数据 @@ -16,23 +17,23 @@ public interface SchisandraOssConfigService { * @param id 主键 * @return 实例对象 */ - SchisandraOssConfig queryById(Long id); + SchisandraOssAli queryById(Long id); /** * 新增数据 * - * @param schisandraOssConfig 实例对象 + * @param schisandraOssAli 实例对象 * @return 实例对象 */ - int insert(SchisandraOssConfig schisandraOssConfig); + int insert(SchisandraOssAli schisandraOssAli); /** * 修改数据 * - * @param schisandraOssConfig 实例对象 + * @param schisandraOssAli 实例对象 * @return 实例对象 */ - int update(SchisandraOssConfig schisandraOssConfig); + int update(SchisandraOssAli schisandraOssAli); /** * 通过主键删除数据 @@ -45,6 +46,7 @@ public interface SchisandraOssConfigService { /** * 根据条件查询角色 */ - SchisandraOssConfig queryByCondition(SchisandraOssConfig schisandraOssConfig); + SchisandraOssAli queryByCondition(SchisandraOssAli schisandraOssAli); + SchisandraOssAli getAliOssConfig(Long userId); } diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssMinioService.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssMinioService.java new file mode 100644 index 0000000..58145c9 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/SchisandraOssMinioService.java @@ -0,0 +1,53 @@ +package com.schisandra.oss.infra.basic.service; + +import com.schisandra.oss.infra.basic.entity.SchisandraOssMinio; + + + +/** + * 表服务接口 + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +public interface SchisandraOssMinioService { + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + SchisandraOssMinio queryById(Long id); + + /** + * 新增数据 + * + * @param schisandraOssMinio 实例对象 + * @return 实例对象 + */ + int insert(SchisandraOssMinio schisandraOssMinio); + + /** + * 修改数据 + * + * @param schisandraOssMinio 实例对象 + * @return 实例对象 + */ + int update(SchisandraOssMinio schisandraOssMinio); + + /** + * 通过主键删除数据 + * + * @param id 主键 + * @return 是否成功 + */ + boolean deleteById(Long id); + + /** + * 根据条件查询角色 + */ + SchisandraOssMinio queryByCondition(SchisandraOssMinio schisandraOssMinio); + + SchisandraOssMinio getMinioConfig(Long userId); +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAliServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAliServiceImpl.java new file mode 100644 index 0000000..499b923 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssAliServiceImpl.java @@ -0,0 +1,141 @@ +package com.schisandra.oss.infra.basic.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.schisandra.oss.infra.basic.dao.SchisandraOssAliDao; +import com.schisandra.oss.infra.basic.entity.SchisandraOssAli; +import com.schisandra.oss.infra.basic.service.SchisandraOssAliService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * 表服务实现类 + * + * @author landaiqing + * @since 2024-05-14 20:45:32 + */ +@Service("SchisandraOssAliService") +public class SchisandraOssAliServiceImpl implements SchisandraOssAliService { + + @Resource + private SchisandraOssAliDao schisandraOssAliDao; + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + @Override + public SchisandraOssAli queryById(Long id) { + return this.schisandraOssAliDao.selectById(id); + } + + /** + * 新增数据 + * + * @param schisandraOssAli 实例对象 + * @return 实例对象 + */ + @Override + public int insert(SchisandraOssAli schisandraOssAli) { + return this.schisandraOssAliDao.insert(schisandraOssAli); + } + + /** + * 修改数据 + * + * @param schisandraOssAli 实例对象 + * @return 实例对象 + */ + @Override + public int update(SchisandraOssAli schisandraOssAli) { + return this.schisandraOssAliDao.updateById(schisandraOssAli); + } + + /** + * 通过主键删除数据 + * + * @param id 主键 + * @return 是否成功 + */ + @Override + public boolean deleteById(Long id) { + return this.schisandraOssAliDao.deleteById(id) > 0; + } + + /** + * 条件查询 + * + * @param schisandraOssAli 条件 + * @return 实例对象 + */ + @Override + public SchisandraOssAli queryByCondition(SchisandraOssAli schisandraOssAli) { + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(Objects.nonNull(schisandraOssAli.getId()), SchisandraOssAli::getId, schisandraOssAli.getId()) + .eq(Objects.nonNull(schisandraOssAli.getUserId()), SchisandraOssAli::getUserId, schisandraOssAli.getUserId()) + .eq(Objects.nonNull(schisandraOssAli.getEndpoint()), SchisandraOssAli::getEndpoint, schisandraOssAli.getEndpoint()) + .eq(Objects.nonNull(schisandraOssAli.getAccessKeyId()), SchisandraOssAli::getAccessKeyId, schisandraOssAli.getAccessKeyId()) + .eq(Objects.nonNull(schisandraOssAli.getAccessKeySecret()), SchisandraOssAli::getAccessKeySecret, schisandraOssAli.getAccessKeySecret()) + .eq(Objects.nonNull(schisandraOssAli.getSecurityToken()), SchisandraOssAli::getSecurityToken, schisandraOssAli.getSecurityToken()) + .eq(Objects.nonNull(schisandraOssAli.getBucketName()), SchisandraOssAli::getBucketName, schisandraOssAli.getBucketName()) + .eq(Objects.nonNull(schisandraOssAli.getBasePath()), SchisandraOssAli::getBasePath, schisandraOssAli.getBasePath()) + .eq(Objects.nonNull(schisandraOssAli.getUserAgent()), SchisandraOssAli::getUserAgent, schisandraOssAli.getUserAgent()) + .eq(Objects.nonNull(schisandraOssAli.getMaxErrorRetry()), SchisandraOssAli::getMaxErrorRetry, schisandraOssAli.getMaxErrorRetry()) + .eq(Objects.nonNull(schisandraOssAli.getConnectionRequestTimeout()), SchisandraOssAli::getConnectionRequestTimeout, schisandraOssAli.getConnectionRequestTimeout()) + .eq(Objects.nonNull(schisandraOssAli.getConnectionTimeout()), SchisandraOssAli::getConnectionTimeout, schisandraOssAli.getConnectionTimeout()) + .eq(Objects.nonNull(schisandraOssAli.getSocketTimeout()), SchisandraOssAli::getSocketTimeout, schisandraOssAli.getSocketTimeout()) + .eq(Objects.nonNull(schisandraOssAli.getMaxConnections()), SchisandraOssAli::getMaxConnections, schisandraOssAli.getMaxConnections()) + .eq(Objects.nonNull(schisandraOssAli.getConnectionTTL()), SchisandraOssAli::getConnectionTTL, schisandraOssAli.getConnectionTTL()) + .eq(Objects.nonNull(schisandraOssAli.getUseReaper()), SchisandraOssAli::getUseReaper, schisandraOssAli.getUseReaper()) + .eq(Objects.nonNull(schisandraOssAli.getIdleConnectionTime()), SchisandraOssAli::getIdleConnectionTime, schisandraOssAli.getIdleConnectionTime()) + .eq(Objects.nonNull(schisandraOssAli.getProtocol()), SchisandraOssAli::getProtocol, schisandraOssAli.getProtocol()) + .eq(Objects.nonNull(schisandraOssAli.getProxyHost()), SchisandraOssAli::getProxyHost, schisandraOssAli.getProxyHost()) + .eq(Objects.nonNull(schisandraOssAli.getProxyPort()), SchisandraOssAli::getProxyPort, schisandraOssAli.getProxyPort()) + .eq(Objects.nonNull(schisandraOssAli.getProxyUsername()), SchisandraOssAli::getProxyUsername, schisandraOssAli.getProxyUsername()) + .eq(Objects.nonNull(schisandraOssAli.getProxyPassword()), SchisandraOssAli::getProxyPassword, schisandraOssAli.getProxyPassword()) + .eq(Objects.nonNull(schisandraOssAli.getProxyDomain()), SchisandraOssAli::getProxyDomain, schisandraOssAli.getProxyDomain()) + .eq(Objects.nonNull(schisandraOssAli.getProxyWorkstation()), SchisandraOssAli::getProxyWorkstation, schisandraOssAli.getProxyWorkstation()) + .eq(Objects.nonNull(schisandraOssAli.getSupportCname()), SchisandraOssAli::getSupportCname, schisandraOssAli.getSupportCname()) + .eq(Objects.nonNull(schisandraOssAli.getCnameExcludeList()), SchisandraOssAli::getCnameExcludeList, schisandraOssAli.getCnameExcludeList()) + .eq(Objects.nonNull(schisandraOssAli.getSldEnabled()), SchisandraOssAli::getSldEnabled, schisandraOssAli.getSldEnabled()) + .eq(Objects.nonNull(schisandraOssAli.getRequestTimeout()), SchisandraOssAli::getRequestTimeout, schisandraOssAli.getRequestTimeout()) + .eq(Objects.nonNull(schisandraOssAli.getRequestTimeoutEnabled()), SchisandraOssAli::getRequestTimeoutEnabled, schisandraOssAli.getRequestTimeoutEnabled()) + .eq(Objects.nonNull(schisandraOssAli.getSlowRequestsThreshold()), SchisandraOssAli::getSlowRequestsThreshold, schisandraOssAli.getSlowRequestsThreshold()) + .eq(Objects.nonNull(schisandraOssAli.getDefaultHeaders()), SchisandraOssAli::getDefaultHeaders, schisandraOssAli.getDefaultHeaders()) + .eq(Objects.nonNull(schisandraOssAli.getCrcCheckEnabled()), SchisandraOssAli::getCrcCheckEnabled, schisandraOssAli.getCrcCheckEnabled()) + .eq(Objects.nonNull(schisandraOssAli.getSignatureVersion()), SchisandraOssAli::getSignatureVersion, schisandraOssAli.getSignatureVersion()) + .eq(Objects.nonNull(schisandraOssAli.getTickOffset()), SchisandraOssAli::getTickOffset, schisandraOssAli.getTickOffset()) + .eq(Objects.nonNull(schisandraOssAli.getRedirectEnable()), SchisandraOssAli::getRedirectEnable, schisandraOssAli.getRedirectEnable()) + .eq(Objects.nonNull(schisandraOssAli.getVerifySSLEnable()), SchisandraOssAli::getVerifySSLEnable, schisandraOssAli.getVerifySSLEnable()) + .eq(Objects.nonNull(schisandraOssAli.getLogConnectionPoolStats()), SchisandraOssAli::getLogConnectionPoolStats, schisandraOssAli.getLogConnectionPoolStats()) + .eq(Objects.nonNull(schisandraOssAli.getUseSystemPropertyValues()), SchisandraOssAli::getUseSystemPropertyValues, schisandraOssAli.getUseSystemPropertyValues()) + .eq(Objects.nonNull(schisandraOssAli.getPartSize()), SchisandraOssAli::getPartSize, schisandraOssAli.getPartSize()) + .eq(Objects.nonNull(schisandraOssAli.getTaskNum()), SchisandraOssAli::getTaskNum, schisandraOssAli.getTaskNum()) + .eq(Objects.nonNull(schisandraOssAli.getStatus()), SchisandraOssAli::getStatus, schisandraOssAli.getStatus()) + .eq(Objects.nonNull(schisandraOssAli.getOpenAdvancedSetup()), SchisandraOssAli::getOpenAdvancedSetup, schisandraOssAli.getOpenAdvancedSetup()) + .eq(Objects.nonNull(schisandraOssAli.getCreatedBy()), SchisandraOssAli::getCreatedBy, schisandraOssAli.getCreatedBy()) + .eq(Objects.nonNull(schisandraOssAli.getCreatedTime()), SchisandraOssAli::getCreatedTime, schisandraOssAli.getCreatedTime()) + .eq(Objects.nonNull(schisandraOssAli.getUpdateTime()), SchisandraOssAli::getUpdateTime, schisandraOssAli.getUpdateTime()) + .eq(Objects.nonNull(schisandraOssAli.getUpdateBy()), SchisandraOssAli::getUpdateBy, schisandraOssAli.getUpdateBy()) + .eq(Objects.nonNull(schisandraOssAli.getIsDeleted()), SchisandraOssAli::getIsDeleted, schisandraOssAli.getIsDeleted()) + .eq(Objects.nonNull(schisandraOssAli.getExtraJson()), SchisandraOssAli::getExtraJson, schisandraOssAli.getExtraJson()) + .eq(Objects.nonNull(schisandraOssAli.getCreateBucket()), SchisandraOssAli::getCreateBucket, schisandraOssAli.getCreateBucket()) + .eq(Objects.nonNull(schisandraOssAli.getCheckBucket()), SchisandraOssAli::getCheckBucket, schisandraOssAli.getCheckBucket()); + return schisandraOssAliDao.selectOne(queryWrapper); + + } + + @Override + public SchisandraOssAli getAliOssConfig(Long userId) { + return schisandraOssAliDao.selectOne(new QueryWrapper() + .eq("user_id", userId) + .eq("is_deleted", 0)); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssConfigServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssConfigServiceImpl.java deleted file mode 100644 index 996fe95..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssConfigServiceImpl.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.schisandra.oss.infra.basic.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.schisandra.oss.infra.basic.dao.SchisandraOssConfigDao; -import com.schisandra.oss.infra.basic.entity.SchisandraOssConfig; -import com.schisandra.oss.infra.basic.service.SchisandraOssConfigService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Objects; - -/** - * 表服务实现类 - * - * @author landaiqing - * @since 2024-05-11 22:58:14 - */ -@Service("SchisandraOssConfigService") -public class SchisandraOssConfigServiceImpl implements SchisandraOssConfigService { - - @Resource - private SchisandraOssConfigDao schisandraOssConfigDao; - - /** - * 通过ID查询单条数据 - * - * @param id 主键 - * @return 实例对象 - */ - @Override - public SchisandraOssConfig queryById(Long id) { - return this.schisandraOssConfigDao.selectById(id); - } - - /** - * 新增数据 - * - * @param schisandraOssConfig 实例对象 - * @return 实例对象 - */ - @Override - public int insert(SchisandraOssConfig schisandraOssConfig) { - return this.schisandraOssConfigDao.insert(schisandraOssConfig); - } - - /** - * 修改数据 - * - * @param schisandraOssConfig 实例对象 - * @return 实例对象 - */ - @Override - public int update(SchisandraOssConfig schisandraOssConfig) { - return this.schisandraOssConfigDao.updateById(schisandraOssConfig); - } - - /** - * 通过主键删除数据 - * - * @param id 主键 - * @return 是否成功 - */ - @Override - public boolean deleteById(Long id) { - return this.schisandraOssConfigDao.deleteById(id) > 0; - } - - /** - * 条件查询 - * - * @param schisandraOssConfig 条件 - * @return 实例对象 - */ - @Override - public SchisandraOssConfig queryByCondition(SchisandraOssConfig schisandraOssConfig) { - - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() - .eq(Objects.nonNull(schisandraOssConfig.getId()), SchisandraOssConfig::getId, schisandraOssConfig.getId()) - .eq(Objects.nonNull(schisandraOssConfig.getOssType()), SchisandraOssConfig::getOssType, schisandraOssConfig.getOssType()) - .eq(Objects.nonNull(schisandraOssConfig.getEndpoint()), SchisandraOssConfig::getEndpoint, schisandraOssConfig.getEndpoint()) - .eq(Objects.nonNull(schisandraOssConfig.getAccessKey()), SchisandraOssConfig::getAccessKey, schisandraOssConfig.getAccessKey()) - .eq(Objects.nonNull(schisandraOssConfig.getSecretKey()), SchisandraOssConfig::getSecretKey, schisandraOssConfig.getSecretKey()) - .eq(Objects.nonNull(schisandraOssConfig.getBucketName()), SchisandraOssConfig::getBucketName, schisandraOssConfig.getBucketName()) - .eq(Objects.nonNull(schisandraOssConfig.getBasePath()), SchisandraOssConfig::getBasePath, schisandraOssConfig.getBasePath()) - .eq(Objects.nonNull(schisandraOssConfig.getRegion()), SchisandraOssConfig::getRegion, schisandraOssConfig.getRegion()) - .eq(Objects.nonNull(schisandraOssConfig.getTaskNum()), SchisandraOssConfig::getTaskNum, schisandraOssConfig.getTaskNum()) - .eq(Objects.nonNull(schisandraOssConfig.getPartSize()), SchisandraOssConfig::getPartSize, schisandraOssConfig.getPartSize()) - .eq(Objects.nonNull(schisandraOssConfig.getImgSize()), SchisandraOssConfig::getImgSize, schisandraOssConfig.getImgSize()) - .eq(Objects.nonNull(schisandraOssConfig.getFileSize()), SchisandraOssConfig::getFileSize, schisandraOssConfig.getFileSize()) - .eq(Objects.nonNull(schisandraOssConfig.getConnectTimeout()), SchisandraOssConfig::getConnectTimeout, schisandraOssConfig.getConnectTimeout()) - .eq(Objects.nonNull(schisandraOssConfig.getWriteTimeout()), SchisandraOssConfig::getWriteTimeout, schisandraOssConfig.getWriteTimeout()) - .eq(Objects.nonNull(schisandraOssConfig.getReadTimeout()), SchisandraOssConfig::getReadTimeout, schisandraOssConfig.getReadTimeout()) - .eq(Objects.nonNull(schisandraOssConfig.getZone()), SchisandraOssConfig::getZone, schisandraOssConfig.getZone()) - .eq(Objects.nonNull(schisandraOssConfig.getPublicKey()), SchisandraOssConfig::getPublicKey, schisandraOssConfig.getPublicKey()) - .eq(Objects.nonNull(schisandraOssConfig.getPrivateKey()), SchisandraOssConfig::getPrivateKey, schisandraOssConfig.getPrivateKey()) - .eq(Objects.nonNull(schisandraOssConfig.getCustomHost()), SchisandraOssConfig::getCustomHost, schisandraOssConfig.getCustomHost()) - .eq(Objects.nonNull(schisandraOssConfig.getHost()), SchisandraOssConfig::getHost, schisandraOssConfig.getHost()) - .eq(Objects.nonNull(schisandraOssConfig.getPort()), SchisandraOssConfig::getPort, schisandraOssConfig.getPort()) - .eq(Objects.nonNull(schisandraOssConfig.getUser()), SchisandraOssConfig::getUser, schisandraOssConfig.getUser()) - .eq(Objects.nonNull(schisandraOssConfig.getPassword()), SchisandraOssConfig::getPassword, schisandraOssConfig.getPassword()) - .eq(Objects.nonNull(schisandraOssConfig.getCharset()), SchisandraOssConfig::getCharset, schisandraOssConfig.getCharset()) - .eq(Objects.nonNull(schisandraOssConfig.getExtraJson()), SchisandraOssConfig::getExtraJson, schisandraOssConfig.getExtraJson()) - .eq(Objects.nonNull(schisandraOssConfig.getCreateDate()), SchisandraOssConfig::getCreateDate, schisandraOssConfig.getCreateDate()) - .eq(Objects.nonNull(schisandraOssConfig.getUpdateBy()), SchisandraOssConfig::getUpdateBy, schisandraOssConfig.getUpdateBy()) - .eq(Objects.nonNull(schisandraOssConfig.getUpdateDate()), SchisandraOssConfig::getUpdateDate, schisandraOssConfig.getUpdateDate()) - .eq(Objects.nonNull(schisandraOssConfig.getIsDeleted()), SchisandraOssConfig::getIsDeleted, schisandraOssConfig.getIsDeleted()) - ; - return schisandraOssConfigDao.selectOne(queryWrapper); - - } - -} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssMinioServiceImpl.java b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssMinioServiceImpl.java new file mode 100644 index 0000000..0ab339b --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/java/com/schisandra/oss/infra/basic/service/impl/SchisandraOssMinioServiceImpl.java @@ -0,0 +1,126 @@ +package com.schisandra.oss.infra.basic.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; + +import com.schisandra.oss.infra.basic.dao.SchisandraOssMinioDao; +import com.schisandra.oss.infra.basic.entity.SchisandraOssMinio; +import com.schisandra.oss.infra.basic.service.SchisandraOssMinioService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * 表服务实现类 + * + * @author landaiqing + * @since 2024-05-14 19:47:04 + */ +@Service("SchisandraOssMinioService") +public class SchisandraOssMinioServiceImpl implements SchisandraOssMinioService { + + @Resource + private SchisandraOssMinioDao schisandraOssMinioDao; + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + @Override + public SchisandraOssMinio queryById(Long id) { + return this.schisandraOssMinioDao.selectById(id); + } + + /** + * 新增数据 + * + * @param schisandraOssMinio 实例对象 + * @return 实例对象 + */ + @Override + public int insert(SchisandraOssMinio schisandraOssMinio) { + return this.schisandraOssMinioDao.insert(schisandraOssMinio); + } + + /** + * 修改数据 + * + * @param schisandraOssMinio 实例对象 + * @return 实例对象 + */ + @Override + public int update(SchisandraOssMinio schisandraOssMinio) { + return this.schisandraOssMinioDao.updateById(schisandraOssMinio); + } + + /** + * 通过主键删除数据 + * + * @param id 主键 + * @return 是否成功 + */ + @Override + public boolean deleteById(Long id) { + return this.schisandraOssMinioDao.deleteById(id) > 0; + } + + /** + * 条件查询 + * + * @param schisandraOssMinio 条件 + * @return 实例对象 + */ + @Override + public SchisandraOssMinio queryByCondition(SchisandraOssMinio schisandraOssMinio) { + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(Objects.nonNull(schisandraOssMinio.getId()), SchisandraOssMinio::getId, schisandraOssMinio.getId()) + .eq(Objects.nonNull(schisandraOssMinio.getUserId()), SchisandraOssMinio::getUserId, schisandraOssMinio.getUserId()) + .eq(Objects.nonNull(schisandraOssMinio.getEndpoint()), SchisandraOssMinio::getEndpoint, schisandraOssMinio.getEndpoint()) + .eq(Objects.nonNull(schisandraOssMinio.getAccessKey()), SchisandraOssMinio::getAccessKey, schisandraOssMinio.getAccessKey()) + .eq(Objects.nonNull(schisandraOssMinio.getSecretKey()), SchisandraOssMinio::getSecretKey, schisandraOssMinio.getSecretKey()) + .eq(Objects.nonNull(schisandraOssMinio.getBucketName()), SchisandraOssMinio::getBucketName, schisandraOssMinio.getBucketName()) + .eq(Objects.nonNull(schisandraOssMinio.getPort()), SchisandraOssMinio::getPort, schisandraOssMinio.getPort()) + .eq(Objects.nonNull(schisandraOssMinio.getBasePath()), SchisandraOssMinio::getBasePath, schisandraOssMinio.getBasePath()) + .eq(Objects.nonNull(schisandraOssMinio.getFileHost()), SchisandraOssMinio::getFileHost, schisandraOssMinio.getFileHost()) + .eq(Objects.nonNull(schisandraOssMinio.getDownloadHost()), SchisandraOssMinio::getDownloadHost, schisandraOssMinio.getDownloadHost()) + .eq(Objects.nonNull(schisandraOssMinio.getUploadHost()), SchisandraOssMinio::getUploadHost, schisandraOssMinio.getUploadHost()) + .eq(Objects.nonNull(schisandraOssMinio.getCreateBucket()), SchisandraOssMinio::getCreateBucket, schisandraOssMinio.getCreateBucket()) + .eq(Objects.nonNull(schisandraOssMinio.getCheckBucket()), SchisandraOssMinio::getCheckBucket, schisandraOssMinio.getCheckBucket()) + .eq(Objects.nonNull(schisandraOssMinio.getConnectTimeout()), SchisandraOssMinio::getConnectTimeout, schisandraOssMinio.getConnectTimeout()) + .eq(Objects.nonNull(schisandraOssMinio.getWriteTimeout()), SchisandraOssMinio::getWriteTimeout, schisandraOssMinio.getWriteTimeout()) + .eq(Objects.nonNull(schisandraOssMinio.getReadTimeout()), SchisandraOssMinio::getReadTimeout, schisandraOssMinio.getReadTimeout()) + .eq(Objects.nonNull(schisandraOssMinio.getCallTimeout()), SchisandraOssMinio::getCallTimeout, schisandraOssMinio.getCallTimeout()) + .eq(Objects.nonNull(schisandraOssMinio.getFollowRedirects()), SchisandraOssMinio::getFollowRedirects, schisandraOssMinio.getFollowRedirects()) + .eq(Objects.nonNull(schisandraOssMinio.getFollowSslRedirects()), SchisandraOssMinio::getFollowSslRedirects, schisandraOssMinio.getFollowSslRedirects()) + .eq(Objects.nonNull(schisandraOssMinio.getRetryOnConnectionFailure()), SchisandraOssMinio::getRetryOnConnectionFailure, schisandraOssMinio.getRetryOnConnectionFailure()) + .eq(Objects.nonNull(schisandraOssMinio.getPingInterval()), SchisandraOssMinio::getPingInterval, schisandraOssMinio.getPingInterval()) + .eq(Objects.nonNull(schisandraOssMinio.getPartSize()), SchisandraOssMinio::getPartSize, schisandraOssMinio.getPartSize()) + .eq(Objects.nonNull(schisandraOssMinio.getTaskNum()), SchisandraOssMinio::getTaskNum, schisandraOssMinio.getTaskNum()) + .eq(Objects.nonNull(schisandraOssMinio.getImgSize()), SchisandraOssMinio::getImgSize, schisandraOssMinio.getImgSize()) + .eq(Objects.nonNull(schisandraOssMinio.getFileSize()), SchisandraOssMinio::getFileSize, schisandraOssMinio.getFileSize()) + .eq(Objects.nonNull(schisandraOssMinio.getExtraJson()), SchisandraOssMinio::getExtraJson, schisandraOssMinio.getExtraJson()) + .eq(Objects.nonNull(schisandraOssMinio.getStatus()), SchisandraOssMinio::getStatus, schisandraOssMinio.getStatus()) + .eq(Objects.nonNull(schisandraOssMinio.getCreatedBy()), SchisandraOssMinio::getCreatedBy, schisandraOssMinio.getCreatedBy()) + .eq(Objects.nonNull(schisandraOssMinio.getCreatedTime()), SchisandraOssMinio::getCreatedTime, schisandraOssMinio.getCreatedTime()) + .eq(Objects.nonNull(schisandraOssMinio.getUpdateTime()), SchisandraOssMinio::getUpdateTime, schisandraOssMinio.getUpdateTime()) + .eq(Objects.nonNull(schisandraOssMinio.getUpdateBy()), SchisandraOssMinio::getUpdateBy, schisandraOssMinio.getUpdateBy()) + .eq(Objects.nonNull(schisandraOssMinio.getIsDeleted()), SchisandraOssMinio::getIsDeleted, schisandraOssMinio.getIsDeleted()) + .eq(Objects.nonNull(schisandraOssMinio.getOpenAdvancedSetup()), SchisandraOssMinio::getOpenAdvancedSetup, schisandraOssMinio.getOpenAdvancedSetup()); + return schisandraOssMinioDao.selectOne(queryWrapper); + + } + + @Override + public SchisandraOssMinio getMinioConfig(Long userId) { + return schisandraOssMinioDao.selectOne(new QueryWrapper + () + .eq("user_id", userId) + .eq("is_deleted", 0)); + } + +} diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssAliDao.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssAliDao.xml new file mode 100644 index 0000000..c533d24 --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssAliDao.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssConfigDao.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssConfigDao.xml deleted file mode 100644 index f026e5a..0000000 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssConfigDao.xml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssMinioDao.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssMinioDao.xml new file mode 100644 index 0000000..814321b --- /dev/null +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-infra/src/main/resources/mapper/SchisandraOssMinioDao.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-starter/pom.xml b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-starter/pom.xml index 343266a..561901d 100644 --- a/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-starter/pom.xml +++ b/schisandra-cloud-storage-oss/schisandra-cloud-storage-oss-starter/pom.xml @@ -39,6 +39,14 @@ spring-cloud-starter-bootstrap + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + com.schisandra diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/controller/SchisandraSysLogController.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/controller/SchisandraSysLogController.java new file mode 100644 index 0000000..1042cfe --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/controller/SchisandraSysLogController.java @@ -0,0 +1,149 @@ +package com.schisandra.system.application.controller; + +import com.alibaba.fastjson.JSON; +import com.google.common.base.Preconditions; + +import com.schisandra.system.application.convert.SchisandraSysLogDTOConverter; +import com.schisandra.system.application.dto.SchisandraSysLogDTO; +import com.schisandra.system.common.entity.Result; +import com.schisandra.system.domain.entity.SchisandraSysLogBO; +import com.schisandra.system.domain.service.SchisandraSysLogDomainService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * controller + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@RestController +@RequestMapping("/system/log/") +@Slf4j +public class SchisandraSysLogController { + + @Resource + private SchisandraSysLogDomainService schisandraSysLogDomainService; + + /** + * 新增 + */ + @RequestMapping("add") + public Result add(@RequestBody SchisandraSysLogDTO schisandraSysLogDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraSysLogController.add.dto:{}", JSON.toJSONString(schisandraSysLogDTO)); + } + Preconditions.checkNotNull(schisandraSysLogDTO.getId(), "编号不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getLogType(), "日志类型不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getLogTitle(), "日志标题不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateBy(), "创建者不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateByName(), "用户名称不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateDate(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestUri(), "请求URI不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestMethod(), "操作方式不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestParams(), "操作提交的数据不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getDiffModifyData(), "新旧数据比较结果不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBizKey(), "业务主键不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBizType(), "业务类型不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRemoteAddr(), "操作IP地址不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getServerAddr(), "请求服务器地址不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getIsException(), "是否异常不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getExceptionInfo(), "异常信息不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getUserAgent(), "用户代理不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getDeviceName(), "设备名称/操作系统不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBrowserName(), "浏览器名称不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getExecuteTime(), "执行时间不能为空"); + SchisandraSysLogBO SchisandraSysLogBO = SchisandraSysLogDTOConverter.INSTANCE.convertDTOToBO(schisandraSysLogDTO); + return Result.ok(schisandraSysLogDomainService.add(SchisandraSysLogBO)); + } catch (Exception e) { + log.error("SchisandraSysLogController.register.error:{}", e.getMessage(), e); + return Result.fail("新增失败"); + } + + } + + /** + * 修改 + */ + @RequestMapping("update") + public Result update(@RequestBody SchisandraSysLogDTO schisandraSysLogDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraSysLogController.update.dto:{}", JSON.toJSONString(schisandraSysLogDTO)); + } + Preconditions.checkNotNull(schisandraSysLogDTO.getId(), "编号不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getLogType(), "日志类型不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getLogTitle(), "日志标题不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateBy(), "创建者不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateByName(), "用户名称不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateDate(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestUri(), "请求URI不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestMethod(), "操作方式不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestParams(), "操作提交的数据不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getDiffModifyData(), "新旧数据比较结果不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBizKey(), "业务主键不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBizType(), "业务类型不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRemoteAddr(), "操作IP地址不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getServerAddr(), "请求服务器地址不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getIsException(), "是否异常不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getExceptionInfo(), "异常信息不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getUserAgent(), "用户代理不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getDeviceName(), "设备名称/操作系统不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBrowserName(), "浏览器名称不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getExecuteTime(), "执行时间不能为空"); + SchisandraSysLogBO schisandraSysLogBO = SchisandraSysLogDTOConverter.INSTANCE.convertDTOToBO(schisandraSysLogDTO); + return Result.ok(schisandraSysLogDomainService.update(schisandraSysLogBO)); + } catch (Exception e) { + log.error("SchisandraSysLogController.update.error:{}", e.getMessage(), e); + return Result.fail("更新信息失败"); + } + + } + + /** + * 删除 + */ + @RequestMapping("delete") + public Result delete(@RequestBody SchisandraSysLogDTO schisandraSysLogDTO) { + + try { + if (log.isInfoEnabled()) { + log.info("SchisandraSysLogController.delete.dto:{}", JSON.toJSONString(schisandraSysLogDTO)); + } + Preconditions.checkNotNull(schisandraSysLogDTO.getId(), "编号不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getLogType(), "日志类型不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getLogTitle(), "日志标题不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateBy(), "创建者不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateByName(), "用户名称不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getCreateDate(), "创建时间不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestUri(), "请求URI不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestMethod(), "操作方式不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRequestParams(), "操作提交的数据不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getDiffModifyData(), "新旧数据比较结果不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBizKey(), "业务主键不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBizType(), "业务类型不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getRemoteAddr(), "操作IP地址不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getServerAddr(), "请求服务器地址不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getIsException(), "是否异常不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getExceptionInfo(), "异常信息不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getUserAgent(), "用户代理不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getDeviceName(), "设备名称/操作系统不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getBrowserName(), "浏览器名称不能为空"); + Preconditions.checkNotNull(schisandraSysLogDTO.getExecuteTime(), "执行时间不能为空"); + SchisandraSysLogBO schisandraSysLogBO = SchisandraSysLogDTOConverter.INSTANCE.convertDTOToBO(schisandraSysLogDTO); + return Result.ok(schisandraSysLogDomainService.delete(schisandraSysLogBO)); + } catch (Exception e) { + log.error("SchisandraSysLogController.delete.error:{}", e.getMessage(), e); + return Result.fail("删除信息失败"); + } + + } + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/convert/SchisandraSysLogDTOConverter.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/convert/SchisandraSysLogDTOConverter.java new file mode 100644 index 0000000..065b679 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/convert/SchisandraSysLogDTOConverter.java @@ -0,0 +1,22 @@ +package com.schisandra.system.application.convert; + + +import com.schisandra.system.application.dto.SchisandraSysLogDTO; +import com.schisandra.system.domain.entity.SchisandraSysLogBO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * dto转换器 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Mapper +public interface SchisandraSysLogDTOConverter { + + SchisandraSysLogDTOConverter INSTANCE = Mappers.getMapper(SchisandraSysLogDTOConverter.class); + + SchisandraSysLogBO convertDTOToBO(SchisandraSysLogDTO schisandraSysLogDTO); + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/dto/SchisandraSysLogDTO.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/dto/SchisandraSysLogDTO.java new file mode 100644 index 0000000..182726b --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-application/schisandra-cloud-storage-system-application-controller/src/main/java/com/schisandra/system/application/dto/SchisandraSysLogDTO.java @@ -0,0 +1,119 @@ +package com.schisandra.system.application.dto; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * dto + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Data +public class SchisandraSysLogDTO implements Serializable { + + /** + * 编号 + */ + private Long id; + + /** + * 日志类型 + */ + private String logType; + + /** + * 日志标题 + */ + private String logTitle; + + /** + * 创建者 + */ + private String createBy; + + /** + * 用户名称 + */ + private String createByName; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 请求URI + */ + private String requestUri; + + /** + * 操作方式 + */ + private String requestMethod; + + /** + * 操作提交的数据 + */ + private String requestParams; + + /** + * 新旧数据比较结果 + */ + private String diffModifyData; + + /** + * 业务主键 + */ + private String bizKey; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 操作IP地址 + */ + private String remoteAddr; + + /** + * 请求服务器地址 + */ + private String serverAddr; + + /** + * 是否异常 + */ + private String isException; + + /** + * 异常信息 + */ + private String exceptionInfo; + + /** + * 用户代理 + */ + private String userAgent; + + /** + * 设备名称/操作系统 + */ + private String deviceName; + + /** + * 浏览器名称 + */ + private String browserName; + + /** + * 执行时间 + */ + private BigDecimal executeTime; + +} + diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/convert/SchisandraSysLogBOConverter.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/convert/SchisandraSysLogBOConverter.java new file mode 100644 index 0000000..f2658f0 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/convert/SchisandraSysLogBOConverter.java @@ -0,0 +1,22 @@ +package com.schisandra.system.domain.convert; + + +import com.schisandra.system.domain.entity.SchisandraSysLogBO; +import com.schisandra.system.infra.basic.entity.SchisandraSysLog; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * bo转换器 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Mapper +public interface SchisandraSysLogBOConverter { + + SchisandraSysLogBOConverter INSTANCE = Mappers.getMapper(SchisandraSysLogBOConverter.class); + + SchisandraSysLog convertBOToEntity(SchisandraSysLogBO schisandraSysLogBO); + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/entity/SchisandraSysLogBO.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/entity/SchisandraSysLogBO.java new file mode 100644 index 0000000..05b873f --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/entity/SchisandraSysLogBO.java @@ -0,0 +1,119 @@ +package com.schisandra.system.domain.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * bo + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Data +public class SchisandraSysLogBO implements Serializable { + + /** + * 编号 + */ + private Long id; + + /** + * 日志类型 + */ + private String logType; + + /** + * 日志标题 + */ + private String logTitle; + + /** + * 创建者 + */ + private String createBy; + + /** + * 用户名称 + */ + private String createByName; + + /** + * 创建时间 + */ + private Date createDate; + + /** + * 请求URI + */ + private String requestUri; + + /** + * 操作方式 + */ + private String requestMethod; + + /** + * 操作提交的数据 + */ + private String requestParams; + + /** + * 新旧数据比较结果 + */ + private String diffModifyData; + + /** + * 业务主键 + */ + private String bizKey; + + /** + * 业务类型 + */ + private String bizType; + + /** + * 操作IP地址 + */ + private String remoteAddr; + + /** + * 请求服务器地址 + */ + private String serverAddr; + + /** + * 是否异常 + */ + private String isException; + + /** + * 异常信息 + */ + private String exceptionInfo; + + /** + * 用户代理 + */ + private String userAgent; + + /** + * 设备名称/操作系统 + */ + private String deviceName; + + /** + * 浏览器名称 + */ + private String browserName; + + /** + * 执行时间 + */ + private BigDecimal executeTime; + +} + diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/service/SchisandraSysLogDomainService.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/service/SchisandraSysLogDomainService.java new file mode 100644 index 0000000..c88e436 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/service/SchisandraSysLogDomainService.java @@ -0,0 +1,28 @@ +package com.schisandra.system.domain.service; + +import com.schisandra.system.domain.entity.SchisandraSysLogBO; + +/** + * 领域service + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +public interface SchisandraSysLogDomainService { + + /** + * 添加 信息 + */ + Boolean add(SchisandraSysLogBO schisandraSysLogBO); + + /** + * 更新 信息 + */ + Boolean update(SchisandraSysLogBO schisandraSysLogBO); + + /** + * 删除 信息 + */ + Boolean delete(SchisandraSysLogBO schisandraSysLogBO); + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/service/impl/SchisandraSysLogDomainServiceImpl.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/service/impl/SchisandraSysLogDomainServiceImpl.java new file mode 100644 index 0000000..af94b0a --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-domain/src/main/java/com/schisandra/system/domain/service/impl/SchisandraSysLogDomainServiceImpl.java @@ -0,0 +1,47 @@ +package com.schisandra.system.domain.service.impl; + + +import com.schisandra.system.common.enums.IsDeletedFlagEnum; +import com.schisandra.system.domain.convert.SchisandraSysLogBOConverter; +import com.schisandra.system.domain.entity.SchisandraSysLogBO; +import com.schisandra.system.domain.service.SchisandraSysLogDomainService; +import com.schisandra.system.infra.basic.entity.SchisandraSysLog; +import com.schisandra.system.infra.basic.service.SchisandraSysLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 领域service实现了 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Service +@Slf4j +public class SchisandraSysLogDomainServiceImpl implements SchisandraSysLogDomainService { + + @Resource + private SchisandraSysLogService schisandraSysLogService; + + @Override + public Boolean add(SchisandraSysLogBO schisandraSysLogBO) { + SchisandraSysLog schisandraSysLog = SchisandraSysLogBOConverter.INSTANCE.convertBOToEntity(schisandraSysLogBO); + return schisandraSysLogService.insert(schisandraSysLog) > 0; + } + + @Override + public Boolean update(SchisandraSysLogBO schisandraSysLogBO) { + SchisandraSysLog schisandraSysLog = SchisandraSysLogBOConverter.INSTANCE.convertBOToEntity(schisandraSysLogBO); + return schisandraSysLogService.update(schisandraSysLog) > 0; + } + + @Override + public Boolean delete(SchisandraSysLogBO schisandraSysLogBO) { + SchisandraSysLog schisandraSysLog = new SchisandraSysLog(); + schisandraSysLog.setId(schisandraSysLogBO.getId()); + return schisandraSysLogService.update(schisandraSysLog) > 0; + } + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/dao/SchisandraSysLogDao.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/dao/SchisandraSysLogDao.java new file mode 100644 index 0000000..bacceb4 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/dao/SchisandraSysLogDao.java @@ -0,0 +1,18 @@ +package com.schisandra.system.infra.basic.dao; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + import com.schisandra.system.infra.basic.entity.SchisandraSysLog; + import org.springframework.stereotype.Repository; + +/** + * 表数据库访问层 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Repository +public interface SchisandraSysLogDao extends BaseMapper { + +} + diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/entity/SchisandraSysLog.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/entity/SchisandraSysLog.java new file mode 100644 index 0000000..76bf630 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/entity/SchisandraSysLog.java @@ -0,0 +1,144 @@ +package com.schisandra.system.infra.basic.entity; + +import lombok.Data; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 实体类 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Data +@TableName("schisandra_sys_log") +public class SchisandraSysLog implements Serializable { + + /** + * 编号 + */ + @TableId(value = "`id`", type = IdType.AUTO) + private Long id; + + /** + * 日志类型 + */ + @TableField("`log_type`") + private String logType; + + /** + * 日志标题 + */ + @TableField("`log_title`") + private String logTitle; + + /** + * 创建者 + */ + @TableField("`create_by`") + private String createBy; + + /** + * 用户名称 + */ + @TableField("`create_by_name`") + private String createByName; + + /** + * 创建时间 + */ + @TableField("`create_date`") + private Date createDate; + + /** + * 请求URI + */ + @TableField("`request_uri`") + private String requestUri; + + /** + * 操作方式 + */ + @TableField("`request_method`") + private String requestMethod; + + /** + * 操作提交的数据 + */ + @TableField("`request_params`") + private String requestParams; + + /** + * 新旧数据比较结果 + */ + @TableField("`diff_modify_data`") + private String diffModifyData; + + /** + * 业务主键 + */ + @TableField("`biz_key`") + private String bizKey; + + /** + * 业务类型 + */ + @TableField("`biz_type`") + private String bizType; + + /** + * 操作IP地址 + */ + @TableField("`remote_addr`") + private String remoteAddr; + + /** + * 请求服务器地址 + */ + @TableField("`server_addr`") + private String serverAddr; + + /** + * 是否异常 + */ + @TableField("`is_exception`") + private String isException; + + /** + * 异常信息 + */ + @TableField("`exception_info`") + private String exceptionInfo; + + /** + * 用户代理 + */ + @TableField("`user_agent`") + private String userAgent; + + /** + * 设备名称/操作系统 + */ + @TableField("`device_name`") + private String deviceName; + + /** + * 浏览器名称 + */ + @TableField("`browser_name`") + private String browserName; + + /** + * 执行时间 + */ + @TableField("`execute_time`") + private BigDecimal executeTime; + +} + diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/service/SchisandraSysLogService.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/service/SchisandraSysLogService.java new file mode 100644 index 0000000..10b7db2 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/service/SchisandraSysLogService.java @@ -0,0 +1,50 @@ +package com.schisandra.system.infra.basic.service; + +import com.schisandra.system.infra.basic.entity.SchisandraSysLog; + +/** + * 表服务接口 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +public interface SchisandraSysLogService { + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + SchisandraSysLog queryById(Long id); + + /** + * 新增数据 + * + * @param schisandraSysLog 实例对象 + * @return 实例对象 + */ + int insert(SchisandraSysLog schisandraSysLog); + + /** + * 修改数据 + * + * @param schisandraSysLog 实例对象 + * @return 实例对象 + */ + int update(SchisandraSysLog schisandraSysLog); + + /** + * 通过主键删除数据 + * + * @param id 主键 + * @return 是否成功 + */ + boolean deleteById(Long id); + + /** + * 根据条件查询角色 + */ + SchisandraSysLog queryByCondition(SchisandraSysLog schisandraSysLog); + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/service/impl/SchisandraSysLogServiceImpl.java b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/service/impl/SchisandraSysLogServiceImpl.java new file mode 100644 index 0000000..5382e99 --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/java/com/schisandra/system/infra/basic/service/impl/SchisandraSysLogServiceImpl.java @@ -0,0 +1,105 @@ +package com.schisandra.system.infra.basic.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.schisandra.system.infra.basic.dao.SchisandraSysLogDao; +import com.schisandra.system.infra.basic.entity.SchisandraSysLog; +import com.schisandra.system.infra.basic.service.SchisandraSysLogService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * 表服务实现类 + * + * @author landaiqing + * @since 2024-05-12 14:21:42 + */ +@Service("SchisandraSysLogService") +public class SchisandraSysLogServiceImpl implements SchisandraSysLogService { + + @Resource + private SchisandraSysLogDao schisandraSysLogDao; + + /** + * 通过ID查询单条数据 + * + * @param id 主键 + * @return 实例对象 + */ + @Override + public SchisandraSysLog queryById(Long id) { + return this.schisandraSysLogDao.selectById(id); + } + + /** + * 新增数据 + * + * @param schisandraSysLog 实例对象 + * @return 实例对象 + */ + @Override + public int insert(SchisandraSysLog schisandraSysLog) { + return this.schisandraSysLogDao.insert(schisandraSysLog); + } + + /** + * 修改数据 + * + * @param schisandraSysLog 实例对象 + * @return 实例对象 + */ + @Override + public int update(SchisandraSysLog schisandraSysLog) { + return this.schisandraSysLogDao.updateById(schisandraSysLog); + } + + /** + * 通过主键删除数据 + * + * @param id 主键 + * @return 是否成功 + */ + @Override + public boolean deleteById(Long id) { + return this.schisandraSysLogDao.deleteById(id) > 0; + } + + /** + * 条件查询 + * + * @param schisandraSysLog 条件 + * @return 实例对象 + */ + @Override + public SchisandraSysLog queryByCondition(SchisandraSysLog schisandraSysLog) { + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() + .eq(Objects.nonNull(schisandraSysLog.getId()), SchisandraSysLog::getId, schisandraSysLog.getId()) + .eq(Objects.nonNull(schisandraSysLog.getLogType()), SchisandraSysLog::getLogType, schisandraSysLog.getLogType()) + .eq(Objects.nonNull(schisandraSysLog.getLogTitle()), SchisandraSysLog::getLogTitle, schisandraSysLog.getLogTitle()) + .eq(Objects.nonNull(schisandraSysLog.getCreateBy()), SchisandraSysLog::getCreateBy, schisandraSysLog.getCreateBy()) + .eq(Objects.nonNull(schisandraSysLog.getCreateByName()), SchisandraSysLog::getCreateByName, schisandraSysLog.getCreateByName()) + .eq(Objects.nonNull(schisandraSysLog.getCreateDate()), SchisandraSysLog::getCreateDate, schisandraSysLog.getCreateDate()) + .eq(Objects.nonNull(schisandraSysLog.getRequestUri()), SchisandraSysLog::getRequestUri, schisandraSysLog.getRequestUri()) + .eq(Objects.nonNull(schisandraSysLog.getRequestMethod()), SchisandraSysLog::getRequestMethod, schisandraSysLog.getRequestMethod()) + .eq(Objects.nonNull(schisandraSysLog.getRequestParams()), SchisandraSysLog::getRequestParams, schisandraSysLog.getRequestParams()) + .eq(Objects.nonNull(schisandraSysLog.getDiffModifyData()), SchisandraSysLog::getDiffModifyData, schisandraSysLog.getDiffModifyData()) + .eq(Objects.nonNull(schisandraSysLog.getBizKey()), SchisandraSysLog::getBizKey, schisandraSysLog.getBizKey()) + .eq(Objects.nonNull(schisandraSysLog.getBizType()), SchisandraSysLog::getBizType, schisandraSysLog.getBizType()) + .eq(Objects.nonNull(schisandraSysLog.getRemoteAddr()), SchisandraSysLog::getRemoteAddr, schisandraSysLog.getRemoteAddr()) + .eq(Objects.nonNull(schisandraSysLog.getServerAddr()), SchisandraSysLog::getServerAddr, schisandraSysLog.getServerAddr()) + .eq(Objects.nonNull(schisandraSysLog.getIsException()), SchisandraSysLog::getIsException, schisandraSysLog.getIsException()) + .eq(Objects.nonNull(schisandraSysLog.getExceptionInfo()), SchisandraSysLog::getExceptionInfo, schisandraSysLog.getExceptionInfo()) + .eq(Objects.nonNull(schisandraSysLog.getUserAgent()), SchisandraSysLog::getUserAgent, schisandraSysLog.getUserAgent()) + .eq(Objects.nonNull(schisandraSysLog.getDeviceName()), SchisandraSysLog::getDeviceName, schisandraSysLog.getDeviceName()) + .eq(Objects.nonNull(schisandraSysLog.getBrowserName()), SchisandraSysLog::getBrowserName, schisandraSysLog.getBrowserName()) + .eq(Objects.nonNull(schisandraSysLog.getExecuteTime()), SchisandraSysLog::getExecuteTime, schisandraSysLog.getExecuteTime()) + ; + return schisandraSysLogDao.selectOne(queryWrapper); + + } + +} diff --git a/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/resources/mapper/SchisandraSysLogDao.xml b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/resources/mapper/SchisandraSysLogDao.xml new file mode 100644 index 0000000..a47f69d --- /dev/null +++ b/schisandra-cloud-storage-system/schisandra-cloud-storage-system-infra/src/main/resources/mapper/SchisandraSysLogDao.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +