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, '');