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