dengsixing 3 jaren geleden
bovenliggende
commit
cfcbedb5e0
23 gewijzigde bestanden met toevoegingen van 1126 en 215 verwijderingen
  1. 4 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/ConstantFilePath.java
  2. 7 3
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/ErrorCode.java
  3. 2 1
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/FileBizType.java
  4. 2 1
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/OperationType.java
  5. 32 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneFrom.java
  6. 32 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneResolution.java
  7. 41 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneSource.java
  8. 39 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneSyncType.java
  9. 4 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/UploadFilePath.java
  10. 5 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/util/CreateObjUtil.java
  11. 175 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/util/FileUtil.java
  12. 109 0
      4dkankan-common-utils/src/main/java/com/fdkankan/common/util/FileUtils.java
  13. 40 1
      4dkankan-common-utils/src/main/java/com/fdkankan/common/util/StrExtUtil.java
  14. 7 2
      4dkankan-utils-db/pom.xml
  15. 4 1
      4dkankan-utils-db/src/main/java/com/fdkankan/db/base/BaseEntity.java
  16. 93 0
      4dkankan-utils-db/src/main/java/com/fdkankan/db/config/DruidConfig.java
  17. 160 157
      4dkankan-utils-db/src/main/java/com/fdkankan/db/config/DruidConfiguration.java
  18. 166 0
      4dkankan-utils-db/src/main/java/com/fdkankan/db/config/DruidDataSourceProperties.java
  19. 148 45
      4dkankan-utils-fyun/src/main/java/com/fdkankan/fyun/oss/UploadToOssUtil.java
  20. 12 1
      4dkankan-utils-redis/src/main/java/com/fdkankan/redis/constant/RedisKey.java
  21. 7 0
      4dkankan-utils-redis/src/main/java/com/fdkankan/redis/constant/RedisLockKey.java
  22. 1 1
      4dkankan-utils-redis/src/main/java/com/fdkankan/redis/util/RedisLockUtil.java
  23. 36 2
      4dkankan-utils-redis/src/main/java/com/fdkankan/redis/util/RedisUtil.java

+ 4 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/ConstantFilePath.java

