by su 3 years ago
parent
commit
fab0fb8a7c

+ 21 - 0
4dkankan-common-utils/pom.xml

@@ -61,5 +61,26 @@
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
         </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+            <version>5.2.15.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.10.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.6.0</version>
+        </dependency>
+
+
     </dependencies>
 </project>

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

@@ -1,240 +0,0 @@
-package com.fdkankan.common.utils;
-
-import java.io.*;
-import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-import java.nio.channels.FileChannel.MapMode;
-
-/**
- * @author MeepoGuan
- *
- * <p>Description: file_util</p>
- *
- * 2017年4月30日
- *
- */
-public class FileUtil {
-
-/*	public static void main(String[] args) {
-		String dirName = "d:/FH/topic/";// 创建目录
-		FileUtil.createDir(dirName);
-	}*/
-
-	/**
-	 * 创建目录
-	 * 
-	 * @param destDirName
-	 *            目标目录名
-	 * @return 目录创建成功返回true,否则返回false
-	 */
-	public static boolean createDir(String destDirName) {
-		File dir = new File(destDirName);
-		if (dir.exists()) {
-			return false;
-		}
-		if (!destDirName.endsWith(File.separator)) {
-			destDirName = destDirName + File.separator;
-		}
-		// 创建单个目录
-		if (dir.mkdirs()) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * 删除文件
-	 * 
-	 * @param filePathAndName
-	 *            String 文件路径及名称 如c:/fqf.txt
-	 * @return boolean
-	 */
-	public static void delFile(String filePathAndName) {
-		try {
-			String filePath = filePathAndName;
-			filePath = filePath.toString();
-			File myDelFile = new File(filePath);
-			myDelFile.delete();
-
-		} catch (Exception e) {
-			System.out.println("删除文件操作出错");
-			e.printStackTrace();
-
-		}
-
-	}
-
-	/**
-	 * 读取到字节数组0
-	 * 
-	 * @param filePath //路径
-	 * @throws IOException
-	 */
-	public static byte[] getContent(String filePath) throws IOException {
-		File file = new File(filePath);
-		long fileSize = file.length();
-		if (fileSize > Integer.MAX_VALUE) {
-			System.out.println("file too big...");
-			return null;
-		}
-		FileInputStream fi = new FileInputStream(file);
-		byte[] buffer = new byte[(int) fileSize];
-		int offset = 0;
-		int numRead = 0;
-		while (offset < buffer.length
-				&& (numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {
-			offset += numRead;
-		}
-		// 确保所有数据均被读取
-		if (offset != buffer.length) {
-			throw new IOException("Could not completely read file "
-					+ file.getName());
-		}
-		fi.close();
-		return buffer;
-	}
-
-	/**
-	 * 读取到字节数组1
-	 * 
-	 * @param filePath
-	 * @return
-	 * @throws IOException
-	 */
-	public static byte[] toByteArray(String filePath) throws IOException {
-
-		File f = new File(filePath);
-		if (!f.exists()) {
-			throw new FileNotFoundException(filePath);
-		}
-		ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());
-		BufferedInputStream in = null;
-		try {
-			in = new BufferedInputStream(new FileInputStream(f));
-			int buf_size = 1024;
-			byte[] buffer = new byte[buf_size];
-			int len = 0;
-			while (-1 != (len = in.read(buffer, 0, buf_size))) {
-				bos.write(buffer, 0, len);
-			}
-			return bos.toByteArray();
-		} catch (IOException e) {
-			e.printStackTrace();
-			throw e;
-		} finally {
-			try {
-				in.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-			bos.close();
-		}
-	}
-
-	/**
-	 * 读取到字节数组2
-	 * 
-	 * @param filePath
-	 * @return
-	 * @throws IOException
-	 */
-	public static byte[] toByteArray2(String filePath) throws IOException {
-
-		File f = new File(filePath);
-		if (!f.exists()) {
-			throw new FileNotFoundException(filePath);
-		}
-
-		FileChannel channel = null;
-		FileInputStream fs = null;
-		try {
-			fs = new FileInputStream(f);
-			channel = fs.getChannel();
-			ByteBuffer byteBuffer = ByteBuffer.allocate((int) channel.size());
-			while ((channel.read(byteBuffer)) > 0) {
-				// do nothing
-				// System.out.println("reading");
-			}
-			return byteBuffer.array();
-		} catch (IOException e) {
-			e.printStackTrace();
-			throw e;
-		} finally {
-			try {
-				channel.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-			try {
-				fs.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Mapped File way MappedByteBuffer 可以在处理大文件时,提升性能
-	 * 
-	 * @param filePath
-	 * @return
-	 * @throws IOException
-	 */
-	public static byte[] toByteArray3(String filePath) throws IOException {
-
-		FileChannel fc = null;
-		RandomAccessFile rf = null;
-		try {
-			rf = new RandomAccessFile(filePath, "r");
-			fc = rf.getChannel();
-			MappedByteBuffer byteBuffer = fc.map(MapMode.READ_ONLY, 0,
-					fc.size()).load();
-			//System.out.println(byteBuffer.isLoaded());
-			byte[] result = new byte[(int) fc.size()];
-			if (byteBuffer.remaining() > 0) {
-				// System.out.println("remain");
-				byteBuffer.get(result, 0, byteBuffer.remaining());
-			}
-			return result;
-		} catch (IOException e) {
-			e.printStackTrace();
-			throw e;
-		} finally {
-			try {
-				rf.close();
-				fc.close();
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-    public static File[] sort(File[] s) {
-        //中间值
-        File temp = null;
-        //外循环:我认为最小的数,从0~长度-1
-        for (int j = 0; j < s.length - 1; j++) {
-            //最小值:假设第一个数就是最小的
-            String min = s[j].getName();
-            //记录最小数的下标的
-            int minIndex = j;
-            //内循环:拿我认为的最小的数和后面的数一个个进行比较
-            for (int k = j + 1; k < s.length; k++) {
-                //找到最小值
-                if (Integer.parseInt(min.substring(0, min.indexOf("."))) > Integer.parseInt(s[k].getName().substring(0, s[k].getName().indexOf(".")))) {
-                    //修改最小
-                    min = s[k].getName();
-                    minIndex = k;
-                }
-            }
-            //当退出内层循环就找到这次的最小值
-            //交换位置
-            temp = s[j];
-            s[j] = s[minIndex];
-            s[minIndex] = temp;
-        }
-        return s;
-    }
-}

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

@@ -0,0 +1,50 @@
+package com.fdkankan.utils.constant;
+
+// 6001-7000 相机状态码
+public enum CameraConstant {
+
+    FAILURE_6001(6001,"sn码重复"),
+    FAILURE_6002(6002,"退充值超过了充值总额"),
+    FAILURE_6003(6003,"该相机未被绑定,请前往 我的相机 先绑定相机后再进行授权 "),
+    FAILURE_6004(6004,"表示相机的点数超过了10万"),
+    FAILURE_6005(6005,"无权操作该相机"),
+    FAILURE_6006(6006,"不支持重复绑定"),
+    FAILURE_6007(6007,"八目相机不支持解除绑定"),
+    FAILURE_6008(6008,"相机容量不足"),
+    FAILURE_6009(6009,"data.fdage文件不存在"),
+    FAILURE_6010(6010,"该序列号已被绑定"),
+    FAILURE_6011(6011,"查询不到企业相机列表"),
+    FAILURE_6012(6012,"相机未绑定用户"),
+    FAILURE_6013(6013,"必须输入需迁相机所绑定用户的验证码"),
+    FAILURE_6014(6014,"必须输入目标相机所绑定用户的验证码"),
+    FAILURE_6015(6015,"该相机已添加协作者,请先取消协作后再添加"),
+    FAILURE_6016(6016,"部分相机已添加协作者,请先取消协作后再添加"),
+    FAILURE_6017(6017,"设备已出库,不可删除"),
+    FAILURE_6018(6018,"设备类型不存在"),
+    FAILURE_6019(6019,"sn码未填写"),
+    FAILURE_6020(6020,"sn码不存在"),
+    FAILURE_6021(6021,"出库类型未填写"),
+    FAILURE_6022(6022,"出库类型不存在"),
+    FAILURE_6023(6023,"经销商未填写"),
+    FAILURE_6024(6024,"经销商类型不存在"),
+    FAILURE_6025(6025,"sn码未出库"),
+    FAILURE_6026(6026,"客户名称未填写"),
+    FAILURE_6027(6027,"客户名称不存在"),
+    FAILURE_6028(6028,"相机类型不正确!"),
+    ;
+    private Integer code;
+    private String message;
+
+    private CameraConstant(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+}

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

@@ -0,0 +1,158 @@
+package com.fdkankan.utils.constant;
+
+public enum ErrorCode {
+
+    SYSTEM_ERROR(-1, "服务器异常"),
+    PARAM_ERROR(-2, "解析请求参数出错"),
+    PARAM_REQUIRED(-3, "缺少必要参数"),
+    PARAM_FORMAT_ERROR(-4, "解析请求参数出错"),
+    SYSTEM_BUSY(-5, "系统繁忙,请稍后再试!"),
+    AUTH_FAIL(4000, "鉴权失败!"),
+    NON_TOKEN(4001, "无token,请重新登录"),
+    TOKEN_ILLEGAL(4002, "token不合法"),
+    TOKEN_NOT_FOUND(4003, "用户未登录"),
+    APP_ID_ILLEGAL(4004 , "非法的APP ID"),
+    USER_NOT_EXIST(4005,"用户不存在"),
+    PASSWORD_ERROR(4006,"账号密码错误"),
+    MISSING_REQUIRED_PARAMETERS(4007,"缺少必要参数"),
+    USER_NOT_LOGIN(4008, "用户未登录"),
+    NOT_RECORD(4009, "暂无记录"),
+    ERROR_MSG(40010, "操作失败"),
+    EMPTY_FILE(40011, "空文件"),
+    AGENT_EXIST(40012, "经销商已存在"),
+    AGENT_NOT_EXIST(40012, "经销商已存在"),
+    AGENT_SUB_EXIST(40013, "请先删除经销商下的用户"),
+    EMAIL_ERROR(40014, "邮箱格式不正确"),
+    PASSWORD_VIOLATION(40015, "密码需要包含英文大小写、数字,长度8-16字符"),
+    PASSWORD_TWO_VIOLATION(40016, "两次输入的密码不一致"),
+    PHONE_VIOLATION(40017, "手机号码格式错误"),
+    PHONE_EXIST(40018, "该手机已被注册"),
+    V_CODE_ERROR(40019, "验证码错误"),
+    NICKNAME_ERROR(40020, "昵称包含敏感词"),
+    V_CODE_TIME_NOT_OUT(40021, "60秒内不能重复获取验证码"),
+    PHONE_CODE_TO_MANY(40022, "手机验证码获取验证码次数过多,请明天再试"),
+    EMAIL_EXIST(40023, "手机验证码获取验证码次数过多,请明天再试"),
+    CAMERA_BIND_NO_EXIST(40024, "绑定的相机不存在"),
+    VALUE_NOT_EXIST(40025, "当前增值权益不存在"),
+    CAMERA_NOT_OWN(40026, "不能将相机分配给自己"),
+    CAMERA_GIVEN(40027, "当前相机已被授权,请选择另外相机绑定"),
+    FILE_NOT_EXIST(40027, "需要上传或使用的文件不存在"),
+    NOT_PERMISSION(40027, "登录失败,账号无权访问"),
+
+
+
+
+    FAILURE_CODE_3001(3001, "缺少必要参数"),
+    FAILURE_CODE_3002(3002, "访问异常!"),
+    FAILURE_CODE_3003(3003, "非法访问!"),
+    FAILURE_CODE_3004(3004, "用户未登录"),
+    FAILURE_CODE_3005(3005, "验证码已过期"),
+    FAILURE_CODE_3006(3006, "验证码错误"),
+    FAILURE_CODE_3007(3007, "昵称已存在"),
+    FAILURE_CODE_3008(3008, "该手机已被注册"),
+    FAILURE_CODE_3009(3009, "两次输入的密码不一致"),
+    FAILURE_CODE_3010(3010, "昵称长度错误"),
+    FAILURE_CODE_3011(3011, "密码需要包含英文大小写、数字,长度8-16字符"),
+    FAILURE_CODE_3012(3012, "昵称包含敏感词"),
+    FAILURE_CODE_3013(3013, "手机号码格式错误"),
+    FAILURE_CODE_3014(3014, "账号或密码不正确"),
+    FAILURE_CODE_3015(3015, "用户不存在"),
+    FAILURE_CODE_3016(3016, "登录失败,账号无权访问"),
+    FAILURE_CODE_3017(3017, "空文件"),
+    FAILURE_CODE_3018(3018, "需要上传或使用的文件不存在"),
+    FAILURE_CODE_3019(3019, "邮箱格式不正确"),
+    FAILURE_CODE_3020(3020, "邮箱地址已存在"),
+    FAILURE_CODE_3021(3021, "账号不存在,请核对后重新输入。"),
+    FAILURE_CODE_3022(3022, "该场景已添加协作者,请先取消协作后再添加"),
+    FAILURE_CODE_3023(3023, "手机验证码获取验证码次数过多,请明天再试"),
+    FAILURE_CODE_3024(3024, "不能将场景协作给自己"),
+    FAILURE_CODE_3025(3025, "不能将相机分配给自己"),
+    FAILURE_CODE_3026(3026, "有部分场景已存在协作者,请先取消协作后再添加"),
+    FAILURE_CODE_3027(3027, "原密码错误"),
+    FAILURE_CODE_3028(3028, "角色已存在"),
+    FAILURE_CODE_3029(3029, "当前角色存在关联的用户,请先删除用户或修改用户所属角色"),
+    FAILURE_CODE_3030(3030, "当前增值权益不存在"),
+    FAILURE_CODE_3031(3031, "相机已绑定"),
+    FAILURE_CODE_3032(3032, "当前相机已被授权,请选择另外相机绑定"),
+    FAILURE_CODE_3033(3033, "60秒内不能重复获取验证码"),
+
+
+    FAILURE_CODE_5001(5001, "modeldata.json为空"),
+    FAILURE_CODE_5002(5002, "order值为空"),
+    FAILURE_CODE_5003(5003, "guideSid或order值为空"),
+    FAILURE_CODE_5004(5004, "guideSid或guideName值为空"),
+    FAILURE_CODE_5005(5005, "场景为空"),
+    FAILURE_CODE_5006(5006, "余额不足"),
+    FAILURE_CODE_5007(5007, "非八目场景"),
+    FAILURE_CODE_5008(5008, "该场景已经被封存,无法删除"),
+    FAILURE_CODE_5009(5009, "场景被删除"),
+    FAILURE_CODE_5010(5010, "场景不属于该相机"),
+    FAILURE_CODE_5011(5011, "创建"),
+    FAILURE_CODE_5012(5012, "数据不正常"),
+    FAILURE_CODE_5013(5013, "场景对应的用户名为空"),
+    FAILURE_CODE_5014(5014, "该用户无权操作该场景"),
+    FAILURE_CODE_5015(5015, "该场景不属于当前登录账号"),
+    FAILURE_CODE_5016(5016, "热点外链场景不对"),
+    FAILURE_CODE_5017(5017, "*上传模型失败,请参照右侧教程"),
+    FAILURE_CODE_5018(5018, "zip文件只能有一层目录或无目录"),
+    FAILURE_CODE_5019(5019, "必须有且仅有一个obj和mtl文件"),
+    FAILURE_CODE_5020(5020, "贴图需控制在1.5M以内,obj文件需要控制在20M以内。"),
+    FAILURE_CODE_5021(5021, "场景密钥不正确"),
+    FAILURE_CODE_5022(5022, "上传文件格式,名称不一致"),
+    FAILURE_CODE_5023(5023, "上传文件格式不正确,只能是jpg或mp4格式"),
+    FAILURE_CODE_5024(5024, "有场景打包中,请稍后重试"),
+    FAILURE_CODE_5025(5025, "数据包不存在,请先打成zip包"),
+    FAILURE_CODE_5026(5026, "上传的压缩包类型不正确"),
+    FAILURE_CODE_5027(5027, "文件夹不存在"),
+    FAILURE_CODE_5028(5028, "无权修改该文件夹"),
+    FAILURE_CODE_5029(5029, "场景下载失败,请稍后重试"),
+    FAILURE_CODE_5030(5030, "同级文件夹名称不能重复"),
+    FAILURE_CODE_5031(5031, "场景打包中不能重复操作"),
+    FAILURE_CODE_5032(5032, "三维家打包记录不存在"),
+    FAILURE_CODE_5033(5033, "该场景正在计算中"),
+    FAILURE_CODE_5034(5034, "该场景已封存"),
+    FAILURE_CODE_5035(5035, "任务已存在"),
+    FAILURE_CODE_5036(5036, "获取锁失败"),
+    FAILURE_CODE_5037(5037, "上传图片失败"),
+    FAILURE_CODE_5038(5038, "文件不存在"),
+    FAILURE_CODE_5039(5039, "画墙重建模型失败"),
+    FAILURE_CODE_5040(5040, "上传音频失败"),
+    FAILURE_CODE_5041(5041, "上传图片多媒体数据失败"),
+    FAILURE_CODE_5042(5042, "算法计算失败"),
+    FAILURE_CODE_5043(5043, "打包zip失败"),
+    FAILURE_CODE_5044(5044, "mac为空"),
+    FAILURE_CODE_5045(5045, "totalPicNum为空"),
+    FAILURE_CODE_5046(5046, "chunks为空"),
+    FAILURE_CODE_5047(5047, "folderName为空"),
+    FAILURE_CODE_5048(5048, "文件为空"),
+    FAILURE_CODE_5049(5049, "文件Id为空"),
+    FAILURE_CODE_5050(5050, "照片数目为空"),
+    FAILURE_CODE_5051(5051, "md5为空"),
+    FAILURE_CODE_5052(5052, "上传失败, 请重新上传。"),
+    FAILURE_CODE_5053(5053, "场景码生成失败,请重试。"),
+    FAILURE_CODE_5054(5054, "该场景不存在无法扣除容量"),
+    FAILURE_CODE_5055(5055, "该场景不属于八目相机无法扣除容量"),
+    FAILURE_CODE_5056(5056, "双目相机异常"),
+
+
+
+    ;
+
+    private Integer code;
+    private String message;
+
+    private ErrorCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+
+
+}

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

@@ -0,0 +1,34 @@
+package com.fdkankan.utils.constant;
+
+public enum ServerCode {
+
+	SUCCESS(0, "操作成功"),
+	SYSTEM_ERROR(-1, "服务器异常"),
+	PARAM_ERROR(-2, "解析请求参数出错"),
+	PARAM_REQUIRED(-3, "缺少必要参数"),
+
+	AUTH_FAIL(3000, "鉴权失败!"),
+	NON_TOKEN(3001, "无token,请重新登录"),
+	TOKEN_ILLEGAL(3002, "token不合法"),
+	TOKEN_NOT_FOUND(3003, "用户未登录"),
+
+
+	APP_ID_ILLEGAL(3100 , "非法的APP ID")
+	;
+	
+	private Integer code;
+	private String message;
+
+	private ServerCode(Integer code, String message) {
+		this.code = code;
+		this.message = message;
+	}
+
+	public Integer code() {
+		return code;
+	}
+
+	public String message() {
+		return message;
+	}
+}

+ 27 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/utils/exception/BusinessException.java

@@ -0,0 +1,27 @@
+package com.fdkankan.utils.exception;
+
+import com.fdkankan.utils.constant.CameraConstant;
+import com.fdkankan.utils.constant.ErrorCode;
+import lombok.Data;
+
+/**
+ * 自定义业务异常类
+ */
+@Data
+public class BusinessException extends RuntimeException {
+    private int code;
+    private String message;
+
+    public BusinessException(ErrorCode errorCode){
+        this.code = errorCode.code();
+        this.message = errorCode.message();
+    }
+    public BusinessException(CameraConstant errorCode){
+        this.code = errorCode.code();
+        this.message = errorCode.message();
+    }
+    public BusinessException(int code, String msg){
+        this.code = code;
+        this.message = msg;
+    }
+}

+ 25 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/utils/response/PageInfo.java

@@ -0,0 +1,25 @@
+package com.fdkankan.utils.response;
+
+import lombok.Data;
+
+@Data
+public class PageInfo {
+
+    private int page;
+
+    private int pageSize;
+
+    private int total;
+
+    private Object list;
+
+    public static PageInfo pageInfo (int page ,int pageSize,int total,Object data){
+        PageInfo pageInfo = new PageInfo();
+        pageInfo.setPage(page);
+        pageInfo.setPageSize(pageSize);
+        pageInfo.setTotal(total);
+        pageInfo.setList(data);
+        return  pageInfo;
+    }
+
+}

+ 73 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/utils/response/ResultData.java

@@ -0,0 +1,73 @@
+package com.fdkankan.utils.response;
+
+import com.fdkankan.utils.constant.ErrorCode;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResultData<T> implements Serializable {
+    /**
+     * 状态码
+     */
+    private int code;
+    /**
+     * 响应信息
+     */
+    private String message;
+    /**
+     * 后端返回结果
+     */
+    private T data;
+    /**
+     * 后端返回结果
+     */
+    private Boolean success;
+    /**
+     * 响应时间戳
+     */
+    private long timestamp = Calendar.getInstance().getTimeInMillis();
+
+    public static ResultData ok() {
+        return ok("");
+    }
+    public static ResultData ok(Object data) {
+        return ok("", data);
+    }
+    public static ResultData ok(String msg, Object data) {
+        return base(200, msg, data,true);
+    }
+
+    public static ResultData ok(int page,int pageSize,int total,Object data){
+        PageInfo pageInfo = new PageInfo();
+        pageInfo.setPage(page);
+        pageInfo.setPageSize(pageSize);
+        pageInfo.setTotal(total);
+        pageInfo.setList(data);
+        return  ok(pageInfo);
+    }
+
+    public static ResultData error(int code, String msg) {
+        return error(code, msg, ""); }
+    public static ResultData error(int code, String msg, Object data) {
+        return base(code, msg, data,false);
+    }
+
+    public static ResultData error(ErrorCode errorCode) {
+        return error(errorCode.code(), errorCode.message());
+    }
+
+    private static ResultData  base(int code, String msg, Object data,Boolean success) {
+        ResultData rd = new ResultData();
+        rd.setCode(code);
+        rd.setMessage(msg);
+        rd.setData(data);
+        rd.setSuccess(success);
+        return rd;
+    }
+}

+ 136 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/utils/utils/DataUtils.java

@@ -0,0 +1,136 @@
+package com.fdkankan.utils.utils;
+
+import cn.hutool.core.util.StrUtil;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author abnerhou
+ * @date 2020/4/23 17:35
+ * @desciption
+ */
+@Component
+public class DataUtils {
+
+    public static BigDecimal getBigDecimalObj(Object data) {
+
+        if (null == data) {
+            return null;
+        } else if (data instanceof String) {
+            String dataStr = (String) data;
+            if (!StringUtils.isEmpty(dataStr.trim())) {
+                return new BigDecimal(dataStr.trim());
+            }
+        } else if (data instanceof Long) {
+            Long dataLong = (Long) data;
+            return BigDecimal.valueOf(dataLong);
+        } else if (data instanceof Integer) {
+            Integer dataInt = (Integer) data;
+            return BigDecimal.valueOf(dataInt);
+
+        } else if (data instanceof Double) {
+            Double dataDouble = (Double) data;
+            return BigDecimal.valueOf(dataDouble);
+        }
+
+        return null;
+
+    }
+
+    public static Integer getInteger(Object object) {
+        if (null == object) {
+            return new Integer(0);
+        }
+        if (object instanceof String) {
+            String ojStr = (String) object;
+            if (StringUtils.isEmpty(ojStr)) {
+                //TODO:在斟酌这里的处理方式
+                return new Integer(0);
+            } else {
+                return new Integer(Integer.parseInt(ojStr.trim()));
+            }
+        } else if (object instanceof Integer) {
+            return (Integer) object;
+        } else if (object instanceof Long) {
+            return (Integer) object;
+        } else if (object instanceof Double) {
+            return (Integer) object;
+        } else {
+            return new Integer(0);
+        }
+    }
+
+    public static Long getLongReturnNullIfNotExit(Object num){
+        if(null == num){
+            return null;
+        }else if(num instanceof String){
+            if(StrUtil.isNotBlank((String) num)){
+                String numStr = (String) num;
+                return Long.parseLong(numStr.trim());
+            }
+        }else if(num instanceof Integer){
+            return (Long) num;
+        }else if(num instanceof  Long){
+            return (Long) num;
+        }
+        return null;
+    }
+
+    public static Integer getIntegerWithDefault(Object object, boolean withDefault) {
+        if (null == object) {
+
+            return withDefault ? new Integer(0) : null;
+        }
+        if (object instanceof String) {
+            String ojStr = (String) object;
+            if (StringUtils.isEmpty(ojStr)) {
+
+                return withDefault ? new Integer(0) : null;
+            } else {
+                return new Integer(Integer.parseInt(ojStr.trim()));
+            }
+        } else if (object instanceof Integer) {
+            return (Integer) object;
+        } else if (object instanceof Long) {
+            return (Integer) object;
+        } else if (object instanceof Double) {
+            return (Integer) object;
+        } else {
+            return withDefault ? new Integer(0) : null;
+        }
+    }
+
+    public static Map<String, Object> assembleResult(long totalNum, long totalPageNum, long currPageNum, Object list) {
+        Map<String, Object> resultMap = new HashMap<String, Object>();
+        resultMap.put("totalNum", totalNum);
+        resultMap.put("totalPageNum", totalPageNum);
+        resultMap.put("curPage", currPageNum);
+        resultMap.put("list", list);
+        return resultMap;
+    }
+
+//    public static <T> void assembleTimeQueryWrapper(Map<String, Object> constantQuery, String dynamicQuery,
+//                                                    QueryWrapper<T> queryWrapper, String idQuery,
+//                                                    String secondQuery, String thirdQuery) {
+//        assembleConstantQuery(queryWrapper, constantQuery);
+//        if (org.apache.commons.lang3.StringUtils.isNotBlank(dynamicQuery)) {
+//            queryWrapper.and(wrapper -> wrapper
+//                    .or().like(org.apache.commons.lang3.StringUtils.isNotBlank(secondQuery), secondQuery, dynamicQuery)
+//                    .or().like(org.apache.commons.lang3.StringUtils.isNotBlank(thirdQuery), thirdQuery, dynamicQuery)
+//                    .or().like(dynamicQuery.length() <= 32 && org.apache.commons.lang3.StringUtils.isNotBlank(idQuery), idQuery, dynamicQuery));
+//        }
+//
+//    }
+
+//    public static <T> void assembleConstantQuery(QueryWrapper<T> queryWrapper, Map<String, Object> constantQuery) {
+//        if (null != queryWrapper && !CollectionUtils.isEmpty(constantQuery)) {
+//            for (Map.Entry<String, Object> entry : constantQuery.entrySet()) {
+//                queryWrapper.eq(entry.getKey(), entry.getValue());
+//            }
+//        }
+//    }
+}

+ 126 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/utils/utils/JwtUtil.java

@@ -0,0 +1,126 @@
+package com.fdkankan.utils.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.exceptions.JWTDecodeException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.JwtBuilder;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+public class JwtUtil {
+
+    //生成签名的时候使用的秘钥secret
+    private static final String SECRET = "XX#$%()(#*!()!KL<><MQLMNQNQJQK&sdfkjsdrow32234545fdf>?N<:{LWPW";
+
+    /**
+     * 用户登录成功后生成Jwt
+     * 使用Hs256算法  私匙使用用户密码
+     *
+     * @param ttlMillis jwt过期时间
+     * @param userName  用户名
+     * @return
+     */
+    public static String createJWT(long ttlMillis, String userName, String loginType) {
+        //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
+        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
+
+        //生成JWT的时间
+        long nowMillis = System.currentTimeMillis();
+        Date now = new Date(nowMillis);
+
+        //创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
+        Map<String, Object> claims = new HashMap<String, Object>();
+        claims.put("userName", userName);
+        claims.put("loginType", loginType);
+
+        //下面就是在为payload添加各种标准声明和私有声明了
+        //这里其实就是new一个JwtBuilder,设置jwt的body
+        JwtBuilder builder = Jwts.builder()
+                //如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
+                .setClaims(claims)
+                //设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
+                .setId(UUID.randomUUID().toString())
+                //iat: jwt的签发时间
+                .setIssuedAt(now)
+                //代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串,可以存放什么userid,roldid之类的,作为什么用户的唯一标志。
+                .setSubject(userName)
+                //设置签名使用的签名算法和签名使用的秘钥
+                .signWith(signatureAlgorithm, SECRET);
+
+        if (ttlMillis >= 0) {
+            long expMillis = nowMillis + ttlMillis;
+            Date exp = new Date(expMillis);
+            //设置过期时间
+            builder.setExpiration(exp);
+        }/*else{
+            //设置过期时间半小时
+            DateTime expDate = new DateTime().plusMinutes(30);
+            builder.setExpiration(expDate.toDate());
+        }*/
+        return builder.compact();
+    }
+
+
+    /**
+     * Token的解密
+     * @param token 加密后的token
+     * @return
+     */
+    public static Claims parseJWT(String token) {
+        //得到DefaultJwtParser
+        Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+        return claims;
+    }
+
+
+    /**
+     * 校验token
+     * 在这里可以使用官方的校验,我这里校验的是token中携带的密码于数据库一致的话就校验通过
+     * @param token
+     * @param userName
+     * @return
+     */
+    public static Boolean isVerify(String token, String userName) {
+
+        //得到DefaultJwtParser
+        Claims claims = Jwts.parser()
+                //设置签名的秘钥
+                .setSigningKey(SECRET)
+                //设置需要解析的jwt
+                .parseClaimsJws(token).getBody();
+
+        if (claims.get("userName").equals(userName)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 获得token中的信息无需secret解密也能获得
+     *
+     * @return token中包含的用户名
+     */
+    public static String getUsername(String token) {
+        try {
+            DecodedJWT jwt = JWT.decode(token);
+            return jwt.getClaim("userName").asString();
+        } catch (JWTDecodeException e) {
+            return null;
+        }
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getUsername("eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMzExMjMxMTE3OCIsInVzZXJOYW1lIjoiMTMxMTIzMTExNzgiLCJpYXQiOjE1NjQwNDY0OTgsImp0aSI6IjhhZWJlNzhlLTU2OGUtNDY2Yi1iY2E3LWQ4ZjI0MjgxYzJhZCJ9.1N3UNjkT39mXtymfkJQVQJxOlFM3gfC6bgfur5mVmEU"));
+    }
+
+}

+ 57 - 0
4dkankan-common-utils/src/main/java/com/fdkankan/utils/utils/SHAUtils.java

@@ -0,0 +1,57 @@
+package com.fdkankan.utils.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * @author abnerhou
+ * @date 2020/6/5 11:33
+ * @desciption
+ */
+public class SHAUtils {
+
+    /**
+     * 利用java原生的类实现SHA256加密
+     *
+     * @param str
+     * @return
+     */
+    public static String getSHA256(String str) {
+        MessageDigest messageDigest;
+        String encodestr = "";
+        try {
+            messageDigest = MessageDigest.getInstance("SHA-256");
+            messageDigest.update(str.getBytes("UTF-8"));
+            encodestr = byte2Hex(messageDigest.digest());
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return encodestr;
+    }
+
+
+    //15 转16进制
+
+    /**
+     * 将byte转为16进制
+     *
+     * @param bytes
+     * @return
+     */
+    public static String byte2Hex(byte[] bytes) {
+        StringBuffer stringBuffer = new StringBuffer();
+        String temp = null;
+        for (int i = 0; i < bytes.length; i++) {
+            temp = Integer.toHexString(bytes[i] & 0xFF);
+            if (temp.length() == 1) {
+                //1得到一位的进行补0操作
+                stringBuffer.append("0");
+            }
+            stringBuffer.append(temp);
+        }
+        return stringBuffer.toString();
+    }
+}

+ 11 - 0
4dkankan-utils-redis/pom.xml

@@ -18,6 +18,17 @@
             <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.3.12.RELEASE</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.10</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+            <version>2.5.0</version>
+        </dependency>
     </dependencies>
 
 

+ 100 - 0
4dkankan-utils-redis/src/main/java/com/fdkankan/redis/constant/RedisKey.java

@@ -0,0 +1,100 @@
+package com.fdkankan.redis.constant;
+
+public class RedisKey {
+
+    /**
+     * 过期时间:1分钟
+     */
+    public static int EXPIRE_TIME_1_MINUTE = 1*60*1000;
+
+    /**
+     * 过期时间:10分钟
+     */
+    public static int EXPIRE_TIME_10_MINUTE = 10*60*1000;
+
+    /**
+     * 过期时间:30分钟
+     */
+    public static int EXPIRE_TIME_30_MINUTE = 30*60*1000;
+
+    /**
+     * 过期时间:2小时
+     */
+    public static int EXPIRE_TIME_2_HOUR = 2*60*60*1000;
+
+
+
+    /**
+     * 登录token
+     */
+    public static String TOKEN_USER_TYPE = "token:user:type:%s:%s";
+
+    /**
+     * 开发者信息
+     */
+    public static String TM_DEVELOPER = "developer:appid:%s";
+
+    /**
+     * 场景浏览量
+     */
+    public static String SCENE_VISIT_CNT = "scene:visit:cnt:scenecode:%s";
+    /**
+     * 场景浏览量
+     */
+    public static String LOCK_SCENE_VISIT_CNT = "lock:scene:visit:cnt:scenecode:%s";
+
+    /**
+     * 场景访问量更新锁 hash
+     */
+    public static String LOCK_SCENE_VISIT_UPDATE = "lock:scene:visit:update";
+
+    /**
+     * 场景上传图片锁
+     */
+    public static String LOCK_UPLOAD_PIC = "lock:upload:pic:scenecode:%s";
+
+    /**
+     * 场景pro上传图片锁
+     */
+    public static String LOCK_UPLOAD_PRO_PIC = "lock:upload:pro:pic:scenecode:%s";
+
+    /**
+     * 场景上传音频锁
+     */
+    public static String LOCK_UPLOAD_VOICE = "lock:upload:voice:scenecode:%s";
+
+    /**
+     * 场景pro上传音频锁
+     */
+    public static String LOCK_UPLOAD_PRO_VOICE = "lock:upload:pro:voice:scenecode:%s";
+
+    /**
+     * 画墙重建模型锁
+     */
+    public static String LOCK_UPLOAD_FLOORJSON_REBUILD = "lock:upload:floorjson:rebuild:scenecode:%s";
+
+    /**
+     * 上传图片多媒体数据锁
+     */
+    public static String LOCK_UPLOAD_FLOORPLAN_PNG = "lock:upload:floorplan:png:scenecode:%s";
+
+    /**
+     * 场景码池
+     */
+    public static String FDKANKAN_SCENE_NUMS = "4dkankan:scene:nums";
+
+    /**
+     * 加载场景码池锁
+     */
+    public static String LOCK_FDKANKAN_SCENE_NUMS = "lock:4dkankan:scene:nums";
+
+
+
+
+
+
+
+
+
+
+}