diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java index f798ca23..60fed2a4 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysOssConfigController.java @@ -92,7 +92,7 @@ public class SysOssConfigController extends BaseController { @Log(title = "云存储配置", businessType = BusinessType.DELETE) @DeleteMapping("/{ossConfigIds}") public AjaxResult remove(@NotEmpty(message = "主键不能为空") - @PathVariable Integer[] ossConfigIds) { + @PathVariable Long[] ossConfigIds) { return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true) ? 1 : 0); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java index 5b9da585..697e87f7 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java @@ -1,5 +1,10 @@ package com.ruoyi.oss.constant; +import com.ruoyi.oss.properties.CloudStorageProperties; + +import java.util.Arrays; +import java.util.List; + /** * 云存储常量 * @@ -7,14 +12,33 @@ package com.ruoyi.oss.constant; */ public class CloudConstant { + /** + * OSS模块KEY + */ + public static final String SYS_OSS_KEY = "sys_oss:"; + /** * 云存储配置KEY */ - public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloudStorageService"; + public static final String CLOUD_STORAGE_CONFIG_KEY = "CloudStorageConfig"; + + /** + * 缓存配置KEY + */ + public static final String CACHE_CONFIG_KEY = SYS_OSS_KEY + CLOUD_STORAGE_CONFIG_KEY; /** * 预览列表资源开关Key */ - public final static String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; + public static final String PEREVIEW_LIST_RESOURCE_KEY = "sys.oss.previewListResource"; + + /** + * 系统数据ids + */ + public static final List SYSTEM_DATA_IDS = Arrays.asList(1, 2, 3, 4); + + public static String getPropertiesName(String key) { + return key + CloudStorageProperties.class.getSimpleName(); + } } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java index 3191dc44..11a571c2 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/enumd/CloudServiceEnumd.java @@ -1,9 +1,10 @@ package com.ruoyi.oss.enumd; -import com.ruoyi.oss.service.impl.AliyunCloudStorageServiceImpl; -import com.ruoyi.oss.service.impl.MinioCloudStorageServiceImpl; -import com.ruoyi.oss.service.impl.QcloudCloudStorageServiceImpl; -import com.ruoyi.oss.service.impl.QiniuCloudStorageServiceImpl; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.oss.service.impl.AliyunCloudStorageStrategy; +import com.ruoyi.oss.service.impl.MinioCloudStorageStrategy; +import com.ruoyi.oss.service.impl.QcloudCloudStorageStrategy; +import com.ruoyi.oss.service.impl.QiniuCloudStorageStrategy; import lombok.AllArgsConstructor; import lombok.Getter; @@ -19,22 +20,22 @@ public enum CloudServiceEnumd { /** * 七牛云 */ - QINIU("qiniu", QiniuCloudStorageServiceImpl.class), + QINIU("qiniu", QiniuCloudStorageStrategy.class), /** * 阿里云 */ - ALIYUN("aliyun", AliyunCloudStorageServiceImpl.class), + ALIYUN("aliyun", AliyunCloudStorageStrategy.class), /** * 腾讯云 */ - QCLOUD("qcloud", QcloudCloudStorageServiceImpl.class), + QCLOUD("qcloud", QcloudCloudStorageStrategy.class), /** * minio */ - MINIO("minio", MinioCloudStorageServiceImpl.class); + MINIO("minio", MinioCloudStorageStrategy.class); private final String value; @@ -48,4 +49,15 @@ public enum CloudServiceEnumd { } return null; } + + public static String getServiceName(String value) { + for (CloudServiceEnumd clazz : values()) { + if (clazz.getValue().equals(value)) { + return StringUtils.uncapitalize(clazz.getServiceClass().getSimpleName()); + } + } + return null; + } + + } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java index 90e21ab2..ea64b27a 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/factory/OssFactory.java @@ -1,15 +1,16 @@ package com.ruoyi.oss.factory; import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Assert; -import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.oss.constant.CloudConstant; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.exception.OssException; -import com.ruoyi.oss.service.ICloudStorageService; +import com.ruoyi.oss.properties.CloudStorageProperties; +import com.ruoyi.oss.service.ICloudStorageStrategy; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -27,26 +28,37 @@ public class OssFactory { OssFactory.redisCache = SpringUtils.getBean(RedisCache.class); } - private static final Map SERVICES = new ConcurrentHashMap<>(); + private static final Map SERVICES = new ConcurrentHashMap<>(); - public static ICloudStorageService instance() { - String type = Convert.toStr(redisCache.getCacheObject(Constants.SYS_CONFIG_KEY + CloudConstant.CLOUD_STORAGE_CONFIG_KEY)); + public static ICloudStorageStrategy instance() { + String type = Convert.toStr(redisCache.getCacheObject(CloudConstant.CACHE_CONFIG_KEY)); if (StringUtils.isEmpty(type)) { throw new OssException("文件存储服务类型无法找到!"); } return instance(type); } - public static ICloudStorageService instance(String type) { - ICloudStorageService service = SERVICES.get(type); + public static ICloudStorageStrategy instance(String type) { + ICloudStorageStrategy service = SERVICES.get(type); if (service == null) { - service = (ICloudStorageService) SpringUtils.getBean(CloudServiceEnumd.getServiceClass(type)); + Object json = redisCache.getCacheObject(CloudConstant.SYS_OSS_KEY + type); + CloudStorageProperties properties = JsonUtils.parseObject(json.toString(), CloudStorageProperties.class); + String beanName = CloudServiceEnumd.getServiceName(type); + ICloudStorageStrategy bean = (ICloudStorageStrategy) ReflectUtils.newInstance(CloudServiceEnumd.getServiceClass(type), properties); + SpringUtils.registerBean(beanName, bean); + service = SpringUtils.getBean(beanName); + SERVICES.put(type, bean); } return service; } - public static void register(String type, ICloudStorageService iCloudStorageService) { - Assert.notNull(type, "type can't be null"); - SERVICES.put(type, iCloudStorageService); + public static void destroy(String type) { + ICloudStorageStrategy service = SERVICES.get(type); + if (service == null) { + return; + } + SpringUtils.unregisterBean(CloudServiceEnumd.getServiceName(type)); + SERVICES.remove(type); } + } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java index 64784a05..d1bafdec 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/properties/CloudStorageProperties.java @@ -1,9 +1,6 @@ package com.ruoyi.oss.properties; import lombok.Data; -import lombok.NoArgsConstructor; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; /** * OSS云存储 配置属性 @@ -11,177 +8,41 @@ import org.springframework.stereotype.Component; * @author Lion Li */ @Data -@Component -@ConfigurationProperties(prefix = "cloud-storage") public class CloudStorageProperties { - private Boolean previewListImage; - - private QiniuProperties qiniu; - - private AliyunProperties aliyun; - - private QcloudProperties qcloud; - - private MinioProperties minio; + /** + * 域名 + */ + private String endpoint; /** - * 阿里云 配置属性 - * - * @author Lion Li + * 前缀 */ - @Data - @NoArgsConstructor - public static class AliyunProperties { - - /** - * 阿里云绑定的域名 - */ - private String endpoint; - - /** - * 阿里云路径前缀 - */ - private String prefix; - - /** - * 阿里云AccessKeyId - */ - private String accessKeyId; - - /** - * 阿里云AccessKeySecret - */ - private String accessKeySecret; - - /** - * 阿里云BucketName - */ - private String bucketName; - - } + private String prefix; /** - * Minio 配置属性 - * - * @author Lion Li + * ACCESS_KEY */ - @Data - @NoArgsConstructor - public static class MinioProperties { - - /** - * minio域名 - */ - private String endpoint; - - /** - * minio ACCESS_KEY - */ - private String accessKey; - - /** - * minio SECRET_KEY - */ - private String secretKey; - - /** - * minio 存储空间名 - */ - private String bucketName; - - } + private String accessKey; /** - * 腾讯云COS 配置属性 - * - * @author Lion Li + * SECRET_KEY */ - @Data - @NoArgsConstructor - public static class QcloudProperties { - - /** - * 腾讯云绑定的域名 - */ - private String endpoint; - - /** - * 腾讯云路径前缀 - */ - private String prefix; - - /** - * 腾讯云SecretId - */ - private String secretId; - - /** - * 腾讯云SecretKey - */ - private String secretKey; - - /** - * 腾讯云BucketName - */ - private String bucketName; - - /** - * 七牛是否使用https - */ - private Boolean isHttps; - - /** - * 腾讯云COS所属地区 - */ - private String region; - - } + private String secretKey; /** - * 七牛云 配置属性 - * - * @author Lion Li + * 存储空间名 */ - @Data - @NoArgsConstructor - public static class QiniuProperties { + private String bucketName; - /** - * 七牛绑定的域名 - */ - private String domain; + /** + * 存储区域 + */ + private String region; - /** - * 七牛路径前缀 - */ - private String prefix; - - /** - * 七牛ACCESS_KEY - */ - private String accessKey; - - /** - * 七牛SECRET_KEY - */ - private String secretKey; - - /** - * 七牛存储空间名 - */ - private String bucketName; - - /** - * 七牛存储区域 - */ - private String region; - - /** - * 七牛是否使用https - */ - private Boolean isHttps; - - } + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java similarity index 95% rename from ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java rename to ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java index a23c1f5b..6f8ed85c 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageStrategy.java @@ -5,11 +5,11 @@ import com.ruoyi.oss.entity.UploadResult; import java.io.InputStream; /** - * 云存储服务接口 + * 云存储策略 * * @author Lion Li */ -public interface ICloudStorageService { +public interface ICloudStorageStrategy { void createBucket(); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageStrategy.java similarity index 79% rename from ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java rename to ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageStrategy.java index 9bd0013d..ec4dc374 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageStrategy.java @@ -5,18 +5,20 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.IdUtil; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; -import com.ruoyi.oss.service.ICloudStorageService; -import org.springframework.beans.factory.InitializingBean; +import com.ruoyi.oss.properties.CloudStorageProperties; +import com.ruoyi.oss.service.ICloudStorageStrategy; import java.io.InputStream; import java.util.Date; /** - * 云存储(支持七牛、阿里云、腾讯云、minio) + * 云存储策略(支持七牛、阿里云、腾讯云、minio) * * @author Lion Li */ -public abstract class AbstractCloudStorageService implements ICloudStorageService, InitializingBean { +public abstract class AbstractCloudStorageStrategy implements ICloudStorageStrategy { + + protected CloudStorageProperties properties; @Override public abstract void createBucket(); @@ -54,9 +56,6 @@ public abstract class AbstractCloudStorageService implements ICloudStorageServic @Override public abstract UploadResult uploadSuffix(InputStream inputStream, String suffix, String contentType); - @Override - public abstract void afterPropertiesSet() throws Exception; - @Override public abstract String getEndpointLink(); } diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageStrategy.java similarity index 77% rename from ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java rename to ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageStrategy.java index 2abde1ca..11c3476d 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageStrategy.java @@ -1,6 +1,5 @@ package com.ruoyi.oss.service.impl; -import com.ruoyi.common.utils.StringUtils; import com.aliyun.oss.ClientConfiguration; import com.aliyun.oss.OSSClient; import com.aliyun.oss.common.auth.DefaultCredentialProvider; @@ -8,42 +7,32 @@ import com.aliyun.oss.model.CannedAccessControlList; import com.aliyun.oss.model.CreateBucketRequest; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.exception.OssException; -import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.properties.CloudStorageProperties; -import com.ruoyi.oss.properties.CloudStorageProperties.AliyunProperties; -import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageStrategy; import java.io.ByteArrayInputStream; import java.io.InputStream; /** - * 阿里云存储 + * 阿里云存储策略 * * @author Lion Li */ -@Lazy -@Service -public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { +public class AliyunCloudStorageStrategy extends AbstractCloudStorageStrategy { private final OSSClient client; - private final AliyunProperties properties; - @Autowired - public AliyunCloudStorageServiceImpl(CloudStorageProperties properties) { - this.properties = properties.getAliyun(); + public AliyunCloudStorageStrategy(CloudStorageProperties cloudStorageProperties) { + properties = cloudStorageProperties; try { ClientConfiguration configuration = new ClientConfiguration(); DefaultCredentialProvider credentialProvider = new DefaultCredentialProvider( - this.properties.getAccessKeyId(), - this.properties.getAccessKeySecret()); - client = new OSSClient(this.properties.getEndpoint(), credentialProvider, configuration); + properties.getAccessKey(), properties.getSecretKey()); + client = new OSSClient(properties.getEndpoint(), credentialProvider, configuration); createBucket(); } catch (Exception e) { throw new IllegalArgumentException("阿里云存储配置错误! 请检查系统配置!"); @@ -107,11 +96,6 @@ public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService i return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); } - @Override - public void afterPropertiesSet() throws Exception { - OssFactory.register(getServiceType(), this); - } - @Override public String getEndpointLink() { String endpoint = properties.getEndpoint(); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageStrategy.java similarity index 86% rename from ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java rename to ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageStrategy.java index 375307bc..9edb421a 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageStrategy.java @@ -5,39 +5,29 @@ import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.enumd.PolicyType; import com.ruoyi.oss.exception.OssException; -import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.properties.CloudStorageProperties; -import com.ruoyi.oss.properties.CloudStorageProperties.MinioProperties; -import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageStrategy; import io.minio.*; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; import java.io.ByteArrayInputStream; import java.io.InputStream; /** - * minio存储 + * minio存储策略 * * @author Lion Li */ -@Lazy -@Service -public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { +public class MinioCloudStorageStrategy extends AbstractCloudStorageStrategy { private final MinioClient minioClient; - private final MinioProperties properties; - @Autowired - public MinioCloudStorageServiceImpl(CloudStorageProperties properties) { - this.properties = properties.getMinio(); + public MinioCloudStorageStrategy(CloudStorageProperties cloudStorageProperties) { + properties = cloudStorageProperties; try { minioClient = MinioClient.builder() - .endpoint(this.properties.getEndpoint()) - .credentials(this.properties.getAccessKey(), this.properties.getSecretKey()) + .endpoint(properties.getEndpoint()) + .credentials(properties.getAccessKey(), properties.getSecretKey()) .build(); createBucket(); } catch (Exception e) { @@ -112,11 +102,6 @@ public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService im return upload(inputStream, getPath("", suffix), contentType); } - @Override - public void afterPropertiesSet() throws Exception { - OssFactory.register(getServiceType(), this); - } - @Override public String getEndpointLink() { return properties.getEndpoint() + "/" + properties.getBucketName(); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageStrategy.java similarity index 78% rename from ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java rename to ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageStrategy.java index 523dff6f..c30dcbda 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageStrategy.java @@ -1,6 +1,5 @@ package com.ruoyi.oss.service.impl; -import com.ruoyi.common.utils.StringUtils; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; @@ -8,45 +7,35 @@ import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.http.HttpProtocol; import com.qcloud.cos.model.*; import com.qcloud.cos.region.Region; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.exception.OssException; -import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.properties.CloudStorageProperties; -import com.ruoyi.oss.properties.CloudStorageProperties.QcloudProperties; -import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageStrategy; import java.io.ByteArrayInputStream; import java.io.InputStream; /** - * 腾讯云存储 + * 腾讯云存储策略 * * @author Lion Li */ -@Lazy -@Service -public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { +public class QcloudCloudStorageStrategy extends AbstractCloudStorageStrategy { private final COSClient client; - private final QcloudProperties properties; - @Autowired - public QcloudCloudStorageServiceImpl(CloudStorageProperties properties) { - this.properties = properties.getQcloud(); + public QcloudCloudStorageStrategy(CloudStorageProperties cloudStorageProperties) { + properties = cloudStorageProperties; try { COSCredentials credentials = new BasicCOSCredentials( - this.properties.getSecretId(), - this.properties.getSecretKey()); + properties.getAccessKey(), properties.getSecretKey()); // 初始化客户端配置 ClientConfig clientConfig = new ClientConfig(); // 设置bucket所在的区域,华南:gz 华北:tj 华东:sh - clientConfig.setRegion(new Region(this.properties.getRegion())); - if (this.properties.getIsHttps()) { + clientConfig.setRegion(new Region(properties.getRegion())); + if ("Y".equals(properties.getIsHttps())) { clientConfig.setHttpProtocol(HttpProtocol.https); } else { clientConfig.setHttpProtocol(HttpProtocol.http); @@ -115,11 +104,6 @@ public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService i return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); } - @Override - public void afterPropertiesSet() throws Exception { - OssFactory.register(getServiceType(),this); - } - @Override public String getEndpointLink() { String endpoint = properties.getEndpoint(); diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageStrategy.java similarity index 70% rename from ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java rename to ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageStrategy.java index f7b4d4e2..ef225133 100644 --- a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageStrategy.java @@ -10,51 +10,37 @@ import com.qiniu.util.Auth; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.enumd.CloudServiceEnumd; import com.ruoyi.oss.exception.OssException; -import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.oss.properties.CloudStorageProperties; -import com.ruoyi.oss.properties.CloudStorageProperties.QiniuProperties; -import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageStrategy; import java.io.InputStream; /** - * 七牛云存储 + * 七牛云存储策略 * * @author Lion Li */ -@Lazy -@Service -public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService implements InitializingBean { +public class QiniuCloudStorageStrategy extends AbstractCloudStorageStrategy { private final UploadManager uploadManager; private final BucketManager bucketManager; private final String token; - private final QiniuProperties properties; - @Autowired - public QiniuCloudStorageServiceImpl(CloudStorageProperties properties) { - this.properties = properties.getQiniu(); + public QiniuCloudStorageStrategy(CloudStorageProperties cloudStorageProperties) { + properties = cloudStorageProperties; try { - Configuration config = new Configuration(getRegion(this.properties.getRegion())); + Configuration config = new Configuration(getRegion(properties.getRegion())); // https设置 config.useHttpsDomains = false; - if (this.properties.getIsHttps() != null) { - config.useHttpsDomains = this.properties.getIsHttps(); - } + config.useHttpsDomains = "Y".equals(properties.getIsHttps()); uploadManager = new UploadManager(config); - Auth auth = Auth.create( - this.properties.getAccessKey(), - this.properties.getSecretKey()); - String bucketName = this.properties.getBucketName(); + Auth auth = Auth.create(properties.getAccessKey(), properties.getSecretKey()); + String bucketName = properties.getBucketName(); token = auth.uploadToken(bucketName); bucketManager = new BucketManager(auth, config); if (!ArrayUtil.contains(bucketManager.buckets(), bucketName)) { - bucketManager.createBucket(bucketName, this.properties.getRegion()); + bucketManager.createBucket(bucketName, properties.getRegion()); } } catch (Exception e) { throw new IllegalArgumentException("七牛云存储配置错误! 请检查系统配置!"); @@ -115,14 +101,9 @@ public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService im return upload(inputStream, getPath(properties.getPrefix(), suffix), contentType); } - @Override - public void afterPropertiesSet() throws Exception { - OssFactory.register(getServiceType(),this); - } - @Override public String getEndpointLink() { - return properties.getDomain(); + return properties.getEndpoint(); } private Region getRegion(String region) { diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java index 2de440f7..f1ece65c 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysOssConfigService.java @@ -48,7 +48,7 @@ public interface ISysOssConfigService extends IServicePlus ids, Boolean isValid); + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); /** * 启用停用状态 diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java index 95f08696..49bf1fab 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssConfigServiceImpl.java @@ -2,7 +2,6 @@ package com.ruoyi.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -10,23 +9,26 @@ import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.core.mybatisplus.core.ServicePlusImpl; import com.ruoyi.common.core.page.PagePlus; import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.JsonUtils; import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.constant.CloudConstant; -import com.ruoyi.system.domain.SysConfig; +import com.ruoyi.oss.factory.OssFactory; import com.ruoyi.system.domain.SysOssConfig; import com.ruoyi.system.domain.bo.SysOssConfigBo; import com.ruoyi.system.domain.vo.SysOssConfigVo; import com.ruoyi.system.mapper.SysOssConfigMapper; -import com.ruoyi.system.service.ISysConfigService; import com.ruoyi.system.service.ISysOssConfigService; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import javax.annotation.PostConstruct; import java.util.Collection; +import java.util.List; /** * 云存储配置Service业务层处理 @@ -39,7 +41,22 @@ import java.util.Collection; @Service public class SysOssConfigServiceImpl extends ServicePlusImpl implements ISysOssConfigService { - private final ISysConfigService iSysConfigService; + private final RedisCache redisCache; + + /** + * 项目启动时,初始化参数到缓存,加载配置类 + */ + @PostConstruct + public void init() { + List list = list(); + for (SysOssConfig config : list) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + redisCache.setCacheObject(CloudConstant.CACHE_CONFIG_KEY, configKey); + } + redisCache.setCacheObject(getCacheKey(configKey), JsonUtils.toJsonString(config)); + } + } @Override public SysOssConfigVo queryById(Integer ossConfigId){ @@ -63,16 +80,29 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl ids, Boolean isValid) { + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if(isValid) { - if (CollUtil.containsAny(ids, CollUtil.newArrayList(1, 2, 3, 4))) { + if (CollUtil.containsAny(ids, CloudConstant.SYSTEM_DATA_IDS)) { throw new CustomException("系统内置, 不可删除!"); } } - return removeByIds(ids); + boolean flag = removeByIds(ids); + if (flag) { + for (Long configId : ids) { + SysOssConfig config = getById(configId); + OssFactory.destroy(config.getConfigKey()); + redisCache.deleteObject(getCacheKey(config.getConfigKey())); + } + } + return flag; } /** @@ -115,18 +153,23 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl() - .eq(SysConfig::getConfigKey, CloudConstant.CLOUD_STORAGE_CONFIG_KEY)); - if(ObjectUtil.isNotNull(sysConfig)){ - sysConfig.setConfigValue(bo.getConfigKey()); - iSysConfigService.updateConfig(sysConfig); - } else { - throw new CustomException("缺少'云存储配置KEY'参数!"); - } SysOssConfig sysOssConfig = BeanUtil.toBean(bo, SysOssConfig.class); - baseMapper.update(null, new LambdaUpdateWrapper() + int row = baseMapper.update(null, new LambdaUpdateWrapper() .set(SysOssConfig::getStatus, "1")); - return baseMapper.updateById(sysOssConfig); + row += baseMapper.updateById(sysOssConfig); + if (row > 0) { + redisCache.setCacheObject(CloudConstant.CACHE_CONFIG_KEY, sysOssConfig.getConfigKey()); + } + return row; } + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + private String getCacheKey(String configKey) { + return CloudConstant.SYS_OSS_KEY + configKey; + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java index 771834aa..28f0f167 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -10,7 +10,7 @@ import com.ruoyi.common.utils.PageUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.oss.entity.UploadResult; import com.ruoyi.oss.factory.OssFactory; -import com.ruoyi.oss.service.ICloudStorageService; +import com.ruoyi.oss.service.ICloudStorageStrategy; import com.ruoyi.system.domain.SysOss; import com.ruoyi.system.domain.bo.SysOssBo; import com.ruoyi.system.domain.vo.SysOssVo; @@ -56,7 +56,7 @@ public class SysOssServiceImpl extends ServicePlusImpl list = listByIds(ids); for (SysOss sysOss : list) { - ICloudStorageService storage = OssFactory.instance(sysOss.getService()); + ICloudStorageStrategy storage = OssFactory.instance(sysOss.getService()); storage.delete(sysOss.getUrl()); } return removeByIds(ids); diff --git a/ruoyi-ui/src/views/system/oss/config.vue b/ruoyi-ui/src/views/system/oss/config.vue index 89580ecd..c6ea3a62 100644 --- a/ruoyi-ui/src/views/system/oss/config.vue +++ b/ruoyi-ui/src/views/system/oss/config.vue @@ -158,15 +158,6 @@ - - - {{dict.dictLabel}} - - diff --git a/sql/oss.sql b/sql/oss.sql index a86641e2..2ecfacf9 100644 --- a/sql/oss.sql +++ b/sql/oss.sql @@ -40,7 +40,6 @@ create table sys_oss_config ( primary key (oss_config_id) ) engine=innodb comment='云存储配置表'; -insert into sys_config values(10, 'OSS云存储服务商', 'sys.oss.cloudStorageService', 'minio', 'Y', 'admin', sysdate(), '', null, 'OSS云存储服务商(qiniu:七牛云, aliyun:阿里云, qcloud:腾讯云, minio: Minio)'); insert into sys_config values(11, 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 'admin', sysdate(), '', null, 'true:开启, false:关闭'); insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 'admin', sysdate(), '', null, '文件管理菜单');