From 7e90d845987127718d34f27b4ebfdcafaa8e4e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Sat, 17 Jul 2021 20:44:27 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=A2=9E=E5=8A=A0=20OSS=20=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E5=AD=98=E5=82=A8=E6=A8=A1=E5=9D=97=20=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81(=E6=9C=AA=E5=AE=8C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 14 ++ ruoyi-admin/pom.xml | 5 + ruoyi-oss/pom.xml | 55 +++++++ .../ruoyi/oss/config/CloudStorageConfig.java | 69 +++++++++ .../com/ruoyi/oss/constant/CloudConstant.java | 43 ++++++ .../com/ruoyi/oss/exception/OssException.java | 16 +++ .../oss/service/ICloudStorageService.java | 58 ++++++++ .../AbstractCloudStorageService.java | 36 +++++ .../impl/AliyunCloudStorageServiceImpl.java | 62 ++++++++ .../impl/MinioCloudStorageServiceImpl.java | 66 +++++++++ .../impl/QcloudCloudStorageServiceImpl.java | 77 ++++++++++ .../impl/QiniuCloudStorageServiceImpl.java | 84 +++++++++++ .../java/com/ruoyi/oss/utils/DateUtils.java | 135 ++++++++++++++++++ .../system/controller/SysOssController.java | 58 ++++++++ .../java/com/ruoyi/system/domain/SysOss.java | 58 ++++++++ .../com/ruoyi/system/factory/OSSFactory.java | 31 ++++ .../com/ruoyi/system/mapper/SysOssMapper.java | 13 ++ .../ruoyi/system/service/ISysOssService.java | 24 ++++ .../service/impl/SysOssServiceImpl.java | 63 ++++++++ .../resources/mapper/system/SysOssMapper.xml | 21 +++ ruoyi-oss/src/main/resources/sql/oss.sql | 30 ++++ 21 files changed, 1018 insertions(+) create mode 100644 ruoyi-oss/pom.xml create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java create mode 100644 ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java create mode 100644 ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml create mode 100644 ruoyi-oss/src/main/resources/sql/oss.sql diff --git a/pom.xml b/pom.xml index 00becec1..b5907209 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,12 @@ 2.2.1 3.4.0 + + 7.8.0 + 3.13.0 + 5.6.47 + 8.2.2 + localhost http://${docker.registry.url}:2375 @@ -180,6 +186,13 @@ ${ruoyi-vue-plus.version} + + + com.ruoyi + ruoyi-oss + ${ruoyi-vue-plus.version} + + com.ruoyi @@ -199,6 +212,7 @@ ruoyi-common ruoyi-demo ruoyi-extend + ruoyi-oss pom diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 7ff67bef..5c895a8c 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -42,6 +42,11 @@ ruoyi-quartz + + com.ruoyi + ruoyi-oss + + com.ruoyi diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml new file mode 100644 index 00000000..ad8197c1 --- /dev/null +++ b/ruoyi-oss/pom.xml @@ -0,0 +1,55 @@ + + + + ruoyi-vue-plus + com.ruoyi + 2.5.1 + + 4.0.0 + + ruoyi-oss + + + OSS对象存储模块 + + + + + + + com.ruoyi + ruoyi-common + + + + com.qiniu + qiniu-java-sdk + ${qiniu.version} + + + com.aliyun.oss + aliyun-sdk-oss + ${aliyun.oss.version} + + + com.qcloud + cos_api + ${qcloud.cos.version} + + + org.slf4j + slf4j-log4j12 + + + + + io.minio + minio + ${minio.version} + + + + + diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java new file mode 100644 index 00000000..c0f7ee9d --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java @@ -0,0 +1,69 @@ +package com.ruoyi.oss.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +import java.io.Serializable; + +/** + * 云存储配置信息 + */ +@Data +@Configuration +@ConfigurationProperties(prefix = "cloud-storage") +public class CloudStorageConfig implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 类型 1:七牛 2:阿里云 3:腾讯云 4: minio + */ + private Integer type; + + /** + * 七牛绑定的域名 + */ + private String domain; + + /** + * 七牛路径前缀 + */ + private String prefix; + + /** + * 七牛ACCESS_KEY + */ + private String accessKey; + + /** + * 七牛SECRET_KEY + */ + private String secretKey; + + /** + * 七牛存储空间名 + */ + private String bucketName; + + /** + * 腾讯云AppId + */ + private Integer qcloudAppId; + + /** + * 腾讯云SecretId + */ + private String qcloudSecretId; + + /** + * 腾讯云SecretKey + */ + private String qcloudSecretKey; + + /** + * 腾讯云COS所属地区 + */ + private String qcloudRegion; + +} 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 new file mode 100644 index 00000000..ac4dff55 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java @@ -0,0 +1,43 @@ +package com.ruoyi.oss.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + + +public class CloudConstant { + + /** + * 云存储配置KEY + */ + public final static String CLOUD_STORAGE_CONFIG_KEY = "sys.oss.cloud-storage"; + + /** + * 云服务商 + */ + @Getter + @AllArgsConstructor + public enum CloudService { + + /** + * 七牛云 + */ + QINIU(1), + + /** + * 阿里云 + */ + ALIYUN(2), + + /** + * 腾讯云 + */ + QCLOUD(3), + + /** + * minio + */ + MINIO(4); + + private final int value; + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java new file mode 100644 index 00000000..48ab618a --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java @@ -0,0 +1,16 @@ +package com.ruoyi.oss.exception; + +/** + * OSS异常类 + * + * @author Lion Li + */ +public class OssException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public OssException(String msg) { + super(msg); + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java new file mode 100644 index 00000000..19d623ac --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java @@ -0,0 +1,58 @@ +package com.ruoyi.oss.service; + +import java.io.InputStream; + +public interface ICloudStorageService { + + /** + * 文件路径 + * + * @param prefix 前缀 + * @param suffix 后缀 + * @return 返回上传路径 + */ + String getPath(String prefix, String suffix); + + /** + * 文件上传 + * + * @param data 文件字节数组 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + String upload(byte[] data, String path); + + /** + * 文件删除 + * + * @param path 文件路径,包含文件名 + */ + void delete(String path); + + /** + * 文件上传 + * + * @param data 文件字节数组 + * @param suffix 后缀 + * @return 返回http地址 + */ + String uploadSuffix(byte[] data, String suffix); + + /** + * 文件上传 + * + * @param inputStream 字节流 + * @param path 文件路径,包含文件名 + * @return 返回http地址 + */ + String upload(InputStream inputStream, String path); + + /** + * 文件上传 + * + * @param inputStream 字节流 + * @param suffix 后缀 + * @return 返回http地址 + */ + String uploadSuffix(InputStream inputStream, String suffix); +} 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/AbstractCloudStorageService.java new file mode 100644 index 00000000..cbdbd93f --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java @@ -0,0 +1,36 @@ +package com.ruoyi.oss.service.abstractd; + +import cn.hutool.core.util.StrUtil; +import com.ruoyi.oss.config.CloudStorageConfig; +import com.ruoyi.oss.service.ICloudStorageService; +import com.ruoyi.oss.utils.DateUtils; + +import java.util.UUID; + +/** + * 云存储(支持七牛、阿里云、腾讯云、minio) + */ +public abstract class AbstractCloudStorageService implements ICloudStorageService { + + /** + * 云存储配置信息 + */ + protected CloudStorageConfig config; + + public int getServiceType() { + return config.getType(); + } + + @Override + public String getPath(String prefix, String suffix) { + // 生成uuid + String uuid = UUID.randomUUID().toString().replaceAll("-", ""); + // 文件路径 + String path = DateUtils.dateTime() + "/" + uuid; + if (StrUtil.isNotBlank(prefix)) { + path = prefix + "/" + path; + } + return path + suffix; + } + +} 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/AliyunCloudStorageServiceImpl.java new file mode 100644 index 00000000..8fbe16c2 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java @@ -0,0 +1,62 @@ +package com.ruoyi.oss.service.impl; + +import com.aliyun.oss.OSSClient; +import com.ruoyi.oss.config.CloudStorageConfig; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +/** + * 阿里云存储 + */ +public class AliyunCloudStorageServiceImpl extends AbstractCloudStorageService { + + private OSSClient client; + + public AliyunCloudStorageServiceImpl(CloudStorageConfig config) { + this.config = config; + // 初始化 + init(); + } + + private void init() { + client = new OSSClient(config.getDomain(), config.getAccessKey(), config.getSecretKey()); + } + + @Override + public String upload(byte[] data, String path) { + return upload(new ByteArrayInputStream(data), path); + } + + @Override + public String upload(InputStream inputStream, String path) { + try { + client.putObject(config.getBucketName(), path, inputStream); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查配置信息"); + } + return config.getDomain() + "/" + path; + } + + @Override + public void delete(String path) { + path = path.replace(config.getDomain() + "/", ""); + try { + client.deleteObject(config.getBucketName(), path); + } catch (Exception e) { + throw new OssException("上传文件失败,请检查配置信息"); + } + } + + @Override + public String uploadSuffix(byte[] data, String suffix) { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } +} 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/MinioCloudStorageServiceImpl.java new file mode 100644 index 00000000..bf02831d --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java @@ -0,0 +1,66 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.io.IoUtil; +import com.ruoyi.oss.config.CloudStorageConfig; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import io.minio.MinioClient; + +import java.io.InputStream; + +/** + * minio存储 + */ +public class MinioCloudStorageServiceImpl extends AbstractCloudStorageService { + + private MinioClient minioClient; + + public MinioCloudStorageServiceImpl(CloudStorageConfig config) { + this.config = config; + // 初始化 + init(); + } + + private void init() { + minioClient = MinioClient.builder() + .endpoint(config.getDomain()) + .credentials(config.getAccessKey(), config.getSecretKey()) + .build(); + } + + @Override + public String upload(byte[] data, String path) { + try { + + } catch (Exception e) { + throw new OssException("上传文件失败,请核对Minio配置信息"); + } + return config.getDomain() + "/" + path; + } + + @Override + public void delete(String path) { + try { + + } catch (Exception e) { + throw new OssException(e.getMessage()); + } + } + + @Override + public String upload(InputStream inputStream, String path) { + byte[] data = IoUtil.readBytes(inputStream); + return this.upload(data, path); + } + + @Override + public String uploadSuffix(byte[] data, String suffix) { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } + +} 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/QcloudCloudStorageServiceImpl.java new file mode 100644 index 00000000..66813101 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java @@ -0,0 +1,77 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.io.IoUtil; +import com.qcloud.cos.COSClient; +import com.ruoyi.oss.config.CloudStorageConfig; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; + +import java.io.InputStream; + +/** + * 腾讯云存储 + */ +public class QcloudCloudStorageServiceImpl extends AbstractCloudStorageService { + + private COSClient client; + + public QcloudCloudStorageServiceImpl(CloudStorageConfig config) { + this.config = config; + // 初始化 + init(); + } + + private void init() { +// Credentials credentials = new Credentials(config.getQcloudAppId(), config.getQcloudSecretId(), +// config.getQcloudSecretKey()); +// 初始化客户端配置 +// ClientConfig clientConfig = new ClientConfig(); +// // 设置bucket所在的区域,华南:gz 华北:tj 华东:sh +// clientConfig.setRegion(config.getQcloudRegion()); +// client = new COSClient(clientConfig, credentials); + } + + @Override + public String upload(byte[] data, String path) { + // 腾讯云必需要以"/"开头 + if (!path.startsWith("/")) { + path = "/" + path; + } + // 上传到腾讯云 +// UploadFileRequest request = new UploadFileRequest(config.getQcloudBucketName(), path, data); +// String response = client.uploadFile(request); +// Map jsonObject = JsonUtils.parseMap(response); +// if (Convert.toInt(jsonObject.get("code")) != 0) { +// throw new OssException("文件上传失败," + Convert.toStr(jsonObject.get("message"))); +// } + return config.getDomain() + path; + } + + @Override + public void delete(String path) { +// path = path.replace(config.getDomain(),""); +// DelFileRequest request = new DelFileRequest(config.getBucketName(), path); +// String response = client.delFile(request); +// Map jsonObject = JsonUtils.parseMap(response); +// if (Convert.toInt(jsonObject.get("code")) != 0) { +// throw new OssException("文件删除失败," + Convert.toStr(jsonObject.get("message"))); +// } + } + + + @Override + public String upload(InputStream inputStream, String path) { + byte[] data = IoUtil.readBytes(inputStream); + return this.upload(data, path); + } + + @Override + public String uploadSuffix(byte[] data, String suffix) { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } + +} 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/QiniuCloudStorageServiceImpl.java new file mode 100644 index 00000000..97a493f7 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java @@ -0,0 +1,84 @@ +package com.ruoyi.oss.service.impl; + +import cn.hutool.core.io.IoUtil; +import com.qiniu.http.Response; +import com.qiniu.storage.BucketManager; +import com.qiniu.storage.Configuration; +import com.qiniu.storage.Region; +import com.qiniu.storage.UploadManager; +import com.qiniu.util.Auth; +import com.ruoyi.oss.config.CloudStorageConfig; +import com.ruoyi.oss.exception.OssException; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; + +import java.io.InputStream; + +/** + * 七牛云存储 + */ +public class QiniuCloudStorageServiceImpl extends AbstractCloudStorageService { + + private UploadManager uploadManager; + private BucketManager bucketManager; + private String token; + + public QiniuCloudStorageServiceImpl(CloudStorageConfig config) { + this.config = config; + // 初始化 + init(); + } + + private void init() { + // z0 z1 z2 + Configuration config = new Configuration(Region.autoRegion()); + // 默认不使用https + config.useHttpsDomains = false; + uploadManager = new UploadManager(config); + Auth auth = Auth.create(this.config.getAccessKey(), this.config.getSecretKey()); + token = auth.uploadToken(this.config.getBucketName()); + bucketManager = new BucketManager(auth, config); + } + + @Override + public String upload(byte[] data, String path) { + try { + Response res = uploadManager.put(data, path, token); + if (!res.isOK()) { + throw new RuntimeException("上传七牛出错:" + res.toString()); + } + } catch (Exception e) { + throw new OssException("上传文件失败,请核对七牛配置信息"); + } + return config.getDomain() + "/" + path; + } + + @Override + public void delete(String path) { + try { + path = path.replace(config.getDomain() + "/", ""); + Response res = bucketManager.delete(config.getBucketName(), path); + if (!res.isOK()) { + throw new RuntimeException("删除七牛文件出错:" + res.toString()); + } + } catch (Exception e) { + throw new OssException(e.getMessage()); + } + } + + @Override + public String upload(InputStream inputStream, String path) { + byte[] data = IoUtil.readBytes(inputStream); + return this.upload(data, path); + } + + @Override + public String uploadSuffix(byte[] data, String suffix) { + return upload(data, getPath(config.getPrefix(), suffix)); + } + + @Override + public String uploadSuffix(InputStream inputStream, String suffix) { + return upload(inputStream, getPath(config.getPrefix(), suffix)); + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java b/ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java new file mode 100644 index 00000000..eac88e8f --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java @@ -0,0 +1,135 @@ +package com.ruoyi.oss.utils; + +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * 时间工具类 + * + * @author ruoyi + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; + + public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + + private static String[] parsePatterns = { + "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", + "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() { + return dateTimeNow(YYYY_MM_DD); + } + + public static final String getTime() { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) { + try { + return new SimpleDateFormat(format).parse(ts); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return parseDate(str.toString(), parsePatterns); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算两个时间差 + */ + public static String getDatePoor(Date endDate, Date nowDate) { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java b/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java new file mode 100644 index 00000000..28cea034 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java @@ -0,0 +1,58 @@ +package com.ruoyi.system.controller; + + +import com.aliyun.oss.ServiceException; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.system.domain.SysOss; +import com.ruoyi.system.service.ISysOssService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * 文件上传 控制层 + * + * @author chkj + * @date 2019-07-15 + */ +@Slf4j +@RestController +@RequestMapping("/system/oss") +public class SysOssController extends BaseController { + + @Autowired + private ISysOssService iSysOssService; + + /** + * 查询文件上传列表 + */ + @GetMapping("/list") + public TableDataInfo list(SysOss sysOss) { + List list = iSysOssService.list(sysOss); + return PageUtils.buildDataInfo(list); + } + + /** + * 上传图片 + */ + @PostMapping("/upload") + public AjaxResult upload(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + throw new CustomException("上传文件不能为空"); + } + Map json = iSysOssService.upload(file); + return AjaxResult.success(json); + } + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java new file mode 100644 index 00000000..406cc84c --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java @@ -0,0 +1,58 @@ +package com.ruoyi.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 文件上传表 sys_oss + * + * @author chkj + * @date 2019-07-15 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@TableName("sys_oss") +public class SysOss implements Serializable { + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 文件名 + */ + private String fileName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private Date createTime; + + /** + * 上传人 + */ + @TableField(fill = FieldFill.INSERT) + private String createBy; + + /** + * 服务商 + */ + private Integer service; +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java b/ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java new file mode 100644 index 00000000..ed282942 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java @@ -0,0 +1,31 @@ +package com.ruoyi.system.factory; + +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; + +/** + * 文件上传Factory + */ +public class OSSFactory { + +// private static ISysConfigService sysConfigService; + + static { +// OSSFactory.sysConfigService = SpringUtils.getBean(ISysConfigService.class); + } + + public static AbstractCloudStorageService build() { +// String jsonconfig = sysConfigService.selectConfigByKey(CloudConstant.CLOUD_STORAGE_CONFIG_KEY); +// // 获取云存储配置信息 +// CloudStorageConfig config = JSON.parseObject(jsonconfig, CloudStorageConfig.class); +// if (config.getType() == CloudConstant.CloudService.QINIU.getValue()) { +// return new QiniuCloudStorageServiceImpl(config); +// } else if (config.getType() == CloudConstant.CloudService.ALIYUN.getValue()) { +// return new AliyunCloudStorageServiceImpl(config); +// } else if (config.getType() == CloudConstant.CloudService.QCLOUD.getValue()) { +// return new QcloudCloudStorageServiceImpl(config); +// } else if (config.getType() == CloudConstant.CloudService.MINIO.getValue()) { +// return new MinioCloudStorageServiceImpl(config); +// } + return null; + } +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java b/ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java new file mode 100644 index 00000000..b1f1303f --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.system.domain.SysOss; + +/** + * 文件上传 数据层 + * + * @author chkj + * @date 2019-07-15 + */ +public interface SysOssMapper extends BaseMapper { +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java new file mode 100644 index 00000000..4a71b2df --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java @@ -0,0 +1,24 @@ +package com.ruoyi.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.system.domain.SysOss; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.Map; + +/** + * 文件上传 服务层 + * + * @author chkj + * @date 2019-07-15 + */ +public interface ISysOssService extends IService { + /** + * 列表查询 + */ + List list(SysOss sysOss); + + Map upload(MultipartFile file); + +} diff --git a/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java new file mode 100644 index 00000000..729470a1 --- /dev/null +++ b/ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java @@ -0,0 +1,63 @@ +package com.ruoyi.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.oss.config.CloudStorageConfig; +import com.ruoyi.oss.service.abstractd.AbstractCloudStorageService; +import com.ruoyi.system.domain.SysOss; +import com.ruoyi.system.factory.OSSFactory; +import com.ruoyi.system.mapper.SysOssMapper; +import com.ruoyi.system.service.ISysOssService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 文件上传 服务层实现 + * + * @author chkj + * @date 2019-07-15 + */ +@Slf4j +@Service +public class SysOssServiceImpl extends ServiceImpl implements ISysOssService { + + @Autowired + private CloudStorageConfig config; + + @Override + public List list(SysOss sysOss) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + return baseMapper.selectList(wrapper); + } + + @Override + public Map upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = originalfileName.substring(originalfileName.lastIndexOf(".")); + try { + AbstractCloudStorageService storage = OSSFactory.build(); + String url = storage.uploadSuffix(file.getBytes(), suffix); + // 保存文件信息 + SysOss ossEntity = new SysOss() + .setUrl(url).setFileSuffix(suffix) + .setFileName(originalfileName) + .setService(storage.getServiceType()); + save(ossEntity); + Map map = new HashMap<>(2); + map.put("url", ossEntity.getUrl()); + map.put("fileName", ossEntity.getFileName()); + return map; + } catch (IOException e) { + throw new CustomException("文件读取异常!!!", e); + } + } + +} diff --git a/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml b/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml new file mode 100644 index 00000000..1af8bf14 --- /dev/null +++ b/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + id, file_name, file_suffix, url, create_time, create_by, service + + + diff --git a/ruoyi-oss/src/main/resources/sql/oss.sql b/ruoyi-oss/src/main/resources/sql/oss.sql new file mode 100644 index 00000000..b49f08e7 --- /dev/null +++ b/ruoyi-oss/src/main/resources/sql/oss.sql @@ -0,0 +1,30 @@ +CREATE TABLE `sys_oss` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `file_name` varchar(64) NOT NULL DEFAULT '' COMMENT '文件名', + `file_suffix` varchar(10) NOT NULL DEFAULT '' COMMENT '文件后缀名', + `url` varchar(200) NOT NULL COMMENT 'URL地址', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `create_by` varchar(64) NOT NULL DEFAULT '' COMMENT '上传人', + `service` tinyint(2) NOT NULL DEFAULT '1' COMMENT '服务商', + PRIMARY KEY (`id`) +) ENGINE = InnoDB + AUTO_INCREMENT = 8 + DEFAULT CHARSET = utf8 COMMENT ='文件上传'; + +INSERT INTO `ry`.`sys_menu` (`menu_name`, `parent_id`, `order_num`, `url`, `menu_type`, `visible`, `perms`, `icon`, + `create_by`, `create_time`, `update_by`, `update_time`, `remark`) +VALUES ('文件管理', '1', '10', '/system/oss', 'C', '0', 'system:oss:view', '#', 'admin', '2018-11-16 13:59:45', '', NULL, + ''); +INSERT INTO `ry`.`sys_menu` (`menu_name`, `parent_id`, `order_num`, `url`, `menu_type`, `visible`, `perms`, `icon`, + `create_by`, `create_time`, `update_by`, `update_time`, `remark`) +VALUES ('文件上传', '1056', '1', '#', 'F', '0', 'system:oss:add', '#', 'admin', '2018-11-16 13:59:45', '', NULL, ''); +INSERT INTO `ry`.`sys_menu` (`menu_name`, `parent_id`, `order_num`, `url`, `menu_type`, `visible`, `perms`, `icon`, + `create_by`, `create_time`, `update_by`, `update_time`, `remark`) +VALUES ('文件删除', '1056', '2', '#', 'F', '0', 'system:oss:remove', '#', 'admin', '2018-11-16 13:59:45', '', NULL, ''); +INSERT INTO `ry`.`sys_menu` (`menu_name`, `parent_id`, `order_num`, `url`, `menu_type`, `visible`, `perms`, `icon`, + `create_by`, `create_time`, `update_by`, `update_time`, `remark`) +VALUES ('文件配置', '1056', '3', '#', 'F', '0', 'system:oss:config', '#', 'admin', '2018-11-16 13:59:45', '', NULL, ''); +INSERT INTO `ry`.`sys_menu` (`menu_name`, `parent_id`, `order_num`, `url`, `menu_type`, `visible`, `perms`, `icon`, + `create_by`, `create_time`, `update_by`, `update_time`, `remark`) +VALUES ('文件修改', '1056', '4', '#', 'F', '0', 'system:oss:remove', '#', 'admin', '2018-11-16 13:59:45', '', NULL, '');