@@ -113,6 +113,10 @@ public class ConstantFilePath {
 
     public static final String DATA_PATH_FORMAT = "data/data%s/";
 
+    public static final String SCENE_CACHE_IMAGES = SCENE_PATH + "%s/caches/images/";
+
+    public static final String SCENE_CACHE = SCENE_PATH + "%s/caches/";
+
 
 
     public static void main(String[] args) {

+ 7 - 3
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/ErrorCode.java

@@ -135,14 +135,14 @@ public enum ErrorCode {
     FAILURE_CODE_5056(5056, "双目相机异常"),
 
 
-
-
-
     FAILURE_CODE_7001(7001, "激光场景状态同步失败,请重试!"),
     FAILURE_CODE_7002(7002, "大场景号不能为空"),
     FAILURE_CODE_7003(7003, "文件业务类型不正确!"),
     FAILURE_CODE_7004(7004, "热点数据不能为空!"),
     FAILURE_CODE_7005(7005, "查询不到热点数据!"),
+    FAILURE_CODE_7006(7006, "目录不存在!"),
+    FAILURE_CODE_7007(7007, "文件格式不正确, 只能是%s格式"),
+    FAILURE_CODE_7008(7008, "场景编辑数据不存在"),
 
 
 
@@ -164,5 +164,9 @@ public enum ErrorCode {
         return message;
     }
 
+    public String formatMessage(Object... args){
+        return String.format(message, args);
+    }
+
 
 }

+ 2 - 1
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/FileBizType.java

@@ -8,7 +8,8 @@ public enum FileBizType {
     FLOOR_LOGO("floorLogo", "地板logo"),
     MUSIC("music", "背景音乐"),
     FLOOR_PLAN("floorPlan", "户型图"),
-    SCREENSHOT("screenshot", "初始画面")
+    SCREENSHOT("screenshot", "初始画面"),
+    BOX_VIDEO("box-video", "视频")
     ;
 
     private String code;

+ 2 - 1
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/OperationType.java

@@ -7,7 +7,8 @@ public enum OperationType {
 
     DELETE(-1, "删除"),
     UPDATE(0, "修改"),
-    ADD(1, "新增");
+    ADD(1, "新增"),
+    ADDORUPDATE(2, "新增或修改");
 
     private Integer code;
     private String message;

+ 32 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneFrom.java

@@ -0,0 +1,32 @@
+package com.fdkankan.common.constant;
+
+/**
+ * 场景来源
+ */
+public enum SceneFrom {
+
+    LITE("lite ", "双目lite相机"),
+    PRO("pro", "八目相机 "),
+    MINION("minion", "双面转台相机"),
+    LASER("laser", "激光相机"),
+    VIRTUAL("virtual", "虚拟场景"),
+    SKETCH("sketch", "图片建模场景")
+    ;
+
+    private String code;
+    private String message;
+
+    private SceneFrom(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+}

+ 32 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneResolution.java

@@ -0,0 +1,32 @@
+package com.fdkankan.common.constant;
+
+/**
+ * 全景图加载方式
+ */
+public enum SceneResolution {
+
+    TILES_1K("tiles/1k", "1k瓦片图"),
+    TILES_2K("tiles/2k", "2k瓦片图 "),
+    TILES_4K("tiles/4k", "4k瓦片图"),
+    PAN("pan", "全景图"),
+    LOCAL("local", "本地切片"),
+    CUBE("cube", "立体图")
+    ;
+
+    private String code;
+    private String message;
+
+    private SceneResolution(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+}

+ 41 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneSource.java

@@ -0,0 +1,41 @@
+package com.fdkankan.common.constant;
+
+/**
+ * 场景来源
+ */
+public enum SceneSource {
+
+    BM(1, "八目"),
+    SM(2, "双目"),
+    ZT(3, "转台"),
+    JG(4, "激光");
+
+    private Integer code;
+    private String message;
+
+    private SceneSource(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static SceneSource get(Integer code){
+        SceneSource[] values = SceneSource.values();
+        Integer enumValue = null;
+        for(SceneSource eachValue : values){
+            enumValue = eachValue.code();
+            if(enumValue.equals(code)){
+                return eachValue;
+            }
+        }
+        return null;
+    }
+
+}

+ 39 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/SceneSyncType.java

@@ -0,0 +1,39 @@
+package com.fdkankan.common.constant;
+
+/**
+ * 全景图加载方式
+ */
+public enum SceneSyncType {
+
+    AJK("ajk", "安居客"),
+    ;
+
+    private String code;
+    private String message;
+
+    SceneSyncType(String code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+    public static SceneSyncType get(String code){
+        SceneSyncType[] values = SceneSyncType.values();
+        String enumValue = null;
+        for(SceneSyncType eachValue : values){
+            enumValue = eachValue.code();
+            if(enumValue.equals(code)){
+                return eachValue;
+            }
+        }
+        return null;
+    }
+
+}

+ 4 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/constant/UploadFilePath.java

@@ -32,5 +32,9 @@ public class UploadFilePath {
     public static final String VIDEOS_EDIT_PATH =  "scene_edit_data/%s/videos/";
     public static final String VIDEOS_VIEW_PATH =  "scene_view_data/%s/videos/";
 
+    public static final String SCENE_NUM_PATH = "scene/%s";
+    public static final String IMG_CACHES_PATH =  "scene/%s/caches/images/";
+    public static final String VIDEOS_CACHES_PATH =  "scene/%s/caches/videos/";
+
 
 }

+ 5 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/util/CreateObjUtil.java

@@ -599,4 +599,9 @@ public class CreateObjUtil {
 		callshell(command);
 		log.info("matterpro获取阿里云图片方法完成,时间为:" + (System.currentTimeMillis() - start));
 	}
+
+	public static void main(String[] args) throws Exception{
+		CreateObjUtil.convertTxtToVisionmodeldata("F:\\visiontest\\vision.txt", "F:\\visiontest\\vision.modeldata");
+	}
+
 }

+ 175 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/util/FileUtil.java

@@ -1,10 +1,21 @@
 package com.fdkankan.common.util;
 
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.exception.BusinessException;
 import java.io.*;
 import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileChannel.MapMode;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipInputStream;
+import java.util.zip.ZipOutputStream;
+import lombok.extern.slf4j.Slf4j;
 
 /**
  * @author MeepoGuan
@@ -14,6 +25,7 @@ import java.nio.channels.FileChannel.MapMode;
  * 2017年4月30日
  *
  */
+@Slf4j
 public class FileUtil {
 
 /*	public static void main(String[] args) {
@@ -237,4 +249,167 @@ public class FileUtil {
         }
         return s;
     }
+
+	/**
+	 * 获取目录下所有文件
+	 * @param directory
+	 */
+	public static List<String> getFileList(String directory) {
+
+		File f = new File(directory);
+
+		File[] files = f.listFiles();
+
+		if(files == null || files.length == 0){
+			return null;
+		}
+
+		List<String> list = new ArrayList<>();
+		for (int i = 0; i < files.length; i++) {
+
+			if (files[i].isFile()) {
+				list.add(files[i].getAbsolutePath());
+			} else {
+				System.out.println("目录:" + files[i]);
+				list.addAll(getFileList(files[i].getAbsolutePath()));
+			}
+		}
+
+		return list;
+	}
+
+	/**
+	 * <p>
+	        zip包解压缩
+	 * </p>
+	 * @author dengsixing
+	 * @date 2022/2/16
+	 * @param inputFile 解压文件路径
+	 * @param destDirPath 解压目标目录
+	 **/
+	public static void unZip(String inputFile,String destDirPath) throws Exception{
+		File srcFile = new File(inputFile);//获取当前压缩文件
+		// 判断源文件是否存在
+		if (!srcFile.exists()) {
+			throw new Exception("文件不存在:" + srcFile.getPath());
+		}
+		try(
+			//创建压缩文件对象
+			ZipFile zipFile = new ZipFile(srcFile)
+		){
+			//开始解压
+			Enumeration<?> entries = zipFile.entries();
+			while (entries.hasMoreElements()) {
+				ZipEntry entry = (ZipEntry) entries.nextElement();
+				// 如果是文件夹,就创建个文件夹
+				if (entry.isDirectory()) {
+					String dirPath = destDirPath + "/" + entry.getName();
+					srcFile.mkdirs();
+				} else {
+					// 如果是文件,就先创建一个文件,然后用io流把内容copy过去
+					File targetFile = new File(destDirPath + "/" + entry.getName());
+					// 保证这个文件的父文件夹必须要存在
+					if (!targetFile.getParentFile().exists()) {
+						targetFile.getParentFile().mkdirs();
+					}
+					targetFile.createNewFile();
+					// 将压缩文件内容写入到这个文件中
+					try(InputStream is = zipFile.getInputStream(entry);
+						FileOutputStream fos = new FileOutputStream(targetFile)){
+						int len;
+						byte[] buf = new byte[1024];
+						while ((len = is.read(buf)) != -1) {
+							fos.write(buf, 0, len);
+						}
+					}catch (IOException e){
+						log.error("解压缩失败,文件名称" + entry.getName(), e);
+						throw e;
+					}
+				}
+			}
+		} catch (ZipException e) {
+			log.error("解压缩失败,文件路径:" + srcFile.getPath(), e);
+			throw e;
+		} catch (IOException e) {
+			log.error("解压缩失败,文件路径:" + srcFile.getPath(), e);
+			throw e;
+		}
+	}
+
+	/**
+	 * <p>
+	        打包
+	 * </p>
+	 * @author dengsixing
+	 * @date 2022/2/16
+	 * @param inputFile
+	 * @param outputFile
+	 * @param withDir
+	 **/
+	public static void zip(String inputFile, String outputFile, boolean withDir) throws Exception {
+
+		try(
+		//创建zip输出流
+			ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFile));
+			//创建缓冲输出流
+			BufferedOutputStream bos = new BufferedOutputStream(out);
+		){
+			File input = new File(inputFile);
+			compress(out, bos, input, null, withDir);
+		}
+	}
+
+	/**
+	 * @param name 压缩文件名,可以写为null保持默认
+	 */
+	//递归压缩
+	public static void compress(ZipOutputStream out, BufferedOutputStream bos, File input, String name, boolean withDir) throws IOException {
+		if (name == null) {
+			name = input.getName();
+		}
+		//如果路径为目录(文件夹)
+		if (input.isDirectory()) {
+			//取出文件夹中的文件(或子文件夹)
+			File[] flist = input.listFiles();
+
+			if (flist.length == 0)//如果文件夹为空,则只需在目的地zip文件中写入一个目录进入
+			{
+				if(withDir){
+					out.putNextEntry(new ZipEntry(name + "/"));
+				}
+			} else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
+			{
+				for (int i = 0; i < flist.length; i++) {
+					if(withDir){
+						compress(out, bos, flist[i], name + "/" + flist[i].getName(), withDir);
+					}else{
+						compress(out, bos, flist[i], flist[i].getName(), withDir);
+					}
+				}
+			}
+		}
+		//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
+		else
+		{
+			out.putNextEntry(new ZipEntry(name));
+			FileInputStream fos = new FileInputStream(input);
+			BufferedInputStream bis = new BufferedInputStream(fos);
+			int len;
+			//将源文件写入到zip文件中
+			byte[] buf = new byte[1024];
+			while ((len = bis.read(buf)) != -1) {
+				bos.write(buf,0,len);
+			}
+			bis.close();
+			fos.close();
+		}
+	}
+
+	public static void main(String[] args) throws Exception {
+
+
+		FileUtil.zip("F:\\test","F:\\test.zip", false);
+
+
+	}
 }

+ 109 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/common/util/FileUtils.java

@@ -2,6 +2,7 @@ package com.fdkankan.common.util;
 
 import com.alibaba.fastjson.JSONObject;
 import it.sauronsoftware.jave.*;
+import java.net.MalformedURLException;
 import org.apache.tools.zip.ZipEntry;
 import org.apache.tools.zip.ZipFile;
 import org.apache.tools.zip.ZipOutputStream;
@@ -496,6 +497,75 @@ public class FileUtils {
         return true;
     }
 
+    public static byte[] getBytesFromUrl(String urlStr){
+        InputStream inputStream = null;
+
+        try {
+            URL url = new URL(urlStr);
+            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
+            conn.setConnectTimeout(3000);
+            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+            inputStream = conn.getInputStream();
+            byte[] getData = FileUtils.readInputStream(inputStream);
+            if (inputStream != null) {
+                inputStream.close();
+            }
+            return getData;
+        } catch (FileNotFoundException var27) {
+            var27.printStackTrace();
+        } catch (IOException var28) {
+            var28.printStackTrace();
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException var25) {
+                    var25.printStackTrace();
+                }
+            }
+        }
+
+        return null;
+    }
+
+
+    public static String getStringFromUrl(String urlStr){
+        InputStream inputStream = null;
+
+        try {
+            URL url = new URL(urlStr);
+            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
+            conn.setConnectTimeout(3000);
+            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
+            inputStream = conn.getInputStream();
+            StringBuilder content = new StringBuilder();
+            try(BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))){
+                while (true) {
+                    String line = reader.readLine();
+                    if (line == null) break;
+                    content.append(line);
+                }
+            } catch (IOException e) {
+                log.error("读取aws文件流失败", e);
+            }
+            return content.toString();
+        }catch (MalformedURLException e) {
+            log.error("获取云文件出错", e);
+        } catch (IOException e) {
+            log.error("获取云文件出错", e);
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return null;
+    }
+
     /**
      * 从输入流中获取字节数组
      *
@@ -698,6 +768,7 @@ public class FileUtils {
         }
     }
 
+
     //删除文件夹
     public static void delFolder(String folderPath) {
         try {
@@ -987,12 +1058,50 @@ public class FileUtils {
 //            FileUtils.saveImageToDisk(null, null, ConstantFileName.WECHAT_VOICE_NAME, path+File.separator, is);
 //            System.out.println("下载完成");
 
+//            FileUtils.zipFile("F:\\test.zip", "F:\\downloads\\v3local");
+
+//            ZipOutputStream out = new ZipOutputStream(new FileOutputStream("F:\\test.zip"));
+//            File file = new File("F:\\test\\aaa\\sdf.jpg");
+//            FileInputStream in = new FileInputStream(file);
+//            FileUtils.zipTest(out, "aaa\\sdf.jpg", in);
+//            out.close();
+//
+//            File file = new File("F:\\test");
+//            List<String> list = FileUtils.list(file);
+//            for (String s : list) {
+//                System.out.println(s);
+//            }
+
+            byte[] bytesFromUrl = FileUtils.getBytesFromUrl(
+                "https://4dkankan.oss-cn-shenzhen.aliyuncs.com/"
+                    + "data/datat-ieXdyGl6Md/mesh/texture1.jpg");
+            FileOutputStream out = new FileOutputStream(new File("F:\\texture1.jpg"));
+            out.write(bytesFromUrl);
+
+
+
 
         }catch (Exception e){
             e.printStackTrace();
         }
     }
 
+    public static List<String> list(File file) throws Exception{
+        List<String> keys = new ArrayList<>();
+        //判断file是否是目录
+        if(file.isDirectory()){
+            File [] lists = file.listFiles();
+            if(lists!=null){
+                for(int i=0;i<lists.length;i++)
+                {
+                    keys.addAll(list(lists[i]));//是目录就递归进入目录内再进行判断
+                }
+            }
+        }else{
+            keys.add(file.getAbsolutePath());
+        }
+        return keys;
+    }
 
 
     /**

+ 40 - 1
4dkankan-common-utils/src/main/java/com/fdkankan/common/util/StrExtUtil.java

@@ -1,11 +1,50 @@
 package com.fdkankan.common.util;
 
 import cn.hutool.core.util.StrUtil;
+import com.fdkankan.common.constant.ErrorCode;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import jdk.nashorn.internal.runtime.regexp.joni.Regex;
 
 public class StrExtUtil extends StrUtil {
 
     public static void test(){
-        System.out.println("123");
+
+        String key = "images/imagest_1/tiles/2k/sfdsdfs_skybox2.png";
+
+        String fileName = key.substring(key.lastIndexOf("/"), key.indexOf("."));
+        System.out.println(fileName);
+        String[] arr = fileName.split("_skybox");
+        String dir = arr[0];
+        String num = arr[1];
+
+        String regx = "\\w+.png";
+
+        Pattern compile = Pattern.compile(regx);
+
+        Matcher matcher = compile.matcher(key);
+
+        if(matcher.find()){
+            System.out.println(matcher.group());
+
+//            String regx2 = "\\d+";
+//
+//            Pattern compile2 = Pattern.compile(regx2);
+//
+//            Matcher matcher2 = compile2.matcher(matcher.group());
+//
+//            while (matcher2.find()){
+//
+//                System.out.println(matcher2.group());
+//            }
+        }
+
+
+
+    }
+
+    public static void main(String[] args) {
+        StrExtUtil.test();
     }
 
 }

+ 7 - 2
4dkankan-utils-db/pom.xml

@@ -43,10 +43,15 @@
             <version>2.3</version>
         </dependency>
 
+<!--        <dependency>-->
+<!--            <groupId>com.alibaba</groupId>-->
+<!--            <artifactId>druid</artifactId>-->
+<!--            <version>1.2.6</version>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>com.alibaba</groupId>
-            <artifactId>druid</artifactId>
-            <version>1.2.6</version>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.17</version>
         </dependency>
 
 

+ 4 - 1
4dkankan-utils-db/src/main/java/com/fdkankan/db/base/BaseEntity.java

@@ -2,6 +2,7 @@ package com.fdkankan.db.base;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
+import java.io.Serializable;
 import java.util.Date;
 
 /**
@@ -12,7 +13,9 @@ import java.util.Date;
  * @author dengsixing
  * @since 2022/2/15
  **/
-public class BaseEntity {
+public class BaseEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
 
     /**
      * 创建人id

+ 93 - 0
4dkankan-utils-db/src/main/java/com/fdkankan/db/config/DruidConfig.java

@@ -0,0 +1,93 @@
+package com.fdkankan.db.config;
+
+import java.sql.SQLException;
+//import javax.servlet.Filter;
+//import javax.servlet.Servlet;
+import javax.sql.DataSource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.boot.web.servlet.ServletRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.druid.support.http.StatViewServlet;
+import com.alibaba.druid.support.http.WebStatFilter;
+
+@Configuration
+@EnableConfigurationProperties({DruidDataSourceProperties.class})
+public class DruidConfig {
+    @Autowired
+    private DruidDataSourceProperties properties;
+
+    @Bean
+    @ConditionalOnMissingBean
+    public DataSource druidDataSource() {
+        DruidDataSource druidDataSource = new DruidDataSource();
+        druidDataSource.setDriverClassName(properties.getDriverClassName());
+        druidDataSource.setUrl(properties.getUrl());
+        druidDataSource.setUsername(properties.getUsername());
+        druidDataSource.setPassword(properties.getPassword());
+        druidDataSource.setInitialSize(properties.getInitialSize());
+        druidDataSource.setMinIdle(properties.getMinIdle());
+        druidDataSource.setMaxActive(properties.getMaxActive());
+        druidDataSource.setMaxWait(properties.getMaxWait());
+        druidDataSource.setTimeBetweenEvictionRunsMillis(properties.getTimeBetweenEvictionRunsMillis());
+        druidDataSource.setMinEvictableIdleTimeMillis(properties.getMinEvictableIdleTimeMillis());
+        druidDataSource.setValidationQuery(properties.getValidationQuery());
+        druidDataSource.setTestWhileIdle(properties.isTestWhileIdle());
+        druidDataSource.setTestOnBorrow(properties.isTestOnBorrow());
+        druidDataSource.setTestOnReturn(properties.isTestOnReturn());
+        druidDataSource.setPoolPreparedStatements(properties.isPoolPreparedStatements());
+        druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(properties.getMaxPoolPreparedStatementPerConnectionSize());
+
+        try {
+            druidDataSource.setFilters(properties.getFilters());
+            druidDataSource.init();
+        } catch (SQLException e) {
+            e.printStackTrace();
+        }
+
+        return druidDataSource;
+    }
+
+//    /**
+//     * 注册Servlet信息, 配置监控视图
+//     *
+//     * @return
+//     */
+//    @Bean
+//    @ConditionalOnMissingBean
+//    public ServletRegistrationBean<Servlet> druidServlet() {
+//        ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*");
+//
+//        //白名单:
+//        servletRegistrationBean.addInitParameter("allow","192.168.1.195");
+//        //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
+//        servletRegistrationBean.addInitParameter("deny","192.168.1.119");
+//        //登录查看信息的账号密码, 用于登录Druid监控后台
+//        servletRegistrationBean.addInitParameter("loginUsername", "admin");
+//        servletRegistrationBean.addInitParameter("loginPassword", "admin");
+//        //是否能够重置数据.
+//        servletRegistrationBean.addInitParameter("resetEnable", "true");
+//        return servletRegistrationBean;
+//
+//    }
+//
+//    /**
+//     * 注册Filter信息, 监控拦截器
+//     *
+//     * @return
+//     */
+//    @Bean
+//    @ConditionalOnMissingBean
+//    public FilterRegistrationBean<Filter> filterRegistrationBean() {
+//        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
+//        filterRegistrationBean.setFilter(new WebStatFilter());
+//        filterRegistrationBean.addUrlPatterns("/*");
+//        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
+//        return filterRegistrationBean;
+//    }
+}

+ 160 - 157
4dkankan-utils-db/src/main/java/com/fdkankan/db/config/DruidConfiguration.java

@@ -1,161 +1,164 @@
-package com.fdkankan.db.config;
-
-import com.alibaba.druid.pool.DruidDataSource;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-
-import javax.sql.DataSource;
-import java.sql.SQLException;
-
-/**
- * druid连接池配置
- */
-@Configuration
-public class DruidConfiguration {
-
-    @Value("${spring.datasource.url}")
-    private String url;
-
-    @Value("${spring.datasource.username}")
-    private String username;
-
-    @Value("${spring.datasource.password}")
-    private String password;
-
-    @Value("${spring.datasource.driver-class-name}")
-    private String driverClassName;
-
-    @Value("${spring.druid.initialSize}")
-    private int initialSize;
-
-    @Value("${spring.druid.minIdle}")
-    private int minIdle;
-
-    @Value("${spring.druid.maxActive}")
-    private int maxActive;
-
-    @Value("${spring.druid.maxWait}")
-    private int maxWait;
-//
-    @Value("${spring.druid.timeBetweenEvictionRunsMillis}")
-    private int timeBetweenEvictionRunsMillis;
-
-    @Value("${spring.druid.minEvictableIdleTimeMillis}")
-    private int minEvictableIdleTimeMillis;
-
-    @Value("${spring.druid.validationQuery}")
-    private String validationQuery;
-
-    @Value("${spring.druid.testWhileIdle}")
-    private boolean testWhileIdle;
-
-    @Value("${spring.druid.testOnBorrow}")
-    private boolean testOnBorrow;
-
-    @Value("${spring.druid.testOnReturn}")
-    private boolean testOnReturn;
-
-    @Value("${spring.druid.poolPreparedStatements}")
-    private boolean poolPreparedStatements;
-
-//    @Value("${spring.druid.maxPoolPreparedStatementPerConnectionSize}")
-//    private int maxPoolPreparedStatementPerConnectionSize;
-//
-//    @Value("${spring.druid.filters}")
-//    private String filters;
-//
-//    @Value("{spring.druid.connectionProperties}")
-//    private String connectionProperties;
-
-    @Bean(name = "dataSource")
-    @Primary
-    public DataSource dataSource() throws SQLException {
-        DruidDataSource datasource = new DruidDataSource();
-
-        datasource.setUrl(url);
-        datasource.setUsername(username);
-        //这里可以做加密处理
-        datasource.setPassword(password);
-        datasource.setDriverClassName(driverClassName);
-
-        //配置了初始化连接池大小,本地启动初始化连接时会很慢,服务器上启动并不慢
-        datasource.setInitialSize(initialSize);
-        datasource.setMinIdle(minIdle);
-        datasource.setMaxActive(maxActive);
-        datasource.setMaxWait(maxWait);
-        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
-        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
-        datasource.setValidationQuery(validationQuery);
-        datasource.setTestWhileIdle(testWhileIdle);
-        datasource.setTestOnBorrow(testOnBorrow);
-        datasource.setTestOnReturn(testOnReturn);
-        datasource.setPoolPreparedStatements(poolPreparedStatements);
-//        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
-//        try {
-//            datasource.setFilters(filters);
-//            List<Filter> wallFilters = new ArrayList<>();
-//            wallFilters.add((Filter) wallFilter());
-//            datasource.setProxyFilters(wallFilters);
-//        } catch (SQLException e) {
-//
-//        }
-//        datasource.setConnectionProperties(connectionProperties);
-        datasource.init();
-
-        return datasource;
-    }
-
-//    /**
-//     * StatViewServlet用于展示Druid的统计信息
-//     * 地址为:http://ip:/port/druid/index.html
-//     * @return
-//     */
-//    @Bean
-//    public ServletRegistrationBean statViewServlet() {
-//        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
-//        //设置ip白名单
-//        //servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
-//        //设置ip黑名单,优先级高于白名单
-//        //servletRegistrationBean.addInitParameter("deny", "192.168.0.19");
-//        //设置控制台管理用户
-//        servletRegistrationBean.addInitParameter("loginUsername", "root");
-//        servletRegistrationBean.addInitParameter("loginPassword", "root");
-//        //是否可以重置数据
-//        servletRegistrationBean.addInitParameter("resetEnable", "false");
-//        return servletRegistrationBean;
-//    }
+//package com.fdkankan.db.config;
 //
-//    /**
-//     * Druid监控拦截器
-//     * @return
-//     */
-//    @Bean
-//    public FilterRegistrationBean statFilter() {
-//        //创建过滤器
-//        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
-//        //设置过滤器过滤路径
-//        filterRegistrationBean.addUrlPatterns("/*");
-//        //忽略过滤的形式 关键字:exclusions
-//        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/static/*");
-//        return filterRegistrationBean;
-//    }
+//import com.alibaba.druid.pool.DruidDataSource;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.boot.context.properties.ConfigurationProperties;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.context.annotation.Primary;
 //
-//    @Bean
-//    public WallFilterMBean wallFilter(){
-//        WallFilter wallFilterMBean = new WallFilter();
-//        wallFilterMBean.setConfig(wallConfig());
-//        return wallFilterMBean;
-//    }
+//import javax.sql.DataSource;
+//import java.sql.SQLException;
+//
+///**
+// * druid连接池配置
+// */
+//@Configuration
+//public class DruidConfiguration {
+//
+//    @Value("${spring.datasource.url}")
+//    private String url;
+//
+//    @Value("${spring.datasource.username}")
+//    private String username;
+//
+//    @Value("${spring.datasource.password}")
+//    private String password;
+//
+//    @Value("${spring.datasource.driver-class-name}")
+//    private String driverClassName;
+//
+//    @Value("${spring.druid.initialSize}")
+//    private int initialSize;
+//
+//    @Value("${spring.druid.minIdle}")
+//    private int minIdle;
+//
+//    @Value("${spring.druid.maxActive}")
+//    private int maxActive;
+//
+//    @Value("${spring.druid.maxWait}")
+//    private int maxWait;
+////
+//    @Value("${spring.druid.timeBetweenEvictionRunsMillis}")
+//    private int timeBetweenEvictionRunsMillis;
 //
-//    @Bean
-//    public WallConfig wallConfig(){
-//        WallConfig wallConfig = new WallConfig();
-//        wallConfig.setMultiStatementAllow(true);//允许一次执行多条语句
-//        wallConfig.setNoneBaseStatementAllow(true);//允许一次执行多条语句
-//        return wallConfig;
+//    @Value("${spring.druid.minEvictableIdleTimeMillis}")
+//    private int minEvictableIdleTimeMillis;
+//
+//    @Value("${spring.druid.validationQuery}")
+//    private String validationQuery;
+//
+//    @Value("${spring.druid.testWhileIdle}")
+//    private boolean testWhileIdle;
+//
+//    @Value("${spring.druid.testOnBorrow}")
+//    private boolean testOnBorrow;
+//
+//    @Value("${spring.druid.testOnReturn}")
+//    private boolean testOnReturn;
+//
+//    @Value("${spring.druid.poolPreparedStatements}")
+//    private boolean poolPreparedStatements;
+//
+//    @Value("${spring.druid.keepAlive}")
+//    private boolean keepAlive;
+////    @Value("${spring.druid.maxPoolPreparedStatementPerConnectionSize}")
+////    private int maxPoolPreparedStatementPerConnectionSize;
+////
+////    @Value("${spring.druid.filters}")
+////    private String filters;
+////
+////    @Value("{spring.druid.connectionProperties}")
+////    private String connectionProperties;
+//
+//    @Bean(name = "dataSource")
+//    @Primary
+//    public DataSource dataSource() throws SQLException {
+//        DruidDataSource datasource = new DruidDataSource();
+//
+//        datasource.setUrl(url);
+//        datasource.setUsername(username);
+//        //这里可以做加密处理
+//        datasource.setPassword(password);
+//        datasource.setDriverClassName(driverClassName);
+//
+//        //配置了初始化连接池大小,本地启动初始化连接时会很慢,服务器上启动并不慢
+//        datasource.setInitialSize(initialSize);
+//        datasource.setMinIdle(minIdle);
+//        datasource.setMaxActive(maxActive);
+//        datasource.setMaxWait(maxWait);
+//        datasource.setKeepAlive(keepAlive);
+//        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
+//        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
+//        datasource.setValidationQuery(validationQuery);
+//        datasource.setTestWhileIdle(testWhileIdle);
+//        datasource.setTestOnBorrow(testOnBorrow);
+//        datasource.setTestOnReturn(testOnReturn);
+//        datasource.setPoolPreparedStatements(poolPreparedStatements);
+////        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
+////        try {
+////            datasource.setFilters(filters);
+////            List<Filter> wallFilters = new ArrayList<>();
+////            wallFilters.add((Filter) wallFilter());
+////            datasource.setProxyFilters(wallFilters);
+////        } catch (SQLException e) {
+////
+////        }
+////        datasource.setConnectionProperties(connectionProperties);
+//        datasource.init();
+//
+//        return datasource;
 //    }
-
-}
+//
+////    /**
+////     * StatViewServlet用于展示Druid的统计信息
+////     * 地址为:http://ip:/port/druid/index.html
+////     * @return
+////     */
+////    @Bean
+////    public ServletRegistrationBean statViewServlet() {
+////        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
+////        //设置ip白名单
+////        //servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
+////        //设置ip黑名单,优先级高于白名单
+////        //servletRegistrationBean.addInitParameter("deny", "192.168.0.19");
+////        //设置控制台管理用户
+////        servletRegistrationBean.addInitParameter("loginUsername", "root");
+////        servletRegistrationBean.addInitParameter("loginPassword", "root");
+////        //是否可以重置数据
+////        servletRegistrationBean.addInitParameter("resetEnable", "false");
+////        return servletRegistrationBean;
+////    }
+////
+////    /**
+////     * Druid监控拦截器
+////     * @return
+////     */
+////    @Bean
+////    public FilterRegistrationBean statFilter() {
+////        //创建过滤器
+////        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
+////        //设置过滤器过滤路径
+////        filterRegistrationBean.addUrlPatterns("/*");
+////        //忽略过滤的形式 关键字:exclusions
+////        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/static/*");
+////        return filterRegistrationBean;
+////    }
+////
+////    @Bean
+////    public WallFilterMBean wallFilter(){
+////        WallFilter wallFilterMBean = new WallFilter();
+////        wallFilterMBean.setConfig(wallConfig());
+////        return wallFilterMBean;
+////    }
+////
+////    @Bean
+////    public WallConfig wallConfig(){
+////        WallConfig wallConfig = new WallConfig();
+////        wallConfig.setMultiStatementAllow(true);//允许一次执行多条语句
+////        wallConfig.setNoneBaseStatementAllow(true);//允许一次执行多条语句
+////        return wallConfig;
+////    }
+//
+//}

+ 166 - 0
4dkankan-utils-db/src/main/java/com/fdkankan/db/config/DruidDataSourceProperties.java

@@ -0,0 +1,166 @@
+package com.fdkankan.db.config;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+
+@ConfigurationProperties(prefix = "spring.datasource.druid")
+public class DruidDataSourceProperties {
+
+    // jdbc
+    private String driverClassName;
+    private String url;
+    private String username;
+    private String password;
+    // jdbc connection pool
+    private int initialSize;
+    private int minIdle;
+    private int maxActive = 100;
+    private long maxWait;
+    private long timeBetweenEvictionRunsMillis;
+    private long minEvictableIdleTimeMillis;
+    private String validationQuery;
+    private boolean testWhileIdle;
+    private boolean testOnBorrow;
+    private boolean testOnReturn;
+    private boolean poolPreparedStatements;
+    private int maxPoolPreparedStatementPerConnectionSize;
+    // filter
+    private String filters;
+
+    public int getInitialSize() {
+        return initialSize;
+    }
+
+    public void setInitialSize(int initialSize) {
+        this.initialSize = initialSize;
+    }
+
+    public int getMinIdle() {
+        return minIdle;
+    }
+
+    public void setMinIdle(int minIdle) {
+        this.minIdle = minIdle;
+    }
+
+    public int getMaxActive() {
+        return maxActive;
+    }
+
+    public void setMaxActive(int maxActive) {
+        this.maxActive = maxActive;
+    }
+
+    public long getMaxWait() {
+        return maxWait;
+    }
+
+    public void setMaxWait(long maxWait) {
+        this.maxWait = maxWait;
+    }
+
+    public long getTimeBetweenEvictionRunsMillis() {
+        return timeBetweenEvictionRunsMillis;
+    }
+
+    public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {
+        this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
+    }
+
+    public long getMinEvictableIdleTimeMillis() {
+        return minEvictableIdleTimeMillis;
+    }
+
+    public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {
+        this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
+    }
+
+    public String getValidationQuery() {
+        return validationQuery;
+    }
+
+    public void setValidationQuery(String validationQuery) {
+        this.validationQuery = validationQuery;
+    }
+
+    public boolean isTestWhileIdle() {
+        return testWhileIdle;
+    }
+
+    public void setTestWhileIdle(boolean testWhileIdle) {
+        this.testWhileIdle = testWhileIdle;
+    }
+
+    public boolean isTestOnBorrow() {
+        return testOnBorrow;
+    }
+
+    public void setTestOnBorrow(boolean testOnBorrow) {
+        this.testOnBorrow = testOnBorrow;
+    }
+
+    public boolean isTestOnReturn() {
+        return testOnReturn;
+    }
+
+    public void setTestOnReturn(boolean testOnReturn) {
+        this.testOnReturn = testOnReturn;
+    }
+
+    public boolean isPoolPreparedStatements() {
+        return poolPreparedStatements;
+    }
+
+    public void setPoolPreparedStatements(boolean poolPreparedStatements) {
+        this.poolPreparedStatements = poolPreparedStatements;
+    }
+
+    public int getMaxPoolPreparedStatementPerConnectionSize() {
+        return maxPoolPreparedStatementPerConnectionSize;
+    }
+
+    public void setMaxPoolPreparedStatementPerConnectionSize(int maxPoolPreparedStatementPerConnectionSize) {
+        this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
+    }
+
+    public String getFilters() {
+        return filters;
+    }
+
+    public void setFilters(String filters) {
+        this.filters = filters;
+    }
+
+    public String getDriverClassName() {
+        return driverClassName;
+    }
+
+    public void setDriverClassName(String driverClassName) {
+        this.driverClassName = driverClassName;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+}

+ 148 - 45
4dkankan-utils-fyun/src/main/java/com/fdkankan/fyun/oss/UploadToOssUtil.java

@@ -15,10 +15,14 @@ import com.amazonaws.services.s3.model.CannedAccessControlList;
 import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
 import com.amazonaws.services.s3.model.GetObjectRequest;
 import com.amazonaws.services.s3.model.PutObjectRequest;
+import com.amazonaws.services.s3.model.S3Object;
+import com.amazonaws.services.s3.model.S3ObjectInputStream;
+import com.amazonaws.services.s3.model.S3ObjectSummary;
 import com.fdkankan.fyun.constant.StorageType;
 import com.qiniu.common.Zone;
 import com.qiniu.storage.Configuration;
 import com.qiniu.storage.UploadManager;
+import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
@@ -81,18 +85,32 @@ public class UploadToOssUtil {
 	//上传的数据是byte[],key是上传后的文件名
 	public void upload(byte[] data,String key1) throws IOException{
 		log.info("开始上传文件 源路径:{},目标路径:{},type:{}" , new String(data, "UTF-8"),key1,type);
-		switch (type){
-			case "oss":uploadOss(data,key1); break;
-			case "aws": uploadAws(data,key1); break;
-			case "local":uploadLocal(data,key1);  break;
+		StorageType storageType = StorageType.get(type);
+		switch (storageType){
+			case OSS:
+				uploadOss(data,key1);
+				break;
+			case AWS:
+				uploadAws(data,key1);
+				break;
+			case LOCAL:
+				uploadLocal(data,key1);
+				break;
 		}
 	}
 	public void upload(String filePath, String key1) {
 		log.info("开始上传文件 源路径:{},目标路径:{},type:{}" , filePath,key1,type);
-		switch (type){
-			case "oss":uploadOss(filePath,key1); break;
-			case "aws": uploadAws(filePath,key1); break;
-			case "local":uploadLocal(filePath,key1);  break;
+		StorageType storageType = StorageType.get(type);
+		switch (storageType){
+			case OSS:
+				uploadOss(filePath,key1);
+				break;
+			case AWS:
+				uploadAws(filePath,key1);
+				break;
+			case LOCAL:
+				uploadLocal(filePath,key1);
+				break;
 		}
 	}
 	public void uploadSdk(String filePath, String key1) {
@@ -205,6 +223,8 @@ public class UploadToOssUtil {
 
 		} catch (Exception e) {
 			log.error(e.toString() + filePath);
+		} finally {
+			ossClient.shutdown();
 		}
 	}
 	public void uploadAws(String filePath, String key1){
@@ -406,39 +426,45 @@ public class UploadToOssUtil {
 	 * @param key1
 	 * @throws IOException
      */
-	private void uploadS3File(String filePath, String key1) throws IOException {
-		File file = new File(filePath);
-		if(!file.exists()){
-			log.info("要上传s3的文件不存在");
-			return;
-		}
-
+	private void uploadS3File(String filePath, String key1) throws Exception {
 		/**
 		 * 创建s3对象
 		 */
 		BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3key, s3secrey);
 		AmazonS3 s3 = AmazonS3ClientBuilder.standard()
-				.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
-				.withRegion(Regions.EU_WEST_2)
-				.build();
+			.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
+			.withRegion(Regions.EU_WEST_2)
+			.build();
+		try{
+			File file = new File(filePath);
+			if(!file.exists()){
+				log.info("要上传s3的文件不存在");
+				return;
+			}
 
-		// 设置文件并设置公读
-		com.amazonaws.services.s3.model.ObjectMetadata metadata = new com.amazonaws.services.s3.model.ObjectMetadata();
-		if(filePath.contains(".jpg")){
-			metadata.setContentType("image/jpeg");
-		}
-		if(filePath.contains(".png")){
-			metadata.setContentType("image/png");
-		}
-		PutObjectRequest request = new PutObjectRequest(s3bucket, key1, file);
-		request.withCannedAcl(CannedAccessControlList.PublicRead);
-		request.withMetadata(metadata);
+			// 设置文件并设置公读
+			com.amazonaws.services.s3.model.ObjectMetadata metadata = new com.amazonaws.services.s3.model.ObjectMetadata();
+			if(filePath.contains(".jpg")){
+				metadata.setContentType("image/jpeg");
+			}
+			if(filePath.contains(".png")){
+				metadata.setContentType("image/png");
+			}
+			PutObjectRequest request = new PutObjectRequest(s3bucket, key1, file);
+			request.withCannedAcl(CannedAccessControlList.PublicRead);
+			request.withMetadata(metadata);
 
-		// 上传文件
-		com.amazonaws.services.s3.model.PutObjectResult putObjectResult = s3.putObject(request);
-		if (StringUtils.isNotEmpty(putObjectResult.getETag())) {
-			log.info("s3上传文件成功:" + key1);
+			// 上传文件
+			com.amazonaws.services.s3.model.PutObjectResult putObjectResult = s3.putObject(request);
+			if (StringUtils.isNotEmpty(putObjectResult.getETag())) {
+				log.info("s3上传文件成功:" + key1);
+			}
+		}catch (Exception e){
+			throw e;
+		}finally {
+			s3.shutdown();
 		}
+
 	}
 
 	/**
@@ -555,34 +581,52 @@ public class UploadToOssUtil {
 		return false;
 	}
 
+	public List<String> listKeys(String sourcePath){
+		StorageType storageType = StorageType.get(type);
+		switch (storageType){
+			case OSS:
+				return this.listKeysFromAli(sourcePath);
+			case AWS:
+				return this.listKeysFromAws(sourcePath);
+			case LOCAL:
+				return this.listKeysFromLocal(sourcePath);
+		}
+		return null;
+	}
+
 	/**
 	 * 获得文件列表-阿里云
 	 * @return
 	 */
 	public List<String> listKeysFromAli(String sourcePath) {
-		OSSClient ossClient = new OSSClient(point, key, secrey);
 		List<String> keyList = new ArrayList<>();
+		OSSClient ossClient = new OSSClient(point, key, secrey);
 		boolean flag = true;
-		String maker = null;
+		String nextMaker = null;
+		ListObjectsRequest listObjectsRequest = new ListObjectsRequest(this.bucket);
+		//指定下一级文件
+		listObjectsRequest.setPrefix(sourcePath);
+		//设置分页的页容量
+		listObjectsRequest.setMaxKeys(200);
 		do
 		{
-			ListObjectsRequest listObjectsRequest = new ListObjectsRequest(this.bucket);
-			//指定下一级文件
-			listObjectsRequest.setPrefix(sourcePath);
 			//获取下一页的起始点,它的下一项
-			listObjectsRequest.setMarker(maker);
-			//设置分页的页容量
-			listObjectsRequest.setMaxKeys(200);
+			listObjectsRequest.setMarker(nextMaker);
 			ObjectListing objectListing = ossClient.listObjects(listObjectsRequest);
 			List<OSSObjectSummary> objectSummaries = objectListing.getObjectSummaries();
-			for (OSSObjectSummary objectSummary : objectSummaries) {
-				keyList.add(objectSummary.getKey());
+			List<String> collect = objectSummaries.stream().map(summary -> {
+				return summary.getKey();
+			}).collect(Collectors.toList());
+			if(CollUtil.isNotEmpty(collect)){
+				keyList.addAll(collect);
 			}
-			maker = objectListing.getNextMarker();
+			nextMaker = objectListing.getNextMarker();
 			//全部执行完后,为false
 			flag = objectListing.isTruncated();
 		} while (flag);
 
+		ossClient.shutdown();
+
 		return keyList;
 	}
 
@@ -592,6 +636,36 @@ public class UploadToOssUtil {
 	 */
 	public List<String> listKeysFromAws(String sourcePath) {
 		List<String> keyList = new ArrayList<>();
+
+		BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3key, s3secrey);
+		AmazonS3 s3 = AmazonS3ClientBuilder.standard()
+			.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
+			.withRegion(Regions.EU_WEST_2)
+			.build();
+
+		boolean flag = true;
+		String nextMaker = null;
+		com.amazonaws.services.s3.model.ListObjectsRequest listObjectsRequest = new com.amazonaws.services.s3.model.ListObjectsRequest();
+		listObjectsRequest.setBucketName(this.bucket);
+		listObjectsRequest.setPrefix(sourcePath);
+		listObjectsRequest.setMaxKeys(200);
+
+		do{
+			listObjectsRequest.setMarker(nextMaker);
+			com.amazonaws.services.s3.model.ObjectListing objectListing = s3.listObjects(listObjectsRequest);
+			List<S3ObjectSummary> objectSummaries = objectListing.getObjectSummaries();
+			List<String> collect =objectSummaries.stream().map(summary->{
+				return summary.getKey();
+			}).collect(Collectors.toList());
+			if(CollUtil.isNotEmpty(collect)){
+				keyList.addAll(collect);
+			}
+			nextMaker = objectListing.getNextMarker();
+			flag = objectListing.isTruncated();
+		}while (flag);
+
+		s3.shutdown();
+
 		return keyList;
 	}
 
@@ -650,6 +724,7 @@ public class UploadToOssUtil {
 		ossClient.shutdown();
 	}
 
+
 	/**
 	 * <p>
 	 拷贝-亚马逊
@@ -735,8 +810,36 @@ public class UploadToOssUtil {
 	 * @return
 	 */
 	public String getObjectContentFromAws(String bucketName, String objectName){
-		// TODO: 2022/1/21
+
+		try {
+			/**
+			 * 创建s3对象
+			 */
+			BasicAWSCredentials awsCreds = new BasicAWSCredentials(s3key, s3secrey);
+			AmazonS3 s3 = AmazonS3ClientBuilder.standard()
+				.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
+				.withRegion(Regions.EU_WEST_2)
+				.build();
+
+			GetObjectRequest request  = new GetObjectRequest(bucketName,objectName);
+			S3Object object = s3.getObject(request);
+			S3ObjectInputStream inputStream = object.getObjectContent();
+			StringBuilder content = new StringBuilder();
+			try(BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))){
+				while (true) {
+					String line = reader.readLine();
+					if (line == null) break;
+					content.append(line);
+				}
+			} catch (IOException e) {
+				log.error("读取aws文件流失败", e);
+			}
+			return content.toString();
+		} catch (Exception ase) {
+			log.error("amazonS3下载文件异常 " + ase.getMessage(), ase);
+		}
 		return null;
+
 	}
 
 	/**

+ 12 - 1
4dkankan-utils-redis/src/main/java/com/fdkankan/redis/constant/RedisKey.java

@@ -63,11 +63,22 @@ public class RedisKey {
 
     public static final String SCENE_BUILDING = SYSTEM_PREFIX+":scene:building:";
 
-    public static final String PREFIX_DOWNLOAD_PROGRESS="downloads:progress:";
+    /**
+     * 场景下载进度
+     */
+    public static final String PREFIX_DOWNLOAD_PROGRESS="downloads:progress:%s";
 
+    /**
+     * 即将要下载场景的场景码列表
+     */
     public static final String DOWNLOAD_TASK="downloads:task";
 
     /**
+     * 正在下载的场景码列表
+     */
+    public static final String SCENE_DOWNLOAD_ING="scene:downloads:ing";
+
+    /**
      * scenejson缓存
      */
     public static final String SCENE_JSON = "scenejson:num:%s";

+ 7 - 0
4dkankan-utils-redis/src/main/java/com/fdkankan/redis/constant/RedisLockKey.java

@@ -58,4 +58,11 @@ public class RedisLockKey {
      */
     public static String LOCK_FDKANKAN_SCENE_NUMS = "lock:4dkankan:scene:nums";
 
+    /**
+     * 同步场景
+     */
+    public static String LOCK_SCENE_SYNC = "lock:scene:sync:num:%s";
+
+
+
 }

+ 1 - 1
4dkankan-utils-redis/src/main/java/com/fdkankan/redis/util/RedisLockUtil.java

@@ -37,7 +37,7 @@ public class RedisLockUtil {
         int tryCount = 3;
         String threadId = String.valueOf(Thread.currentThread().getId());
         while (!locked && tryCount > 0) {
-            locked = redisTemplate.opsForValue().setIfAbsent(lockKey, threadId, expireTime, TimeUnit.MILLISECONDS);
+            locked = redisTemplate.opsForValue().setIfAbsent(lockKey, threadId, expireTime, TimeUnit.SECONDS);
             tryCount--;
             try {
                 Thread.sleep(300);

+ 36 - 2
4dkankan-utils-redis/src/main/java/com/fdkankan/redis/util/RedisUtil.java

@@ -514,13 +514,47 @@ public class RedisUtil<K, V>{
     }
 
     /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    public boolean lLeftPushAll(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().leftPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 将list放入缓存
+     *
+     * @param key   键
+     * @param value 值
+     * @return
+     */
+    public boolean lLeftPush(String key, String value) {
+        try {
+            redisTemplate.opsForList().leftPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
      *
      * @param key   键
      * @return
      */
-    public Object lLeftPop(String key) {
+    public String lLeftPop(String key) {
         try {
-            return redisTemplate.opsForList().leftPop(key);
+            return (String)redisTemplate.opsForList().leftPop(key);
         } catch (Exception e) {
             e.printStackTrace();
             return null;