diff --git a/bookMarkService/.gitignore b/bookMarkService/.gitignore
index 230c075..6b32111 100644
--- a/bookMarkService/.gitignore
+++ b/bookMarkService/.gitignore
@@ -1,5 +1,5 @@
HELP.md
-/target/
+target
!.mvn/wrapper/maven-wrapper.jar
### STS ###
diff --git a/bookMarkService/business/README.md b/bookMarkService/business/README.md
deleted file mode 100644
index bb12641..0000000
--- a/bookMarkService/business/README.md
+++ /dev/null
@@ -1 +0,0 @@
-**本模块用于存放所有业务逻辑,并作为springboot入口**
\ No newline at end of file
diff --git a/bookMarkService/business/bms/README.md b/bookMarkService/business/bms/README.md
deleted file mode 100644
index f542fc1..0000000
--- a/bookMarkService/business/bms/README.md
+++ /dev/null
@@ -1 +0,0 @@
-**本模块为书签云存储相关功能模块**
\ No newline at end of file
diff --git a/bookMarkService/business/bms/src/main/java/Test.java b/bookMarkService/business/bms/src/main/java/Test.java
deleted file mode 100644
index e69de29..0000000
diff --git a/bookMarkService/business/pom.xml b/bookMarkService/business/pom.xml
index c75fbed..a380d16 100644
--- a/bookMarkService/business/pom.xml
+++ b/bookMarkService/business/pom.xml
@@ -13,8 +13,6 @@
pom
user
- bms
- web
@@ -28,10 +26,7 @@
org.springframework.boot
spring-boot-starter-web
- 2.1.6.RELEASE
-
-
diff --git a/bookMarkService/business/user/pom.xml b/bookMarkService/business/user/pom.xml
index 7bc3173..c067757 100644
--- a/bookMarkService/business/user/pom.xml
+++ b/bookMarkService/business/user/pom.xml
@@ -9,7 +9,7 @@
4.0.0
- business-user
+ user
\ No newline at end of file
diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/business/user/controller/User.java b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java
similarity index 60%
rename from bookMarkService/business/user/src/main/java/com/fanxb/business/user/controller/User.java
rename to bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java
index 38ce99c..de3af9e 100644
--- a/bookMarkService/business/user/src/main/java/com/fanxb/business/user/controller/User.java
+++ b/bookMarkService/business/user/src/main/java/com/fanxb/bookmark/business/user/controller/UserController.java
@@ -1,4 +1,4 @@
-package com.fanxb.business.user.controller;
+package com.fanxb.bookmark.business.user.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -9,14 +9,14 @@ import org.springframework.web.bind.annotation.RestController;
* 类功能详述:
*
* @author fanxb
- * @date 2019/7/4 8:59
+ * @date 2019/7/4 19:51
*/
@RestController
@RequestMapping("/user")
-public class User {
+public class UserController {
- @GetMapping("test")
- public String getName() {
- return "test";
+ @GetMapping("/test")
+ public String test() {
+ return "abce";
}
}
diff --git a/bookMarkService/business/user/src/main/java/com/fanxb/business/user/Test.java b/bookMarkService/business/user/src/main/java/com/fanxb/business/user/Test.java
deleted file mode 100644
index 870e8b5..0000000
--- a/bookMarkService/business/user/src/main/java/com/fanxb/business/user/Test.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.fanxb.business.user;
-
-/**
- * 类功能简述:
- * 类功能详述:
- *
- * @author fanxb
- * @date 2019/7/3 20:16
- */
-public class Test {
- public int id;
-}
diff --git a/bookMarkService/business/web/README.md b/bookMarkService/business/web/README.md
deleted file mode 100644
index eb105c8..0000000
--- a/bookMarkService/business/web/README.md
+++ /dev/null
@@ -1 +0,0 @@
-**入口模块,最终只有这个模块会打出jar包**
\ No newline at end of file
diff --git a/bookMarkService/business/web/pom.xml b/bookMarkService/business/web/pom.xml
deleted file mode 100644
index f2f9085..0000000
--- a/bookMarkService/business/web/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
-
- business
- com.fanxb
- 1.0-SNAPSHOT
-
- 4.0.0
-
- business.web
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- repackage
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/bookMarkService/common/README.md b/bookMarkService/common/README.md
deleted file mode 100644
index 9527f00..0000000
--- a/bookMarkService/common/README.md
+++ /dev/null
@@ -1,6 +0,0 @@
-**这是公共模块,不得存放业务代码,只能存放如下:**
-
-- 工具类
-- 过滤器,拦截器等统一逻辑
-- 权限认证
-- 基本实体类,数据库中表对应实体,或者自定义异常,或者响应对象
diff --git a/bookMarkService/common/pom.xml b/bookMarkService/common/pom.xml
index a076b8e..407b864 100644
--- a/bookMarkService/common/pom.xml
+++ b/bookMarkService/common/pom.xml
@@ -11,22 +11,66 @@
common
+
-
- com.alibaba
- fastjson
- 1.2.58
+ org.springframework.boot
+ spring-boot-starter-web
-
+
+
+
com.squareup.okhttp3
okhttp
- 4.0.0
+ 3.14.0
+
+
+
+ com.auth0
+ java-jwt
+ 3.7.0
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ org.apache.commons
+ commons-pool2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-mail
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.56
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.56
+
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/Constant.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/Constant.java
new file mode 100644
index 0000000..30232e0
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/Constant.java
@@ -0,0 +1,32 @@
+package com.fanxb.bookmark.common;
+
+import org.springframework.stereotype.Component;
+
+/**
+ * 类功能简述:系统及常量类
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/4/4 16:10
+ */
+@Component
+public class Constant {
+
+
+ /**
+ * jwt key
+ */
+ public static final String JWT_KEY = "jwt-token";
+
+ /**
+ * jwt 过期时间,ms
+ */
+ public static int JWT_EXPIRE_TIME = 60 * 60 * 60 * 1000;
+
+ /**
+ * 验证码过期时间
+ */
+ public static int VERIFY_CODE_EXPIRE = 15 * 60 * 1000;
+
+
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/MailInfo.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/MailInfo.java
new file mode 100644
index 0000000..619cf7a
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/MailInfo.java
@@ -0,0 +1,25 @@
+package com.fanxb.bookmark.common.entity;
+
+import lombok.Data;
+
+/**
+ * Created with IntelliJ IDEA
+ * Created By Fxb
+ * Date: 2019/4/7
+ * Time: 18:41
+ */
+@Data
+public class MailInfo {
+ private String receiver;
+ private String subject;
+ private String content;
+
+ public MailInfo() {
+ }
+
+ public MailInfo(String receiver, String subject, String content) {
+ this.receiver = receiver;
+ this.subject = subject;
+ this.content = content;
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Result.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Result.java
new file mode 100644
index 0000000..10934fe
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/Result.java
@@ -0,0 +1,63 @@
+package com.fanxb.bookmark.common.entity;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/19 18:05
+ */
+public class Result {
+
+ /**
+ * 状态,1:正常,0:异常,-1:未认证
+ */
+ private int code;
+ private String message;
+ private Object data;
+
+ public Result() {
+ }
+
+ public Result(int code, String message, Object data) {
+ this.code = code;
+ this.message = message;
+ this.data = data;
+ }
+
+ public static Result unAuth() {
+ return new Result(-1, "", null);
+ }
+
+ public static Result success(Object data) {
+ return new Result(1, "", data);
+ }
+
+ public static Result failed(String message) {
+ return new Result(0, message, null);
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public Object getData() {
+ return data;
+ }
+
+ public void setData(Object data) {
+ this.data = data;
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java
new file mode 100644
index 0000000..b3b7487
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/User.java
@@ -0,0 +1,11 @@
+package com.fanxb.bookmark.common.entity;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/7/4 20:14
+ */
+public class User {
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/UserContext.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/UserContext.java
new file mode 100644
index 0000000..d138855
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/entity/UserContext.java
@@ -0,0 +1,18 @@
+package com.fanxb.bookmark.common.entity;
+
+import lombok.Data;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/1 14:26
+ */
+@Data
+public class UserContext {
+
+ private User user;
+ private String jwt;
+ private String sessionId;
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/exception/CustomException.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/exception/CustomException.java
new file mode 100644
index 0000000..d127cbe
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/exception/CustomException.java
@@ -0,0 +1,40 @@
+package com.fanxb.bookmark.common.exception;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/19 18:09
+ */
+public class CustomException extends RuntimeException {
+
+ String message;
+
+ public CustomException() {
+ super();
+ }
+
+ public CustomException(String message) {
+ super(message);
+ this.message = message;
+ }
+
+ public CustomException(Exception e){
+ super(e);
+ }
+
+ public CustomException(String message, Exception e) {
+ super(e);
+ this.message = message;
+ }
+
+ @Override
+ public String getMessage() {
+ if (this.message == null) {
+ return super.getMessage();
+ } else {
+ return this.message;
+ }
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/exception/ExceptionHandle.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/exception/ExceptionHandle.java
new file mode 100644
index 0000000..3759697
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/exception/ExceptionHandle.java
@@ -0,0 +1,30 @@
+package com.fanxb.bookmark.common.exception;
+
+import com.fanxb.bookmark.common.entity.Result;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/19 18:12
+ */
+@RestControllerAdvice
+public class ExceptionHandle {
+
+ private static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
+
+ @ExceptionHandler(Exception.class)
+ public Result handleException(Exception e) {
+ logger.error("捕获到错误:", e);
+ if (e instanceof CustomException) {
+ return Result.failed(e.getMessage());
+ } else {
+ return Result.failed("");
+ }
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/factory/CustomThreadFactory.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/factory/CustomThreadFactory.java
new file mode 100644
index 0000000..6a45b67
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/factory/CustomThreadFactory.java
@@ -0,0 +1,55 @@
+package com.fanxb.bookmark.common.factory;
+
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ThreadFactory;
+
+/**
+ * 类功能简述:
+ * 类功能详述:线程工厂
+ *
+ * @author: fanxb
+ * @date: 2018/10/12 11:29
+ */
+public class CustomThreadFactory implements ThreadFactory {
+
+ /**
+ * 记录创建线程数
+ */
+ private int counter;
+ /**
+ * 线程工程名
+ */
+ private String name;
+ /**
+ * 记录最近1000条创建历史
+ */
+ private List history;
+
+ private int historyLength;
+
+ public CustomThreadFactory(String name) {
+ this.name = name;
+ this.history = new LinkedList<>();
+ this.historyLength = 1000;
+ }
+
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r, name + "-Thread-" + counter);
+ this.counter++;
+ history.add(String.format("Created thread %d with name %s on %s \n", t.getId(), t.getName(), new Date().toString()));
+ if (history.size() >= this.historyLength) {
+ history.remove(0);
+ }
+ return t;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ this.history.forEach(builder::append);
+ return builder.toString();
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/factory/ThreadPoolFactory.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/factory/ThreadPoolFactory.java
new file mode 100644
index 0000000..f4c08f1
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/factory/ThreadPoolFactory.java
@@ -0,0 +1,130 @@
+package com.fanxb.bookmark.common.factory;
+
+
+import java.util.List;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 类功能简述: 线程池工厂,可使用此工厂创建线程池,等待队列使用:ArrayBlockingQueue
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/1 10:57
+ */
+public class ThreadPoolFactory {
+ /**
+ * 默认核心池大小
+ */
+ public static final int DEFAULT_CORE_POOL_SIZE = 5;
+ /**
+ * 默认最大线程数
+ */
+ public static final int DEFAULT_MAX_POOL_SIZE = 30;
+
+ /**
+ * 默认空闲线程回收时间(毫秒)
+ */
+ public static final long DEFAULT_KEEP_ACTIVE_TIME = 1000;
+
+ /**
+ * 默认等待队列长度
+ */
+ public static final int DEFAULT_QUEUE_LENGTH = 2000;
+
+ /**
+ * Description: 使用默认配置创建一个连接池
+ *
+ * @param factoryName 线程工厂名
+ * @return java.util.concurrent.ThreadPoolExecutor
+ * @author fanxb
+ * @date 2018/10/12 13:38
+ */
+ public static ThreadPoolExecutor createPool(String factoryName) {
+ ThreadFactory threadFactory = new CustomThreadFactory(factoryName);
+ return createPool(DEFAULT_CORE_POOL_SIZE, DEFAULT_MAX_POOL_SIZE, DEFAULT_KEEP_ACTIVE_TIME, DEFAULT_QUEUE_LENGTH, threadFactory);
+ }
+
+ /**
+ * Description: 提供参数创建一个连接池
+ *
+ * @param corePoolSize 核心池大小
+ * @param maxPoolSize 线程池最大线程数
+ * @param keepActiveTime 空闲线程回收时间(ms)
+ * @param queueLength 等待队列长度
+ * @return java.util.concurrent.ThreadPoolExecutor
+ * @author fanxb
+ * @date 2018/10/12 13:39
+ */
+ public static ThreadPoolExecutor createPool(int corePoolSize, int maxPoolSize, long keepActiveTime
+ , int queueLength, String threadName) {
+ return new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepActiveTime
+ , TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueLength), new CustomThreadFactory(threadName));
+
+ }
+
+ /**
+ * Description: 提供参数创建一个连接池,自己提供线程工厂
+ *
+ * @param corePoolSize 核心池大小
+ * @param maxPoolSize 线程池最大线程数
+ * @param keepActiveTime 空闲线程回收时间(ms)
+ * @param queueLength 等待队列长度
+ * @param factory 线程工厂
+ * @return java.util.concurrent.ThreadPoolExecutor
+ * @author fanxb
+ * @date 2018/10/12 13:39
+ */
+ public static ThreadPoolExecutor createPool(int corePoolSize, int maxPoolSize, long keepActiveTime
+ , int queueLength, ThreadFactory factory) {
+ return new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepActiveTime
+ , TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueLength), factory);
+
+ }
+
+ /**
+ * Description: 强制关闭线程池,不等待已有任务的完成
+ *
+ * @param executor 被关闭线程池对象
+ * @return List
+ * @author fanxb
+ * @date 2018/10/12 13:42
+ */
+ public static List forceShutdown(ThreadPoolExecutor executor) {
+ if (executor != null) {
+ return executor.shutdownNow();
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Description: 关闭一个连接池,等待已有任务完成
+ *
+ * @param executor 被关闭线程池对象
+ * @return void
+ * @author fanxb
+ * @date 2018/10/12 13:45
+ */
+ public static void shutdown(ThreadPoolExecutor executor) {
+ if (executor == null) {
+ return;
+ }
+ executor.shutdown();
+ try {
+ int count = 0;
+ int timeOut = 2;
+ while (executor.awaitTermination(timeOut, TimeUnit.SECONDS)) {
+ count++;
+ if (count == 100) {
+ executor.shutdownNow();
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/HttpUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/HttpUtil.java
new file mode 100644
index 0000000..a2b1261
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/HttpUtil.java
@@ -0,0 +1,134 @@
+package com.fanxb.bookmark.common.util;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fanxb.bookmark.common.exception.CustomException;
+import okhttp3.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/4/4 15:53
+ */
+public class HttpUtil {
+ private static final int IP_LENGTH = 15;
+
+ public static final OkHttpClient CLIENT = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.SECONDS)
+ .readTimeout(300, TimeUnit.SECONDS).build();
+ public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
+
+ public static JSONObject get(String url) {
+ return get(url, null);
+ }
+
+ public static JSONObject get(String url, Map headers) {
+ Request.Builder builder = new Request.Builder().url(url);
+ if (headers != null && headers.size() > 0) {
+ Set keys = headers.keySet();
+ for (String key : keys) {
+ builder = builder.addHeader(key, headers.get(key));
+ }
+ }
+ return request(builder.build());
+ }
+
+ public static JSONObject post(String url, String jsonObj) {
+ return post(url, jsonObj, null);
+ }
+
+ /**
+ * 发送post请求,带header
+ *
+ * @param url url
+ * @param jsonObj 请求体
+ * @param headers 请求头
+ * @return
+ */
+ public static JSONObject post(String url, String jsonObj, Map headers) {
+ RequestBody body = RequestBody.create(JSON, jsonObj);
+ Request.Builder builder = new Request.Builder().url(url).post(body);
+ if (headers != null) {
+ Set set = headers.keySet();
+ for (String key : set) {
+ builder = builder.addHeader(key, headers.get(key));
+ }
+ }
+ return request(builder.build());
+ }
+
+ /**
+ * 构造request,获取响应
+ *
+ * @param request request
+ * @return
+ */
+ public static JSONObject request(Request request) {
+ try (Response res = CLIENT.newCall(request).execute()) {
+ return parseResponse(res);
+ } catch (Exception e) {
+ throw new CustomException(e);
+ }
+ }
+
+ /**
+ * 解析响应
+ *
+ * @param res
+ * @return
+ */
+ public static JSONObject parseResponse(Response res) {
+ try {
+ if (checkIsOk(res.code())) {
+ String str = res.body().string();
+ return JSONObject.parseObject(str);
+ } else {
+ throw new CustomException("http请求出错:" + res.body().string());
+ }
+ } catch (Exception e) {
+ throw new CustomException(e);
+ }
+ }
+
+ public static boolean checkIsOk(int code) {
+ return code >= 200 && code < 300;
+ }
+
+ /**
+ * Description: 从请求头中获取用户访问ip
+ *
+ * @param request 请求头
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/6/12 15:36
+ */
+ public static String getIpAddr(HttpServletRequest request) {
+ String ipAddress = null;
+ try {
+ ipAddress = request.getHeader("x-forwarded-for");
+ if (ipAddress == null || ipAddress.length() == 0) {
+ ipAddress = request.getHeader("Proxy-Client-IP");
+ }
+ if (ipAddress == null || ipAddress.length() == 0) {
+ ipAddress = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (ipAddress == null || ipAddress.length() == 0) {
+ ipAddress = request.getRemoteAddr();
+ }
+ // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+ if (ipAddress != null && ipAddress.length() > IP_LENGTH) {
+ ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+ }
+ } catch (Exception e) {
+ ipAddress = "";
+ }
+ return ipAddress;
+ }
+}
+
+
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/JwtUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/JwtUtil.java
new file mode 100644
index 0000000..eff0a75
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/JwtUtil.java
@@ -0,0 +1,59 @@
+package com.fanxb.bookmark.common.util;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.fanxb.bookmark.common.exception.CustomException;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/2/28 18:36
+ */
+public class JwtUtil {
+
+ /**
+ * Description: 生成一个jwt字符串
+ *
+ * @param map data携带数据
+ * @param secret 秘钥
+ * @param timeOut 超时时间(单位s)
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/3/4 17:26
+ */
+ public static String encode(Map map, String secret, long timeOut) {
+ Algorithm algorithm = Algorithm.HMAC256(secret);
+ JWTCreator.Builder builder = JWT.create().withExpiresAt(new Date(System.currentTimeMillis() + timeOut));
+ //设置负载
+ map.forEach(builder::withClaim);
+ return builder.sign(algorithm);
+ }
+
+ /**
+ * Description: 解密jwt
+ *
+ * @param token token
+ * @param secret secret
+ * @return java.util.Map
+ * @author fanxb
+ * @date 2019/3/4 18:14
+ */
+ public static Map decode(String token, String secret) {
+ if (token == null || token.length() == 0) {
+ throw new CustomException("token为空:" + token);
+ }
+ Algorithm algorithm = Algorithm.HMAC256(secret);
+ JWTVerifier jwtVerifier = JWT.require(algorithm).build();
+ DecodedJWT decodedJWT = jwtVerifier.verify(token);
+ return decodedJWT.getClaims();
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/MailUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/MailUtil.java
new file mode 100644
index 0000000..2c925e0
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/MailUtil.java
@@ -0,0 +1,41 @@
+package com.fanxb.bookmark.common.util;
+
+import com.fanxb.bookmark.common.entity.MailInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.stereotype.Component;
+
+/**
+ * Created with IntelliJ IDEA
+ * Created By Fxb
+ * Date: 2019/4/7
+ * Time: 16:08
+ */
+@Component
+public class MailUtil {
+ private static JavaMailSender mailSender;
+
+ private static String from;
+
+ @Autowired
+ public void setMailSender(JavaMailSender mailSender) {
+ MailUtil.mailSender = mailSender;
+ }
+
+ @Value("${spring.mail.username}")
+ public void setFrom(String from){
+ MailUtil.from = from;
+ }
+
+
+ public static void sendTextMail(MailInfo info){
+ SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
+ simpleMailMessage.setFrom(from);
+ simpleMailMessage.setTo(info.getReceiver());
+ simpleMailMessage.setSubject(info.getSubject());
+ simpleMailMessage.setText(info.getContent());
+ mailSender.send(simpleMailMessage);
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/RedisUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/RedisUtil.java
new file mode 100644
index 0000000..6346b49
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/RedisUtil.java
@@ -0,0 +1,82 @@
+package com.fanxb.bookmark.common.util;
+
+import com.alibaba.fastjson.JSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/8 13:26
+ */
+@Component
+public class RedisUtil {
+ private static final int DEFAULT_EXPIRE_TIME = 60 * 1000;
+
+ private static final String STRING_TYPE_NAME = "java.lang.Class";
+
+ public static StringRedisTemplate redisTemplate;
+
+ @Autowired
+ public void setRedisTemplate(StringRedisTemplate redisTemplate) {
+ RedisUtil.redisTemplate = redisTemplate;
+ }
+
+ /**
+ * 设置键值对,使用默认过期时间
+ *
+ * @param key 键
+ * @param value 值
+ */
+ public static void set(String key, String value) {
+ set(key, value, DEFAULT_EXPIRE_TIME);
+ }
+
+ /**
+ * 设置键值对,指定过期时间
+ *
+ * @param key key
+ * @param value value
+ * @param expireTime 过期时间
+ */
+ public static void set(String key, String value, long expireTime) {
+ redisTemplate.opsForValue().set(key, value);
+ redisTemplate.expire(key, expireTime, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * 删除key
+ *
+ * @param key key
+ */
+ public static void delete(String key) {
+ redisTemplate.delete(key);
+ }
+
+ /**
+ * Description: 获取对象
+ *
+ * @param key 键
+ * @param tt 对象类
+ * @return T
+ * @author fanxb
+ * @date 2019/4/12 10:45
+ */
+ public static T get(String key, Class tt) {
+ String str = redisTemplate.opsForValue().get(key);
+ if (StringUtil.isEmpty(str)) {
+ return null;
+ } else {
+ if (STRING_TYPE_NAME.equals(tt.getTypeName())) {
+ return (T) str;
+ } else {
+ return JSON.parseObject(str, tt);
+ }
+ }
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/StringUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/StringUtil.java
new file mode 100644
index 0000000..c753c32
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/StringUtil.java
@@ -0,0 +1,57 @@
+package com.fanxb.bookmark.common.util;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/4/4 16:17
+ */
+public class StringUtil {
+
+ private static char[][] chars = {{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}
+ , {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'},
+ {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}};
+
+ /**
+ * Description: 获取随机字符串
+ *
+ * @param length 长度
+ * @param mode 模式,0:数字,字母混合;1:字母;2:数字
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/4/16 13:39
+ */
+ public static String getRandomString(int length, int mode) {
+ StringBuilder stringBuilder = new StringBuilder();
+ char[] temp = chars[mode];
+ for (int i = 0; i < length; i++) {
+ stringBuilder.append(temp[getRandomNumber(0, temp.length - 1)]);
+ }
+ return stringBuilder.toString();
+ }
+
+ /**
+ * 获取指定范围的随机数
+ *
+ * @param min 最小值
+ * @param max 最大值
+ * @return
+ */
+ public static int getRandomNumber(int min, int max) {
+ return (int) (min + Math.round(Math.random() * (max - min)));
+ }
+
+ /**
+ * Description:判断字符串是否为空
+ *
+ * @param str 待判断字符串
+ * @return boolean
+ * @author fanxb
+ * @date 2019/4/16 13:33
+ */
+ public static boolean isEmpty(String str) {
+ return str == null || str.trim().length() == 0;
+ }
+
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/ThreadPoolUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/ThreadPoolUtil.java
new file mode 100644
index 0000000..ca0063a
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/ThreadPoolUtil.java
@@ -0,0 +1,60 @@
+package com.fanxb.bookmark.common.util;
+
+
+import com.fanxb.bookmark.common.factory.ThreadPoolFactory;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 类功能简述:当短时间需要少量线程时,使用本类。长时间占用或大量线程需求,请用线程工厂ThreadPoolFactory创建新的线程池,
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2018/11/1 11:04
+ */
+public class ThreadPoolUtil {
+ private static final ThreadPoolExecutor POOL_EXECUTOR = ThreadPoolFactory.createPool("临时线程");
+
+ /**
+ * Description: 执行线程任务
+ *
+ * @param runnable 待执行对象
+ * @author fanxb
+ * @date 2018/11/1 11:27
+ */
+ synchronized private static void executeTask(Runnable runnable) {
+ POOL_EXECUTOR.execute(runnable);
+ }
+
+
+ /**
+ * Description: 执行一个有返回值的任务
+ *
+ * @param callable 待执行对象
+ * @param timeOut 获取结果操时时间 , 操时抛出错误 单位:秒
+ * @return T
+ * @author fanxb
+ * @date 2018/11/1 11:10
+ */
+ @SuppressWarnings("unchecked")
+ public static T execute(Callable callable, int timeOut) throws Exception {
+ FutureTask> futureTask = new FutureTask<>(callable);
+ executeTask(futureTask);
+ return (T) futureTask.get(timeOut, TimeUnit.SECONDS);
+ }
+
+ /**
+ * Description: 执行一个无返回值任务
+ *
+ * @param runnable 待执行对象
+ * @author fanxb
+ * @date 2018/11/1 11:11
+ */
+ public static void execute(Runnable runnable) {
+ executeTask(runnable);
+ }
+
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/TimeUtil.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/TimeUtil.java
new file mode 100644
index 0000000..bb1e75c
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/TimeUtil.java
@@ -0,0 +1,101 @@
+package com.fanxb.bookmark.common.util;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/28 16:54
+ */
+public class TimeUtil {
+
+ /**
+ * 一天的毫秒数
+ */
+ public static int DAY_MS = 24 * 60 * 60 * 1000;
+
+ private static ThreadLocal threadLocal = new ThreadLocal<>();
+
+ private static void close() {
+ threadLocal.remove();
+ }
+
+ private static DateFormat getDefaultDateFormat() {
+ DateFormat format = threadLocal.get();
+ if (format == null) {
+ format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ threadLocal.set(format);
+ }
+ return format;
+ }
+
+ /**
+ * Description: 格式化时间
+ *
+ * @param dateLong 毫秒时间戳
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/3/28 17:10
+ */
+ public static String formatTime(Long dateLong) {
+ return formatTime(null, new Date(dateLong));
+ }
+
+ /**
+ * Description: 格式化时间
+ *
+ * @param pattern pattern
+ * @param dateLong 毫秒时间戳
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/3/28 17:11
+ */
+ public static String formatTime(String pattern, Long dateLong) {
+ Date date = new Date(dateLong);
+ if (pattern != null) {
+ return formatTime(pattern, date);
+ } else {
+ return formatTime(null, date);
+ }
+ }
+
+ /**
+ * Description: 格式化时间
+ *
+ * @param date 时间
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/3/28 17:08
+ */
+ public static String formatTime(Date date) {
+ return formatTime(null, date);
+ }
+
+
+ /**
+ * description:格式化时间,日期
+ *
+ * @param pattern 格式化字符串
+ * @param date 时间
+ * @return java.lang.String
+ * @author fanxb
+ * @date 2019/3/28 16:58
+ */
+ public static String formatTime(String pattern, Date date) {
+ DateFormat format;
+ if (pattern == null) {
+ format = getDefaultDateFormat();
+ } else {
+ format = new SimpleDateFormat(pattern);
+ }
+ if (date == null) {
+ return format.format(new Date());
+ } else {
+ return format.format(date);
+ }
+ }
+}
diff --git a/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/UserContextHolder.java b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/UserContextHolder.java
new file mode 100644
index 0000000..34bd797
--- /dev/null
+++ b/bookMarkService/common/src/main/java/com/fanxb/bookmark/common/util/UserContextHolder.java
@@ -0,0 +1,29 @@
+package com.fanxb.bookmark.common.util;
+
+
+import com.fanxb.bookmark.common.entity.UserContext;
+
+/**
+ * 类功能简述:
+ * 类功能详述:
+ *
+ * @author fanxb
+ * @date 2019/3/1 14:26
+ */
+public class UserContextHolder {
+
+ private static final ThreadLocal USER_CONTEXT_THREAD_LOCAL = new ThreadLocal<>();
+
+ public static UserContext get() {
+ return USER_CONTEXT_THREAD_LOCAL.get();
+ }
+
+ public static void set(UserContext context) {
+ USER_CONTEXT_THREAD_LOCAL.set(context);
+ }
+
+ public static void remove() {
+ USER_CONTEXT_THREAD_LOCAL.remove();
+ }
+
+}
diff --git a/bookMarkService/pom.xml b/bookMarkService/pom.xml
index ef1e4f3..4458df9 100644
--- a/bookMarkService/pom.xml
+++ b/bookMarkService/pom.xml
@@ -11,6 +11,7 @@
common
business
+ web
utf-8
@@ -21,9 +22,8 @@
org.springframework.boot
spring-boot-starter-parent
- 2.1.4.RELEASE
+ 2.1.6.RELEASE
-
\ No newline at end of file
diff --git a/bookMarkService/business/bms/pom.xml b/bookMarkService/web/pom.xml
similarity index 67%
rename from bookMarkService/business/bms/pom.xml
rename to bookMarkService/web/pom.xml
index 274810d..6d44237 100644
--- a/bookMarkService/business/bms/pom.xml
+++ b/bookMarkService/web/pom.xml
@@ -3,18 +3,22 @@
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">
- business
+ bookMarkService
com.fanxb
1.0-SNAPSHOT
4.0.0
- business-bms
+ web
+
+ org.springframework.boot
+ spring-boot-starter-web
+
com.fanxb
- business-bms
+ user
1.0-SNAPSHOT
diff --git a/bookMarkService/business/web/src/main/java/com/fanxb/business/web/Application.java b/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java
similarity index 70%
rename from bookMarkService/business/web/src/main/java/com/fanxb/business/web/Application.java
rename to bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java
index 6c7c096..941c7d0 100644
--- a/bookMarkService/business/web/src/main/java/com/fanxb/business/web/Application.java
+++ b/bookMarkService/web/src/main/java/com/fanxb/bookmark/web/Application.java
@@ -1,4 +1,5 @@
-package com.fanxb.business.web;
+package com.fanxb.bookmark.web;
+
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -8,9 +9,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* 类功能详述:
*
* @author fanxb
- * @date 2019/7/3 20:20
+ * @date 2019/7/4 19:38
*/
-@SpringBootApplication(scanBasePackages = "com.fanxb")
+@SpringBootApplication(scanBasePackages = "com.fanxb.bookmark")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
diff --git a/bookMarkService/web/src/main/resources/application.yml b/bookMarkService/web/src/main/resources/application.yml
new file mode 100644
index 0000000..48aadf6
--- /dev/null
+++ b/bookMarkService/web/src/main/resources/application.yml
@@ -0,0 +1,16 @@
+
+spring:
+ mail:
+ host:
+ username:
+ password:
+ properties:
+ mail:
+ smtp:
+ auth: true
+ starttls:
+ enable: true
+ required: true
+ port: 465
+server:
+ port: 8088