From 7e90d845987127718d34f27b4ebfdcafaa8e4e4e Mon Sep 17 00:00:00 2001 From: 疯狂的狮子li <15040126243@163.com> Date: 星期六, 17 七月 2021 20:44:27 +0800 Subject: [PATCH] add 增加 OSS 对象存储模块 相关代码(未完成) --- ruoyi-oss/src/main/java/com/ruoyi/oss/service/abstractd/AbstractCloudStorageService.java | 36 ++ ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/MinioCloudStorageServiceImpl.java | 66 +++ ruoyi-oss/src/main/java/com/ruoyi/system/service/impl/SysOssServiceImpl.java | 63 +++ ruoyi-admin/pom.xml | 5 ruoyi-oss/src/main/java/com/ruoyi/system/factory/OSSFactory.java | 31 + ruoyi-oss/src/main/java/com/ruoyi/oss/exception/OssException.java | 16 ruoyi-oss/src/main/java/com/ruoyi/system/controller/SysOssController.java | 58 +++ ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QcloudCloudStorageServiceImpl.java | 77 ++++ pom.xml | 14 ruoyi-oss/src/main/java/com/ruoyi/oss/utils/DateUtils.java | 135 +++++++ ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml | 21 + ruoyi-oss/src/main/resources/sql/oss.sql | 30 + ruoyi-oss/src/main/java/com/ruoyi/oss/config/CloudStorageConfig.java | 69 ++++ ruoyi-oss/src/main/java/com/ruoyi/system/service/ISysOssService.java | 24 + ruoyi-oss/src/main/java/com/ruoyi/oss/constant/CloudConstant.java | 43 ++ ruoyi-oss/pom.xml | 55 +++ ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/QiniuCloudStorageServiceImpl.java | 84 ++++ ruoyi-oss/src/main/java/com/ruoyi/system/mapper/SysOssMapper.java | 13 ruoyi-oss/src/main/java/com/ruoyi/system/domain/SysOss.java | 58 +++ ruoyi-oss/src/main/java/com/ruoyi/oss/service/impl/AliyunCloudStorageServiceImpl.java | 62 +++ ruoyi-oss/src/main/java/com/ruoyi/oss/service/ICloudStorageService.java | 58 +++ 21 files changed, 1,018 insertions(+), 0 deletions(-) diff --git a/pom.xml b/pom.xml index 00becec..b590720 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,12 @@ <lock4j.version>2.2.1</lock4j.version> <datasource.version>3.4.0</datasource.version> + <!-- OSS 閰嶇疆 --> + <qiniu.version>7.8.0</qiniu.version> + <aliyun.oss.version>3.13.0</aliyun.oss.version> + <qcloud.cos.version>5.6.47</qcloud.cos.version> + <minio.version>8.2.2</minio.version> + <!-- docker 閰嶇疆 --> <docker.registry.url>localhost</docker.registry.url> <docker.registry.host>http://${docker.registry.url}:2375</docker.registry.host> @@ -183,6 +189,13 @@ <!-- demo妯″潡 --> <dependency> <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-oss</artifactId> + <version>${ruoyi-vue-plus.version}</version> + </dependency> + + <!-- demo妯″潡 --> + <dependency> + <groupId>com.ruoyi</groupId> <artifactId>ruoyi-demo</artifactId> <version>${ruoyi-vue-plus.version}</version> </dependency> @@ -199,6 +212,7 @@ <module>ruoyi-common</module> <module>ruoyi-demo</module> <module>ruoyi-extend</module> + <module>ruoyi-oss</module> </modules> <packaging>pom</packaging> diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 7ff67be..5c895a8 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -42,6 +42,11 @@ <artifactId>ruoyi-quartz</artifactId> </dependency> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-oss</artifactId> + </dependency> + <!-- 浠g爜鐢熸垚--> <dependency> <groupId>com.ruoyi</groupId> diff --git a/ruoyi-oss/pom.xml b/ruoyi-oss/pom.xml new file mode 100644 index 0000000..ad8197c --- /dev/null +++ b/ruoyi-oss/pom.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>ruoyi-vue-plus</artifactId> + <groupId>com.ruoyi</groupId> + <version>2.5.1</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>ruoyi-oss</artifactId> + + <description> + OSS瀵硅薄瀛樺偍妯″潡 + </description> + + <dependencies> + + <!-- 閫氱敤宸ュ叿--> + <dependency> + <groupId>com.ruoyi</groupId> + <artifactId>ruoyi-common</artifactId> + </dependency> + + <dependency> + <groupId>com.qiniu</groupId> + <artifactId>qiniu-java-sdk</artifactId> + <version>${qiniu.version}</version> + </dependency> + <dependency> + <groupId>com.aliyun.oss</groupId> + <artifactId>aliyun-sdk-oss</artifactId> + <version>${aliyun.oss.version}</version> + </dependency> + <dependency> + <groupId>com.qcloud</groupId> + <artifactId>cos_api</artifactId> + <version>${qcloud.cos.version}</version> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>io.minio</groupId> + <artifactId>minio</artifactId> + <version>${minio.version}</version> + </dependency> + + </dependencies> + +</project> 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 0000000..c0f7ee9 --- /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; + + /** + * 鑵捐浜慉ppId + */ + private Integer qcloudAppId; + + /** + * 鑵捐浜慡ecretId + */ + private String qcloudSecretId; + + /** + * 鑵捐浜慡ecretKey + */ + private String qcloudSecretKey; + + /** + * 鑵捐浜慍OS鎵�灞炲湴鍖� + */ + 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 0000000..ac4dff5 --- /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 { + + /** + * 浜戝瓨鍌ㄩ厤缃甂EY + */ + 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 0000000..48ab618 --- /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 0000000..19d623a --- /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 0000000..cbdbd93 --- /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; + +/** + * 浜戝瓨鍌�(鏀寔涓冪墰銆侀樋閲屼簯銆佽吘璁簯銆乵inio) + */ +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 0000000..8fbe16c --- /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 0000000..bf02831 --- /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 0000000..6681310 --- /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 鍗庡寳锛歵j 鍗庝笢锛歴h +// 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<String, Object> 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<String, Object> 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 0000000..97a493f --- /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()); + // 榛樿涓嶄娇鐢╤ttps + 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 0000000..eac88e8 --- /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(); + } + + /** + * 鑾峰彇褰撳墠鏃ユ湡, 榛樿鏍煎紡涓簓yyy-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 0000000..28cea03 --- /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<SysOss> list = iSysOssService.list(sysOss); + return PageUtils.buildDataInfo(list); + } + + /** + * 涓婁紶鍥剧墖 + */ + @PostMapping("/upload") + public AjaxResult upload(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + throw new CustomException("涓婁紶鏂囦欢涓嶈兘涓虹┖"); + } + Map<String, String> 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 0000000..406cc84 --- /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 0000000..ed28294 --- /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 0000000..b1f1303 --- /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<SysOss> { +} 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 0000000..4a71b2d --- /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<SysOss> { + /** + * 鍒楄〃鏌ヨ + */ + List<SysOss> list(SysOss sysOss); + + Map<String, String> 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 0000000..729470a --- /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<SysOssMapper, SysOss> implements ISysOssService { + + @Autowired + private CloudStorageConfig config; + + @Override + public List<SysOss> list(SysOss sysOss) { + LambdaQueryWrapper<SysOss> wrapper = new LambdaQueryWrapper<>(); + return baseMapper.selectList(wrapper); + } + + @Override + public Map<String, String> 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<String, String> 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 0000000..1af8bf1 --- /dev/null +++ b/ruoyi-oss/src/main/resources/mapper/system/SysOssMapper.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.chkj.cloudStorage.mapper.SysOssMapper"> + + <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 --> + <resultMap id="BaseResultMap" type="com.chkj.cloudStorage.domain.SysOss"> + <id column="id" property="id"/> + <result column="file_name" property="fileName"/> + <result column="file_suffix" property="fileSuffix"/> + <result column="url" property="url"/> + <result column="create_time" property="createTime"/> + <result column="create_by" property="createBy"/> + <result column="service" property="service"/> + </resultMap> + + <!-- 閫氱敤鏌ヨ缁撴灉鍒� --> + <sql id="Base_Column_List"> + id, file_name, file_suffix, url, create_time, create_by, service + </sql> + +</mapper> 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 0000000..b49f08e --- /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, ''); -- Gitblit v1.9.3