update 重写 OSS 模块相关实现 支持动态配置(页面配置)

This commit is contained in:
疯狂的狮子li 2021-08-13 21:09:24 +08:00
parent 6473d4d8be
commit cb13642e85
16 changed files with 204 additions and 329 deletions

View File

@ -92,7 +92,7 @@ public class SysOssConfigController extends BaseController {
@Log(title = "云存储配置", businessType = BusinessType.DELETE)
@DeleteMapping("/{ossConfigIds}")
public AjaxResult<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Integer[] ossConfigIds) {
@PathVariable Long[] ossConfigIds) {
return toAjax(iSysOssConfigService.deleteWithValidByIds(Arrays.asList(ossConfigIds), true) ? 1 : 0);
}

View File

@ -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<Integer> SYSTEM_DATA_IDS = Arrays.asList(1, 2, 3, 4);
public static String getPropertiesName(String key) {
return key + CloudStorageProperties.class.getSimpleName();
}
}

View File

@ -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;
}
}

View File

@ -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<String, ICloudStorageService> SERVICES = new ConcurrentHashMap<>();
private static final Map<String, ICloudStorageStrategy> 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);
}
}

View File

@ -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;
}
/**
* 是否httpsY=,N=
*/
private String isHttps;
}

View File

@ -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();

View File

@ -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();
}

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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) {

View File

@ -48,7 +48,7 @@ public interface ISysOssConfigService extends IServicePlus<SysOssConfig, SysOssC
* @param isValid 是否校验,true-删除前校验,false-不校验
* @return
*/
Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid);
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 启用停用状态

View File

@ -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<SysOssConfigMapper, SysOssConfig, SysOssConfigVo> implements ISysOssConfigService {
private final ISysConfigService iSysConfigService;
private final RedisCache redisCache;
/**
* 项目启动时初始化参数到缓存加载配置类
*/
@PostConstruct
public void init() {
List<SysOssConfig> 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<SysOssConfigMapper,
@Override
public Boolean insertByBo(SysOssConfigBo bo) {
SysOssConfig add = BeanUtil.toBean(bo, SysOssConfig.class);
validEntityBeforeSave(add);
return save(add);
SysOssConfig config = BeanUtil.toBean(bo, SysOssConfig.class);
validEntityBeforeSave(config);
boolean flag = save(config);
if (flag) {
redisCache.setCacheObject(
getCacheKey(config.getConfigKey()),
JsonUtils.toJsonString(config));
}
return flag;
}
@Override
public Boolean updateByBo(SysOssConfigBo bo) {
SysOssConfig update = BeanUtil.toBean(bo, SysOssConfig.class);
validEntityBeforeSave(update);
return updateById(update);
SysOssConfig config = BeanUtil.toBean(bo, SysOssConfig.class);
validEntityBeforeSave(config);
boolean flag = updateById(config);
if (flag) {
OssFactory.destroy(config.getConfigKey());
redisCache.setCacheObject(
getCacheKey(config.getConfigKey()),
JsonUtils.toJsonString(config));
}
return flag;
}
/**
@ -86,13 +116,21 @@ public class SysOssConfigServiceImpl extends ServicePlusImpl<SysOssConfigMapper,
}
@Override
public Boolean deleteWithValidByIds(Collection<Integer> ids, Boolean isValid) {
public Boolean deleteWithValidByIds(Collection<Long> 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<SysOssConfigMapper,
@Override
@Transactional(rollbackFor = Exception.class)
public int updateOssConfigStatus(SysOssConfigBo bo) {
SysConfig sysConfig = iSysConfigService.getOne(new LambdaQueryWrapper<SysConfig>()
.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<SysOssConfig>()
int row = baseMapper.update(null, new LambdaUpdateWrapper<SysOssConfig>()
.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;
}
}

View File

@ -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<SysOssMapper, SysOss, Sys
public SysOss upload(MultipartFile file) {
String originalfileName = file.getOriginalFilename();
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
ICloudStorageService storage = OssFactory.instance();
ICloudStorageStrategy storage = OssFactory.instance();
UploadResult uploadResult;
try {
uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());
@ -81,7 +81,7 @@ public class SysOssServiceImpl extends ServicePlusImpl<SysOssMapper, SysOss, Sys
}
List<SysOss> 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);

View File

@ -158,15 +158,6 @@
<el-form-item label="域" prop="region">
<el-input v-model="form.region" placeholder="请输入域" />
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in statusOptions"
:key="dict.dictValue"
:label="dict.dictValue"
>{{dict.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>

View File

@ -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, '文件管理菜单');