add 增加 OSS 对象存储模块 相关代码(未完成)
| | |
| | | <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> |
| | |
| | | <!-- 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> |
| | |
| | | <module>ruoyi-common</module> |
| | | <module>ruoyi-demo</module> |
| | | <module>ruoyi-extend</module> |
| | | <module>ruoyi-oss</module> |
| | | </modules> |
| | | <packaging>pom</packaging> |
| | | |
| | |
| | | <artifactId>ruoyi-quartz</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
| | | <artifactId>ruoyi-oss</artifactId> |
| | | </dependency> |
| | | |
| | | <!-- 代ç çæ--> |
| | | <dependency> |
| | | <groupId>com.ruoyi</groupId> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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)); |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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)); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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<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)); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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)); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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 + "åé"; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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; |
| | | } |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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> { |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <?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> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | 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, ''); |