diff --git a/src/main/java/org/starrier/common/annotation/README.md b/src/main/java/org/starrier/common/annotation/README.md
new file mode 100644
index 0000000..9420568
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/README.md
@@ -0,0 +1,18 @@
+# Annotation
+
+### 一. 接口防抖(防刷)
+
+> ```java
+> @RateLimit
+> ```
+
+
+### 二. 登录限制(次数)
+
+>```java
+>@LoginLimt
+>```
+
+
+
+
diff --git a/src/main/java/org/starrier/common/annotation/customer/DuplicateSubmitToken.java b/src/main/java/org/starrier/common/annotation/customer/DuplicateSubmitToken.java
new file mode 100644
index 0000000..6d095d4
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/customer/DuplicateSubmitToken.java
@@ -0,0 +1,23 @@
+package org.starrier.common.annotation.customer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Starrier
+ * @date 2018/12/9.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface DuplicateSubmitToken {
+
+ /**
+ * Save duplicate commit tags, default to true
+ */
+ boolean save() default true;
+
+}
diff --git a/src/main/java/org/starrier/common/annotation/customer/Http.java b/src/main/java/org/starrier/common/annotation/customer/Http.java
new file mode 100644
index 0000000..e535c51
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/customer/Http.java
@@ -0,0 +1,15 @@
+package org.starrier.common.annotation.customer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @author Starrier
+ * @date 2019/05/07
+ */
+@Documented
+@Target({ElementType.METHOD, ElementType.TYPE})
+public @interface Http {
+
+}
diff --git a/src/main/java/org/starrier/common/annotation/customer/LockAnnotation.java b/src/main/java/org/starrier/common/annotation/customer/LockAnnotation.java
new file mode 100644
index 0000000..47e5afe
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/customer/LockAnnotation.java
@@ -0,0 +1,31 @@
+package org.starrier.common.annotation.customer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Starrier
+ * @date 2018/12/21.
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD, ElementType.TYPE})
+public @interface LockAnnotation {
+
+ /**
+ * 加锁的 key 的域,用于前缀识别.
+ *
+ * @return String.
+ */
+ String lockField() default "";
+
+ /**
+ * 锁自定释放的时间.
+ *
+ * @return int.
+ */
+ int lockTime() default 3;
+}
diff --git a/src/main/java/org/starrier/common/annotation/customer/LockParamAnnotation.java b/src/main/java/org/starrier/common/annotation/customer/LockParamAnnotation.java
new file mode 100644
index 0000000..e910701
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/customer/LockParamAnnotation.java
@@ -0,0 +1,21 @@
+package org.starrier.common.annotation.customer;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @author Starrier
+ * @date 2018/12/21.
+ */
+@Documented
+@Target({ElementType.PARAMETER, ElementType.TYPE})
+public @interface LockParamAnnotation {
+
+ /**
+ * 参数的域,用于表明参数的业务场景,例如 orderSn.
+ *
+ * @return String.
+ */
+ String value() default "";
+}
diff --git a/src/main/java/org/starrier/common/annotation/customer/SysLogger.java b/src/main/java/org/starrier/common/annotation/customer/SysLogger.java
new file mode 100644
index 0000000..6383ac0
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/customer/SysLogger.java
@@ -0,0 +1,14 @@
+package org.starrier.common.annotation.customer;
+
+import java.lang.annotation.*;
+
+/**
+ * @author Starrier
+ * @date 2019/08/25
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SysLogger {
+ String value() default "";
+}
diff --git a/src/main/java/org/starrier/common/annotation/customer/package-info.java b/src/main/java/org/starrier/common/annotation/customer/package-info.java
new file mode 100644
index 0000000..0052110
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/customer/package-info.java
@@ -0,0 +1,10 @@
+/**
+ * @version 0.0.1-SNAPSHOT
+ * @describe Customer Annotation
+ *
+ * {@link org.starrier.common.annotation.customer.DuplicateSubmitToken}
+ * @author Imperater
+ * @date 2019/08/25
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.annotation.customer;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/annotation/logger/ExceptionLogger.java b/src/main/java/org/starrier/common/annotation/logger/ExceptionLogger.java
new file mode 100644
index 0000000..caa4b12
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/logger/ExceptionLogger.java
@@ -0,0 +1,15 @@
+package org.starrier.common.annotation.logger;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface ExceptionLogger {
+
+ Class extends Throwable>[] value() default {Throwable.class};
+}
diff --git a/src/main/java/org/starrier/common/annotation/logger/ExceptionNull.java b/src/main/java/org/starrier/common/annotation/logger/ExceptionNull.java
new file mode 100644
index 0000000..831e278
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/logger/ExceptionNull.java
@@ -0,0 +1,19 @@
+package org.starrier.common.annotation.logger;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Starrier
+ * @date 2019/09/01
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface ExceptionNull {
+
+ Class extends Throwable>[] value() default {Throwable.class};
+}
diff --git a/src/main/java/org/starrier/common/annotation/logger/ExceptionZero.java b/src/main/java/org/starrier/common/annotation/logger/ExceptionZero.java
new file mode 100644
index 0000000..ebe175d
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/logger/ExceptionZero.java
@@ -0,0 +1,19 @@
+package org.starrier.common.annotation.logger;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * @author Starrier
+ * @date 2019/09/01
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@Documented
+public @interface ExceptionZero {
+
+ int exceptionZero() default 0;
+}
diff --git a/src/main/java/org/starrier/common/annotation/logger/package-info.java b/src/main/java/org/starrier/common/annotation/logger/package-info.java
new file mode 100644
index 0000000..889034f
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/logger/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.annotation.logger;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/annotation/loginlimt/LoginLimit.java b/src/main/java/org/starrier/common/annotation/loginlimt/LoginLimit.java
new file mode 100644
index 0000000..936816e
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/loginlimt/LoginLimit.java
@@ -0,0 +1,36 @@
+package org.starrier.common.annotation.loginlimt;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @author starrier
+ * @date 2020/12/31
+ */
+@Documented
+@Target({ElementType.METHOD,ElementType.ANNOTATION_TYPE})
+public @interface LoginLimit {
+
+ /**
+ * 唯一标识符,用于登录校验
+ */
+ String identifier();
+
+ /**
+ * 在多长时间内监控, 如希望在 60s 内尝试
+ * 次数限制为5次, 那么 watch=60; unit: s
+ */
+ long watch() default 60;
+
+ /**
+ * 锁定时长, unit: s
+ */
+ long lock() default 60;
+
+ /**
+ * 错误的尝试次数
+ */
+ int times() default 5;
+
+}
diff --git a/src/main/java/org/starrier/common/annotation/loginlimt/LoginLimitAop.java b/src/main/java/org/starrier/common/annotation/loginlimt/LoginLimitAop.java
new file mode 100644
index 0000000..aa6c03f
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/loginlimt/LoginLimitAop.java
@@ -0,0 +1,111 @@
+package org.starrier.common.annotation.loginlimt;
+
+import org.apache.commons.lang3.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+import org.starrier.common.result.Result;
+import parquet.org.slf4j.Logger;
+import parquet.org.slf4j.LoggerFactory;
+
+import javax.security.auth.login.LoginException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author starrier
+ * @date 2020/12/31
+ */
+@Aspect
+@Component
+public class LoginLimitAop {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LoginLimitAop.class);
+
+ private final StringRedisTemplate stringRedisTemplate;
+
+ public LoginLimitAop(StringRedisTemplate stringRedisTemplate) {
+ this.stringRedisTemplate = stringRedisTemplate;
+ }
+
+ @Around("@annotation(LoginLimit)")
+ public Object handleLimit(ProceedingJoinPoint joinPoint) {
+
+ MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
+ final Method method = methodSignature.getMethod();
+ // TODO 直接将参数注入
+ final LoginLimit loginLimit = method.getAnnotation(LoginLimit.class);
+
+ //
+ final String identifier = loginLimit.identifier();
+ final long watch = loginLimit.watch();
+ final int times = loginLimit.times();
+ final long lock = loginLimit.lock();
+
+ String identifierValue = null;
+ try {
+ final Object arg = joinPoint.getArgs()[0];
+ final Field declaredField = arg.getClass().getDeclaredField(identifier);
+ declaredField.setAccessible(true);
+ identifierValue = (String) declaredField.get(arg);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ LOGGER.error(">>> invalid identifier [{}], cannot find this field in request params", identifier);
+ }
+ if (StringUtils.isBlank(identifierValue)) {
+ LOGGER.error(">>> the value of RedisLimit.identifier cannot be blank, invalid identifier: {}", identifier);
+ return Result.error("login error");
+ }
+
+ // check User locked
+ final ValueOperations ssOps = stringRedisTemplate.opsForValue();
+ final String flag = ssOps.get(identifierValue);
+ if (flag != null && "lock".contentEquals(flag)) {
+
+ return new ResponseEntity<>(null, HttpStatus.OK);
+ }
+
+ Object proceed = null;
+ try {
+ proceed = joinPoint.proceed();
+ } catch (Throwable e) {
+ return handleLoginException(e, identifierValue, watch, times, lock);
+ }
+ return Result.success(proceed, "success");
+
+ }
+
+ private Result handleLoginException(Throwable e, String identifierValue, final long watch, final int times, final long lock) {
+
+ if (e instanceof LoginException) {
+ LOGGER.info(">>> handle login exception...");
+ final ValueOperations ssOps = stringRedisTemplate.opsForValue();
+ Boolean exist = stringRedisTemplate.hasKey(identifierValue);
+ if (exist == null || !exist) {
+ ssOps.set(identifierValue, "1", watch, TimeUnit.SECONDS);
+ return Result.success();
+ }
+
+ String count = ssOps.get(identifierValue);
+ if (StringUtils.isBlank(count)) {
+ return Result.error("not found");
+ }
+ // has been reached the limitation
+ if (Integer.parseInt(count) + 1 == times) {
+ LOGGER.info(">>> [{}] has been reached the limitation and will be locked for {}s", identifierValue, lock);
+ ssOps.set(identifierValue, "lock", lock, TimeUnit.SECONDS);
+ return Result.success();
+ }
+ ssOps.increment(identifierValue);
+ }
+ LOGGER.error(">>> RedisLimitAOP cannot handle {}", e.getClass().getName());
+ return Result.success();
+ }
+}
diff --git a/src/main/java/org/starrier/common/annotation/loginlimt/README.md b/src/main/java/org/starrier/common/annotation/loginlimt/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/org/starrier/common/annotation/loginlimt/package-info.java b/src/main/java/org/starrier/common/annotation/loginlimt/package-info.java
new file mode 100644
index 0000000..7c9598c
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/loginlimt/package-info.java
@@ -0,0 +1 @@
+package org.starrier.common.annotation.loginlimt;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/annotation/methodcount/MethodCount.java b/src/main/java/org/starrier/common/annotation/methodcount/MethodCount.java
new file mode 100644
index 0000000..1c53496
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/methodcount/MethodCount.java
@@ -0,0 +1,16 @@
+package org.starrier.common.annotation.methodcount;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+/**
+ * @author starrier
+ * @date 2021/1/4
+ */
+@Documented
+@Target({ElementType.METHOD,ElementType.TYPE})
+public @interface MethodCount {
+
+
+}
diff --git a/src/main/java/org/starrier/common/annotation/methodcount/MethodCountAop.java b/src/main/java/org/starrier/common/annotation/methodcount/MethodCountAop.java
new file mode 100644
index 0000000..e05b604
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/methodcount/MethodCountAop.java
@@ -0,0 +1,46 @@
+package org.starrier.common.annotation.methodcount;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import parquet.org.slf4j.Logger;
+import parquet.org.slf4j.LoggerFactory;
+
+/**
+ * @author starrier
+ * @date 2021/1/4
+ */
+@Aspect
+@Component
+public class MethodCountAop {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(MethodCountAop.class);
+
+ @Pointcut("@annotation(org.starrier.common.annotation.methodcount.MethodCount)")
+ public void methodCount() {
+
+ }
+
+ @Before("methodCount()")
+ public void before(JoinPoint joinPoint) {
+ Long startTime = System.currentTimeMillis();
+
+ Signature signature = joinPoint.getSignature();
+
+ String className = signature.getDeclaringTypeName();
+ String methodName = signature.getName();
+
+ LOGGER.info("current method count class name is :[{}] and method is [{}]", className, methodName);
+ }
+
+ @After("methodCount()")
+ public void after(ProceedingJoinPoint proceedingJoinPoint) {
+
+ }
+
+}
diff --git a/src/main/java/org/starrier/common/annotation/methodcount/README.md b/src/main/java/org/starrier/common/annotation/methodcount/README.md
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/org/starrier/common/annotation/package-info.java b/src/main/java/org/starrier/common/annotation/package-info.java
new file mode 100644
index 0000000..d3233a0
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/05/08
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.annotation;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/annotation/ratelimiter/RateLimit.java b/src/main/java/org/starrier/common/annotation/ratelimiter/RateLimit.java
new file mode 100644
index 0000000..aabb912
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/ratelimiter/RateLimit.java
@@ -0,0 +1,28 @@
+package org.starrier.common.annotation.ratelimiter;
+
+import java.lang.annotation.*;
+
+/**
+ * Customer annotation rateLimiter.
+ * More detail in {@link com.google.common}
+ *
+ * @author Starrier
+ * @date 2019/1/3.
+ */
+@Documented
+@Inherited
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface RateLimit {
+
+ /**
+ * Add a token to the token bucket at a fixed rate per second.
+ */
+ double limitNum() default 20;
+
+ /**
+ * If the token is not obtained in the specified number,
+ * the service demotion process is taken directly.
+ */
+ long timeout();
+}
diff --git a/src/main/java/org/starrier/common/annotation/ratelimiter/package-info.java b/src/main/java/org/starrier/common/annotation/ratelimiter/package-info.java
new file mode 100644
index 0000000..4581817
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/ratelimiter/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.annotation.ratelimiter;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeClass.java b/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeClass.java
new file mode 100644
index 0000000..576c1e5
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeClass.java
@@ -0,0 +1,20 @@
+package org.starrier.common.annotation.threadsafe;
+
+import net.jcip.annotations.ThreadSafe;
+
+import java.lang.annotation.*;
+
+/**
+ * @author Starrier
+ * @date 2018/12/15.
+ */
+@Target({ElementType.TYPE,
+ ElementType.FIELD,
+ ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR,
+})
+@ThreadSafe
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ThreadSafeClass {
+}
diff --git a/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeMethod.java b/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeMethod.java
new file mode 100644
index 0000000..1de71b2
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeMethod.java
@@ -0,0 +1,17 @@
+package org.starrier.common.annotation.threadsafe;
+
+import java.lang.annotation.*;
+
+/**
+ * @author Starrier
+ * @date 2018/12/15.
+ */
+@Target({ElementType.METHOD,
+ ElementType.FIELD,
+ ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR,
+ ElementType.PARAMETER})
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ThreadSafeMethod {
+}
diff --git a/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeVariable.java b/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeVariable.java
new file mode 100644
index 0000000..ce4b16a
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/threadsafe/ThreadSafeVariable.java
@@ -0,0 +1,20 @@
+package org.starrier.common.annotation.threadsafe;
+
+import net.jcip.annotations.ThreadSafe;
+
+import java.lang.annotation.*;
+
+/**
+ * @author Starrier
+ * @date 2018/12/15.
+ */
+@Target({ElementType.METHOD,
+ ElementType.FIELD,
+ ElementType.ANNOTATION_TYPE,
+ ElementType.CONSTRUCTOR,
+ ElementType.PARAMETER})
+@ThreadSafe
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ThreadSafeVariable {
+}
diff --git a/src/main/java/org/starrier/common/annotation/threadsafe/package-info.java b/src/main/java/org/starrier/common/annotation/threadsafe/package-info.java
new file mode 100644
index 0000000..0b66ccc
--- /dev/null
+++ b/src/main/java/org/starrier/common/annotation/threadsafe/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.annotation.threadsafe;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/constant/Constant.java b/src/main/java/org/starrier/common/constant/Constant.java
index de6a700..b4740d3 100644
--- a/src/main/java/org/starrier/common/constant/Constant.java
+++ b/src/main/java/org/starrier/common/constant/Constant.java
@@ -10,12 +10,24 @@ public class Constant {
/**
* 敏感词匹配规则
- *
- * 最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人
- * 最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]
+ *
+ * 最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人
+ * 最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]
*/
- public static final int MinMatchTYpe = 1;
+ public static final int MIN_MATCH_T_YPE = 1;
- public static final int MaxMatchType = 2;
+ public static final int MAX_MATCH_TYPE = 2;
+
+ public static final String IS_END = "isEnd";
+
+ public static final String ONE = "1";
+
+ public static final String TWO = "2";
+
+ public static final String ZERO = "0";
+
+ public static final String UTF8 = "UTF-8";
+
+ public static final Integer FOUR = 4;
}
diff --git a/src/main/java/org/starrier/common/constant/DataConstant.java b/src/main/java/org/starrier/common/constant/DataConstant.java
new file mode 100644
index 0000000..cce8eb3
--- /dev/null
+++ b/src/main/java/org/starrier/common/constant/DataConstant.java
@@ -0,0 +1,12 @@
+package org.starrier.common.constant;
+
+/**
+ * @author Starrier
+ * @date 2019/4/30
+ */
+public class DataConstant {
+ public static final String DATE_FORMAT_DEFAULT = "yyyy-MM-dd";
+ public static final String DATE_FORMAT_TIME = "yyyy-MM-dd HH:mm";
+ public static final String DATE_FORMAT_ALL = "yyyy-MM-dd HH:mm:ss";
+ public static final String DATE_CHINA_DEFAULT = "yyyy年MM月dd日";
+}
diff --git a/src/main/java/org/starrier/common/constant/ExceptionLoggerHandler.java b/src/main/java/org/starrier/common/constant/ExceptionLoggerHandler.java
new file mode 100644
index 0000000..3744d3b
--- /dev/null
+++ b/src/main/java/org/starrier/common/constant/ExceptionLoggerHandler.java
@@ -0,0 +1,27 @@
+package org.starrier.common.constant;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+
+/**
+ * @author Starrier
+ * @date 2019/08/25
+ */
+public class ExceptionLoggerHandler {
+
+ @Pointcut("@annotation(org.starrier.common.annotation.logger.ExceptionLogger)")
+ public void log() {
+ }
+
+ @Before("log()")
+ public void doBefore(JoinPoint joinPoint) {
+
+ }
+
+ @Around("log()")
+ public void around() {
+
+ }
+}
diff --git a/src/main/java/org/starrier/common/constant/ExceptionNullHandler.java b/src/main/java/org/starrier/common/constant/ExceptionNullHandler.java
new file mode 100644
index 0000000..dd4c7d6
--- /dev/null
+++ b/src/main/java/org/starrier/common/constant/ExceptionNullHandler.java
@@ -0,0 +1,21 @@
+package org.starrier.common.constant;
+
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+
+/**
+ * @author Starrier
+ * @date 2019/08/25
+ */
+public class ExceptionNullHandler {
+
+ @Pointcut("@annotation(org.starrier.common.annotation.logger.ExceptionNull)")
+ public void log() {
+ }
+
+ @Before("log()")
+ public Object doBefore(JoinPoint joinPoint) {
+ return null;
+ }
+}
diff --git a/src/main/java/org/starrier/common/constant/HttpConstant.java b/src/main/java/org/starrier/common/constant/HttpConstant.java
new file mode 100644
index 0000000..9f7b352
--- /dev/null
+++ b/src/main/java/org/starrier/common/constant/HttpConstant.java
@@ -0,0 +1,36 @@
+package org.starrier.common.constant;
+
+/**
+ * @author Starrier
+ * @date 2019/05/07
+ */
+public class HttpConstant {
+
+ public static final String UNKNOWN = "unknown";
+
+ public static final String PROXY_CLIENT_IP = "Proxy-Client-IP";
+
+ public static final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
+
+ public static final String HTTP_CLIENT_IP = "HTTP_CLIENT_IP";
+
+ public static final String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR";
+
+ public static final String X_FORWARDED_FOR = "X-Forwarded-For";
+
+ public static final String POINT = ",";
+
+ public static final String CLASS_NAME = "className";
+
+ public static final String CLASS_METHOD = "classMethod";
+
+ public static final String URL = "url";
+
+ public static final String METHOD = "method";
+
+ public static final String IP = "ip";
+
+ public static final String ARGS = "args";
+
+ public static final String REQUEST = "request: {}";
+}
diff --git a/src/main/java/org/starrier/common/constant/ResourceNameConstant.java b/src/main/java/org/starrier/common/constant/ResourceNameConstant.java
index 1c1c2c0..dbc356e 100644
--- a/src/main/java/org/starrier/common/constant/ResourceNameConstant.java
+++ b/src/main/java/org/starrier/common/constant/ResourceNameConstant.java
@@ -5,8 +5,8 @@
import lombok.Setter;
/**
- * @author Starrier
- * @date 2018/6/5.
+ * @author Starrier
+ * @date 2018/6/5.
*/
@Getter
@Setter
@@ -20,7 +20,7 @@ public class ResourceNameConstant {
/**
* Prevent instantiation.
- *
+ *
* And if you want to expose these,you can use annotation {@link NoArgsConstructor}
*/
private ResourceNameConstant() {
diff --git a/src/main/java/org/starrier/common/constant/package-info.java b/src/main/java/org/starrier/common/constant/package-info.java
new file mode 100644
index 0000000..38df356
--- /dev/null
+++ b/src/main/java/org/starrier/common/constant/package-info.java
@@ -0,0 +1,10 @@
+/**
+ * @author Starrier
+ * @date 2019/05/27
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+@Nonnull
+package org.starrier.common.constant;
+
+import javax.annotation.Nonnull;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/http/HttpAspect.java b/src/main/java/org/starrier/common/http/HttpAspect.java
new file mode 100644
index 0000000..ce0b392
--- /dev/null
+++ b/src/main/java/org/starrier/common/http/HttpAspect.java
@@ -0,0 +1,96 @@
+package org.starrier.common.http;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import parquet.org.slf4j.Logger;
+import parquet.org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
+
+
+import static org.starrier.common.constant.HttpConstant.ARGS;
+import static org.starrier.common.constant.HttpConstant.CLASS_METHOD;
+import static org.starrier.common.constant.HttpConstant.CLASS_NAME;
+import static org.starrier.common.constant.HttpConstant.IP;
+import static org.starrier.common.constant.HttpConstant.METHOD;
+import static org.starrier.common.constant.HttpConstant.URL;
+
+/**
+ * @author Starrier
+ * @date 2018/11/6.
+ */
+@Aspect
+@Component
+public class HttpAspect {
+
+ public static Logger LOGGER = LoggerFactory.getLogger(HttpAspect.class);
+
+ @Pointcut("@annotation(org.starrier.common.annotation.customer.Http)")
+ public void log() {
+ }
+
+ @Before("log()")
+ public void doBefore(JoinPoint joinPoint) {
+
+ ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+ HttpServletRequest request = null;
+ if (null != attributes) {
+ request = attributes.getRequest();
+ }
+ Map params = new HashMap<>();
+ if (null != request) {
+ params.put(URL, request.getRequestURL());
+ }
+ if (null != request) {
+ params.put(METHOD, request.getMethod());
+ }
+ if (null != request) {
+ params.put(IP, request.getRemoteAddr());
+ }
+ params.put(CLASS_NAME, joinPoint.getSignature().getDeclaringTypeName());
+ params.put(CLASS_METHOD, joinPoint.getSignature().getName());
+ params.put(ARGS, joinPoint.getArgs());
+ Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ }
+
+ @Around("log()")
+ public Object doAround(ProceedingJoinPoint point) {
+ try {
+ return point.proceed();
+ } catch (Throwable throwable) {
+ return null;
+ }
+ }
+
+ @After("log()")
+ public void doAfter() {
+ }
+
+ /**
+ * Fetch
+ *
+ * @param object
+ * @return return value
+ */
+ @AfterReturning(returning = "object", pointcut = "log()")
+ public void doAfterReturning(Object object) {
+ }
+
+ @AfterThrowing(pointcut = "log()")
+ public void doAfterThrowing() {
+ }
+}
diff --git a/src/main/java/org/starrier/common/http/package-info.java b/src/main/java/org/starrier/common/http/package-info.java
new file mode 100644
index 0000000..cde913e
--- /dev/null
+++ b/src/main/java/org/starrier/common/http/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.http;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/pageHelper/PageConstant.java b/src/main/java/org/starrier/common/page/PageConstant.java
similarity index 85%
rename from src/main/java/org/starrier/common/pageHelper/PageConstant.java
rename to src/main/java/org/starrier/common/page/PageConstant.java
index 0b3d71b..1eb2dbb 100644
--- a/src/main/java/org/starrier/common/pageHelper/PageConstant.java
+++ b/src/main/java/org/starrier/common/page/PageConstant.java
@@ -1,33 +1,33 @@
-package org.starrier.common.pageHelper;
-
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author Starrier
- * @date 2018/6/5.
- */
-@Getter
-@Setter
-public class PageConstant {
-
- /**
- * Default page number
- */
- public static final int PAGE = 1;
-
- /**
- * Default size of per page
- */
- public static final int PER_PAGE = 10;
-
- /**
- * Prevent instantiation.
- *
- * And if you need expose, {@link lombok.NoArgsConstructor} instead of if.
- */
- private PageConstant() {
- }
-
-}
+package org.starrier.common.page;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author Starrier
+ * @date 2018/6/5.
+ */
+@Getter
+@Setter
+public class PageConstant {
+
+ /**
+ * Default page number
+ */
+ public static final int PAGE = 1;
+
+ /**
+ * Default size of per page
+ */
+ public static final int PER_PAGE = 10;
+
+ /**
+ * Prevent instantiation.
+ *
+ * And if you need expose, {@link lombok.NoArgsConstructor} instead of if.
+ */
+ private PageConstant() {
+ }
+
+}
diff --git a/src/main/java/org/starrier/common/pageHelper/PaginatedResult.java b/src/main/java/org/starrier/common/page/PaginatedResult.java
similarity index 84%
rename from src/main/java/org/starrier/common/pageHelper/PaginatedResult.java
rename to src/main/java/org/starrier/common/page/PaginatedResult.java
index 0b150a6..428ae0c 100644
--- a/src/main/java/org/starrier/common/pageHelper/PaginatedResult.java
+++ b/src/main/java/org/starrier/common/page/PaginatedResult.java
@@ -1,39 +1,38 @@
-package org.starrier.common.pageHelper;
-
-
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-import lombok.ToString;
-import lombok.experimental.Accessors;
-
-import java.io.Serializable;
-
-/**
- * @author Starrier
- * @date 2019/1/9.
- */
-@Accessors(chain = true)
-@NoArgsConstructor
-@Getter
-@Setter
-@ToString
-public class PaginatedResult implements Serializable {
-
- private static final long serialVersionUID = 6191745064790884707L;
- /**
- * Current page number
- */
- private int currentPage;
-
- /**
- * Number of total pages
- */
- private int totalPage;
-
- /**
- * Paginated resources
- */
- private Object data;
-
+package org.starrier.common.page;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * @author Starrier
+ * @date 2019/1/9.
+ */
+@Accessors(chain = true)
+@NoArgsConstructor
+@Getter
+@Setter
+@ToString
+public class PaginatedResult implements Serializable {
+
+ private static final long serialVersionUID = 6191745064790884707L;
+ /**
+ * Current page number
+ */
+ private int currentPage;
+
+ /**
+ * Number of total pages
+ */
+ private int totalPage;
+
+ /**
+ * Paginated resources
+ */
+ private Object data;
+
}
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/pageHelper/ParameterIllegalException.java b/src/main/java/org/starrier/common/page/ParameterIllegalException.java
similarity index 61%
rename from src/main/java/org/starrier/common/pageHelper/ParameterIllegalException.java
rename to src/main/java/org/starrier/common/page/ParameterIllegalException.java
index 1afeab8..c93d771 100644
--- a/src/main/java/org/starrier/common/pageHelper/ParameterIllegalException.java
+++ b/src/main/java/org/starrier/common/page/ParameterIllegalException.java
@@ -1,11 +1,11 @@
-package org.starrier.common.pageHelper;
-
-/**
- * @author Starrier
- * @date 2018/6/5.
- */
-public class ParameterIllegalException extends RuntimeException {
-
- private static final long serialVersionUID = 8197086462208138875L;
-
-}
+package org.starrier.common.page;
+
+/**
+ * @author Starrier
+ * @date 2018/6/5.
+ */
+public class ParameterIllegalException extends RuntimeException {
+
+ private static final long serialVersionUID = 8197086462208138875L;
+
+}
diff --git a/src/main/java/org/starrier/common/pageHelper/ParameterInvalidItem.java b/src/main/java/org/starrier/common/page/ParameterInvalidItem.java
similarity index 81%
rename from src/main/java/org/starrier/common/pageHelper/ParameterInvalidItem.java
rename to src/main/java/org/starrier/common/page/ParameterInvalidItem.java
index 73b5a1b..43de186 100644
--- a/src/main/java/org/starrier/common/pageHelper/ParameterInvalidItem.java
+++ b/src/main/java/org/starrier/common/page/ParameterInvalidItem.java
@@ -1,25 +1,24 @@
-package org.starrier.common.pageHelper;
-
-import lombok.Data;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.io.Serializable;
-
-/**
- * Controller 参数校验,错误返回封装
- *
- * @author Starrier
- * @date 2019/1/31.
- */
-@Getter
-@Setter
-@NoArgsConstructor
-public class ParameterInvalidItem implements Serializable {
-
- private String fieldName;
-
- private String message;
-
-}
+package org.starrier.common.page;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * Controller 参数校验,错误返回封装
+ *
+ * @author Starrier
+ * @date 2019/1/31.
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class ParameterInvalidItem implements Serializable {
+
+ private String fieldName;
+
+ private String message;
+
+}
diff --git a/src/main/java/org/starrier/common/pageHelper/ResourceNotFoundException.java b/src/main/java/org/starrier/common/page/ResourceNotFoundException.java
similarity index 72%
rename from src/main/java/org/starrier/common/pageHelper/ResourceNotFoundException.java
rename to src/main/java/org/starrier/common/page/ResourceNotFoundException.java
index f28c1af..378d15c 100644
--- a/src/main/java/org/starrier/common/pageHelper/ResourceNotFoundException.java
+++ b/src/main/java/org/starrier/common/page/ResourceNotFoundException.java
@@ -1,27 +1,28 @@
-package org.starrier.common.pageHelper;
-
-import lombok.Setter;
-import lombok.experimental.Accessors;
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * @author Starrier
- * @date 2018/6/5.
- */
-
-@Accessors(chain = true)
-@Setter
-public class ResourceNotFoundException extends RuntimeException {
-
- private static final long serialVersionUID = -2565431806475335331L;
-
- private String resourceName;
-
- private Long id;
-
- @Override
- public String getMessage() {
- return StringUtils.capitalize(resourceName) + " with id " + id + " is not found.";
- }
-
-}
+package org.starrier.common.page;
+
+import lombok.AllArgsConstructor;
+import lombok.Setter;
+import lombok.experimental.Accessors;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @author Starrier
+ * @date 2018/6/5.
+ */
+@Setter
+@Accessors(chain = true)
+@AllArgsConstructor
+public class ResourceNotFoundException extends RuntimeException {
+
+ private static final long serialVersionUID = -2565431806475335331L;
+
+ private final String resourceName;
+
+ private final Long id;
+
+ @Override
+ public String getMessage() {
+ return StringUtils.capitalize(resourceName) + " with id " + id + " is not found.";
+ }
+
+}
diff --git a/src/main/java/org/starrier/common/page/package-info.java b/src/main/java/org/starrier/common/page/package-info.java
new file mode 100644
index 0000000..c08debe
--- /dev/null
+++ b/src/main/java/org/starrier/common/page/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.page;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/result/Result.java b/src/main/java/org/starrier/common/result/Result.java
index 7bc94f7..41d01f5 100644
--- a/src/main/java/org/starrier/common/result/Result.java
+++ b/src/main/java/org/starrier/common/result/Result.java
@@ -1,10 +1,14 @@
package org.starrier.common.result;
import com.google.common.collect.Maps;
+import com.google.gson.annotations.SerializedName;
+import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
+import lombok.NoArgsConstructor;
import lombok.Setter;
+import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
@@ -18,11 +22,12 @@
* @date 2018/11/11.
* @see Result is the enhanced and custom version of response.
*/
-@AllArgsConstructor
-@Builder
@Accessors(chain = true)
@Setter
@Getter
+@ToString
+@AllArgsConstructor
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Result implements Serializable {
private static final long serialVersionUID = -1709587390161841001L;
@@ -33,19 +38,15 @@ public class Result implements Serializable {
private String url;
- public Object getData() {
- return data;
- }
-
- public void setData(Object data) {
- this.data = data;
- }
-
private Object data;
- private Result() {
+ public Integer getCode() {
+ return code;
}
+ private void setData(Object data) {
+ this.data = data;
+ }
public Result(Integer errorCode, String errMessage) {
this.code = errorCode;
@@ -82,12 +83,26 @@ public static Result success(Object data) {
return result;
}
+ public static Result success(Object data,String message){
+ Result result = new Result();
+ result.setData(data);
+ result.setMessage(message);
+ return result;
+ }
+
public static Result error(ResultCode resultCode) {
Result result = new Result();
result.setResultCode(resultCode);
return result;
}
+ public static Result error(String errorMessage) {
+ Result result = new Result();
+ result.setResultCode(ResultCode.ERROR);
+ result.setMessage(errorMessage);
+ return result;
+ }
+
public static Result error(ResultCode resultCode, Object data) {
Result result = new Result();
result.setResultCode(resultCode);
@@ -95,4 +110,46 @@ public static Result error(ResultCode resultCode, Object data) {
return result;
}
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ private Result(Builder builder) {
+ this.code = builder.code;
+ this.data = builder.data;
+ this.message = builder.message;
+ this.url = builder.url;
+ }
+
+ @ToString
+ public static class Builder {
+ private Integer code;
+ private String message;
+ private String url;
+ private Object data;
+
+ public Builder code(Integer code) {
+ this.code = code;
+ return this;
+ }
+
+ public Builder data(Object data) {
+ this.data = data;
+ return this;
+ }
+
+ public Builder message(String message) {
+ this.message = message;
+ return this;
+ }
+
+ public Builder url(String url) {
+ this.url = url;
+ return this;
+ }
+
+ public Result build() {
+ return new Result(this);
+ }
+ }
}
diff --git a/src/main/java/org/starrier/common/result/ResultCode.java b/src/main/java/org/starrier/common/result/ResultCode.java
index ba2ead0..0435a24 100644
--- a/src/main/java/org/starrier/common/result/ResultCode.java
+++ b/src/main/java/org/starrier/common/result/ResultCode.java
@@ -5,6 +5,7 @@
* @date 2019/1/31.
*/
public enum ResultCode {
+
/* 成功状态码 */
SUCCESS(0, "成功"),
ERROR(1, "失败"),
@@ -15,6 +16,10 @@ public enum ResultCode {
PARAM_TYPE_BIND_ERROR(10003, "参数类型错误"),
PARAM_NOT_COMPLETE(10004, "参数缺失"),
+ /**
+ * MicroSoft
+ */
+
/* 用户错误:20001-29999*/
USER_NOT_LOGGED_IN(20001, "用户未登录"),
@@ -49,7 +54,9 @@ public enum ResultCode {
/* 文件上传 */
UPLOAD_ERROR(80001, "上传失败"),
- SESSION_TIME_OUT(90001, "Session超时");
+ SESSION_TIME_OUT(90001, "Session超时"),
+
+ REQUEST_LIMIT(10001, "请求次数受限");
private Integer code;
diff --git a/src/main/java/org/starrier/common/result/package-info.java b/src/main/java/org/starrier/common/result/package-info.java
new file mode 100644
index 0000000..da61188
--- /dev/null
+++ b/src/main/java/org/starrier/common/result/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.result;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/token/DESBuilder.java b/src/main/java/org/starrier/common/token/DESBuilder.java
index c304127..8b309e0 100644
--- a/src/main/java/org/starrier/common/token/DESBuilder.java
+++ b/src/main/java/org/starrier/common/token/DESBuilder.java
@@ -1,6 +1,8 @@
package org.starrier.common.token;
import lombok.Cleanup;
+import lombok.Getter;
+import lombok.Setter;
import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;
@@ -23,6 +25,8 @@
public class DESBuilder {
+ @Getter
+ @Setter
private Key key;
/**
@@ -42,19 +46,11 @@ private void generatorRandomKey(String strKey) {
KeyGenerator generator = KeyGenerator.getInstance(KEY_ALGORTHM);
generator.init(new SecureRandom(strKey.getBytes()));
this.key = generator.generateKey();
- generator = null;
} catch (Exception e) {
throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
}
}
- /**
- * @return Key对象
- */
- public Key getKey() {
- return key;
- }
-
/**
* @return Key对象
*/
@@ -65,11 +61,10 @@ public String getKeyToString() {
/**
* @return 文件
*/
- public void getKeyToFile(String keyAddress)throws IOException,FileNotFoundException {
- @Cleanup FileOutputStream fileOutput =null;
- @Cleanup ObjectOutputStream objectOutput = null;
- fileOutput = new FileOutputStream(keyAddress);
- objectOutput = new ObjectOutputStream(fileOutput);
- objectOutput.writeObject(this.key);
+ public void getKeyToFile(String keyAddress) throws IOException {
+ try (FileOutputStream fileOutput = new FileOutputStream(keyAddress);
+ ObjectOutputStream objectOutput = new ObjectOutputStream(fileOutput);) {
+ objectOutput.writeObject(this.key);
+ }
}
}
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/token/DESCoder.java b/src/main/java/org/starrier/common/token/DESCoder.java
index 706b7a8..5266a74 100644
--- a/src/main/java/org/starrier/common/token/DESCoder.java
+++ b/src/main/java/org/starrier/common/token/DESCoder.java
@@ -3,7 +3,6 @@
import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;
-import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.Key;
@@ -19,14 +18,14 @@
public class DESCoder {
@SneakyThrows(Exception.class)
- private Key toKey(byte[] key) throws Exception {
+ private Key toKey(byte[] key) {
DESKeySpec dks = new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORTHM);
return keyFactory.generateSecret(dks);
}
@SneakyThrows(Exception.class)
- public Key toKey(String key) throws Exception {
+ public Key toKey(String key) {
byte[] keyBytes = Base64.decodeBase64(key);
return toKey(keyBytes);
}
diff --git a/src/main/java/org/starrier/common/utils/TokenUtils.java b/src/main/java/org/starrier/common/token/TokenUtils.java
similarity index 84%
rename from src/main/java/org/starrier/common/utils/TokenUtils.java
rename to src/main/java/org/starrier/common/token/TokenUtils.java
index 358c92b..126e868 100644
--- a/src/main/java/org/starrier/common/utils/TokenUtils.java
+++ b/src/main/java/org/starrier/common/token/TokenUtils.java
@@ -1,11 +1,10 @@
-package org.starrier.common.utils;
+package org.starrier.common.token;
import com.google.common.collect.Maps;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.NonNull;
-import org.starrier.common.token.DESCoder;
import java.util.Collections;
import java.util.Date;
@@ -29,7 +28,7 @@ public class TokenUtils {
* @param claims
* @return
*/
- public static String generateToken(Map claims) throws Exception {
+ public static String generateToken(Map claims) {
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 30000L))
@@ -43,7 +42,7 @@ public static String generateToken(Map claims) throws Exception
* @param token 要解析的token信息
* @return
*/
- private static Optional getClaimsFromToken(String token) throws Exception {
+ private static Optional getClaimsFromToken(String token) {
return Optional.ofNullable(Jwts.parser()
.setSigningKey(new DESCoder().toKey(SECRET))
.parseClaimsJws(token)
@@ -58,7 +57,7 @@ private static Optional getClaimsFromToken(String token) throws Exceptio
*/
public static boolean isExpired(String token) throws Exception {
Optional claims = getClaimsFromToken(token);
- return claims.filter((@NonNull var value) -> !value.getExpiration().before(new Date())).isPresent();
+ return claims.filter(value -> !value.getExpiration().before(new Date())).isPresent();
}
/**
@@ -67,12 +66,12 @@ public static boolean isExpired(String token) throws Exception {
* @param token 要解析的token信息
* @return
*/
- private static Map extractInfo(String token) throws Exception {
+ private static Map extractInfo(String token) {
Optional claims = getClaimsFromToken(token);
if (claims.isPresent()) {
Set keySet = claims.get().keySet();
Map info = Maps.newHashMapWithExpectedSize(keySet.size());
- keySet.forEach((@NonNull var key) -> info.put(key, claims.get().get(key)));
+ keySet.forEach((@NonNull String key) -> info.put(key, claims.get().get(key)));
return info;
}
return Collections.emptyMap();
diff --git a/src/main/java/org/starrier/common/token/package-info.java b/src/main/java/org/starrier/common/token/package-info.java
new file mode 100644
index 0000000..cbe1099
--- /dev/null
+++ b/src/main/java/org/starrier/common/token/package-info.java
@@ -0,0 +1,7 @@
+/**
+ * @author Starrier
+ * @date 2019/10/15
+ * @version 0.0.1-SNAPSHOT
+ * @since 0.0.1-SNAPSHOT
+ */
+package org.starrier.common.token;
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/utils/CornUtils.java b/src/main/java/org/starrier/common/utils/CornUtils.java
new file mode 100644
index 0000000..1f0d6dd
--- /dev/null
+++ b/src/main/java/org/starrier/common/utils/CornUtils.java
@@ -0,0 +1,8 @@
+package org.starrier.common.utils;
+
+/**
+ * @author imperator
+ * @date 2019-09-10
+ */
+public class CornUtils {
+}
diff --git a/src/main/java/org/starrier/common/utils/DateUtils.java b/src/main/java/org/starrier/common/utils/DateUtils.java
index 9275a57..40ad07f 100644
--- a/src/main/java/org/starrier/common/utils/DateUtils.java
+++ b/src/main/java/org/starrier/common/utils/DateUtils.java
@@ -1,42 +1,120 @@
package org.starrier.common.utils;
+import com.google.common.collect.Lists;
+import lombok.SneakyThrows;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
+import org.springframework.core.convert.converter.Converter;
+import org.starrier.common.annotation.logger.ExceptionZero;
import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import static org.starrier.common.constant.Constant.FOUR;
+import static org.starrier.common.constant.DataConstant.DATE_FORMAT_DEFAULT;
/**
* @author Starrier
* @date 2019/4/18
*/
-public class DateUtils {
+public class DateUtils implements Converter {
+
+ private static final List FOR_MARTS = Lists.newArrayListWithExpectedSize(FOUR);
+
+ public static final String FULL_TIME_PATTERN = "yyyyMMddHHmmss";
- public final static String DATE_FORMAT_DEFAULT = "yyyy-MM-dd";
- public final static String DATE_FORMAT_TIME = "yyyy-MM-dd HH:mm";
- public final static String DATE_FORMAT_ALL = "yyyy-MM-dd HH:mm:ss";
- public final static String DATE_CHINA_DEFAULT = "yyyy年MM月dd日";
+ public static final String FULL_TIME_SPLIT_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+ public static final String CST_TIME_PATTERN = "EEE MMM dd HH:mm:ss zzz yyyy";
/**
+ * 格式化时间,格式为 yyyyMMddHHmmss
*
- * @param date
- * @param num
- * @return
+ * @param localDateTime LocalDateTime
+ * @return 格式化后的字符串
+ */
+ public static String formatFullTime(LocalDateTime localDateTime) {
+ return formatFullTime(localDateTime, FULL_TIME_PATTERN);
+ }
+
+ /**
+ * 根据传入的格式,格式化时间
+ *
+ * @param localDateTime LocalDateTime
+ * @param format 格式
+ * @return 格式化后的字符串
+ */
+ public static String formatFullTime(LocalDateTime localDateTime, String format) {
+ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
+ return localDateTime.format(dateTimeFormatter);
+ }
+
+ /**
+ * 根据传入的格式,格式化时间
+ *
+ * @param date Date
+ * @param format 格式
+ * @return 格式化后的字符串
+ */
+ public static String getDateFormat(Date date, String format) {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format, Locale.CHINA);
+ return simpleDateFormat.format(date);
+ }
+
+ /**
+ * 格式化 CST类型的时间字符串
+ *
+ * @param date CST类型的时间字符串
+ * @param format 格式
+ * @return 格式化后的字符串
+ * @throws ParseException 异常
+ */
+ public static String formatCSTTime(String date, String format) throws ParseException {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(CST_TIME_PATTERN, Locale.US);
+ Date usDate = simpleDateFormat.parse(date);
+ return DateUtils.getDateFormat(usDate, format);
+ }
+
+ /**
+ * 格式化 Instant
+ *
+ * @param instant Instant
+ * @param format 格式
+ * @return 格式化后的字符串
+ */
+ public static String formatInstant(Instant instant, String format) {
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+ return localDateTime.format(DateTimeFormatter.ofPattern(format));
+ }
+
+ /**
+ * @param date {@link String}
+ * @param num {@link Integer}
+ * @return {@link String}
*/
public static String getDay(String date, int num) {
return getDay(date, num, DATE_FORMAT_DEFAULT);
}
/**
- *
* @param date
* @param num
* @param format
* @return
*/
public static String getDay(String date, int num, String format) {
- long t = parseStringToLong(date);
- return getDay(t, num, DATE_FORMAT_DEFAULT);
+ return getDay(parseStringToLong(date), num, DATE_FORMAT_DEFAULT);
}
/**
@@ -51,7 +129,8 @@ public static String getDay(long date, int num) {
}
/**
- * 获取指定日期前后num天的日期
+ * 获取指定日期前后num天的日期
+ *
* @param date
* @param num
* @param format
@@ -85,8 +164,7 @@ public static String longToString(long time, String format) {
if (StringUtils.isBlank(format)) {
format = DATE_FORMAT_DEFAULT;
}
- DateTime dTime = new DateTime(time);
- return dTime.toString(format);
+ return new DateTime().toString(format);
}
/**
@@ -148,93 +226,136 @@ public static String getCurrentTime() {
* 获得当前时间
*
* @param format 日期格式
- * @return
+ * @return {@link String}
*/
public static String getCurrentTime(String format) {
- DateTime dTime = new DateTime();
- return dTime.toString(format);
+ return new DateTime().toString(format);
}
/**
* 将字符串类型的日期转换为毫秒数
*
- * @param dateStr
- * @return
+ * @param dateStr is the start of time.
+ * @return {@link Long}
*/
+ @ExceptionZero
public static long parseStringToLong(String dateStr) {
dateStr = dateStr.trim();
+ Calendar cal = Calendar.getInstance();
if (dateStr.length() == 19 || dateStr.length() == 23) {
- try {
- Calendar cal = Calendar.getInstance();
- cal.set(Integer.parseInt(dateStr.substring(0, 4)),
- Integer.parseInt(dateStr.substring(5, 7)) - 1,
- Integer.parseInt(dateStr.substring(8, 10)),
- Integer.parseInt(dateStr.substring(11, 13)),
- Integer.parseInt(dateStr.substring(14, 16)),
- Integer.parseInt(dateStr.substring(17, 19)));
- cal.set(Calendar.MILLISECOND, 0);
- return (cal.getTime().getTime());
- } catch (Exception e) {
- return 0;
- }
+ cal.set(Integer.parseInt(dateStr.substring(0, 4)),
+ Integer.parseInt(dateStr.substring(5, 7)) - 1,
+ Integer.parseInt(dateStr.substring(8, 10)),
+ Integer.parseInt(dateStr.substring(11, 13)),
+ Integer.parseInt(dateStr.substring(14, 16)),
+ Integer.parseInt(dateStr.substring(17, 19)));
+ cal.set(Calendar.MILLISECOND, 0);
+ return (cal.getTime().getTime());
} else if (dateStr.length() == 16) {
- try {
- Calendar cal = Calendar.getInstance();
- cal.set(Integer.parseInt(dateStr.substring(0, 4)),
- Integer.parseInt(dateStr.substring(5, 7)) - 1,
- Integer.parseInt(dateStr.substring(8, 10)),
- Integer.parseInt(dateStr.substring(11, 13)),
- Integer.parseInt(dateStr.substring(14, 16)));
- cal.set(Calendar.MILLISECOND, 0);
- return (cal.getTime().getTime());
- } catch (Exception e) {
- return 0;
- }
-
+ cal.set(Integer.parseInt(dateStr.substring(0, 4)),
+ Integer.parseInt(dateStr.substring(5, 7)) - 1,
+ Integer.parseInt(dateStr.substring(8, 10)),
+ Integer.parseInt(dateStr.substring(11, 13)),
+ Integer.parseInt(dateStr.substring(14, 16)));
+ cal.set(Calendar.MILLISECOND, 0);
+ return (cal.getTime().getTime());
} else if (dateStr.length() == 14) {
- try {
- Calendar cal = Calendar.getInstance();
- cal.set(Integer.parseInt(dateStr.substring(0, 4)),
- Integer.parseInt(dateStr.substring(4, 6)) - 1,
- Integer.parseInt(dateStr.substring(6, 8)),
- Integer.parseInt(dateStr.substring(8, 10)),
- Integer.parseInt(dateStr.substring(10, 12)),
- Integer.parseInt(dateStr.substring(12, 14)));
- cal.set(Calendar.MILLISECOND, 0);
- return (cal.getTime().getTime());
- } catch (Exception e) {
- return 0;
- }
+ cal.set(Integer.parseInt(dateStr.substring(0, 4)),
+ Integer.parseInt(dateStr.substring(4, 6)) - 1,
+ Integer.parseInt(dateStr.substring(6, 8)),
+ Integer.parseInt(dateStr.substring(8, 10)),
+ Integer.parseInt(dateStr.substring(10, 12)),
+ Integer.parseInt(dateStr.substring(12, 14)));
+ cal.set(Calendar.MILLISECOND, 0);
+ return (cal.getTime().getTime());
} else if (dateStr.length() == 10 || dateStr.length() == 11) {
- try {
- Calendar cal = Calendar.getInstance();
- cal.set(Integer.parseInt(dateStr.substring(0, 4)),
- Integer.parseInt(dateStr.substring(5, 7)) - 1,
- Integer.parseInt(dateStr.substring(8, 10)), 0, 0, 0);
- cal.set(Calendar.MILLISECOND, 0);
- return (cal.getTime().getTime());
- } catch (Exception e) {
- return 0;
- }
+ cal.set(Integer.parseInt(dateStr.substring(0, 4)),
+ Integer.parseInt(dateStr.substring(5, 7)) - 1,
+ Integer.parseInt(dateStr.substring(8, 10)), 0, 0, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ return (cal.getTime().getTime());
} else if (dateStr.length() == 8) {
- try {
- Calendar cal = Calendar.getInstance();
- cal.set(Integer.parseInt(dateStr.substring(0, 4)),
- Integer.parseInt(dateStr.substring(4, 6)) - 1,
- Integer.parseInt(dateStr.substring(6, 8)), 0, 0, 0);
- cal.set(Calendar.MILLISECOND, 0);
- return (cal.getTime().getTime());
- } catch (Exception e) {
- return 0;
- }
+ cal.set(Integer.parseInt(dateStr.substring(0, 4)),
+ Integer.parseInt(dateStr.substring(4, 6)) - 1,
+ Integer.parseInt(dateStr.substring(6, 8)), 0, 0, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ return (cal.getTime().getTime());
} else {
- try {
- return Long.parseLong(dateStr);
- } catch (Exception e) {
- return 0;
- }
+ return Long.parseLong(dateStr);
+ }
+ }
+
+ static {
+ FOR_MARTS.add("yyyy-MM");
+ FOR_MARTS.add("yyyy-MM-dd");
+ FOR_MARTS.add("yyyy-MM-dd hh:mm");
+ FOR_MARTS.add("yyyy-MM-dd hh:mm:ss");
+ }
+
+ @Override
+ public Date convert(String source) {
+ String value = source.trim();
+ if (StringUtils.EMPTY.equals(value)) {
+ return null;
+ }
+ if (source.matches("^\\d{4}-\\d{1,2}$")) {
+ return parseDate(source, FOR_MARTS.get(0));
+ } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) {
+ return parseDate(source, FOR_MARTS.get(1));
+ } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) {
+ return parseDate(source, FOR_MARTS.get(2));
+ } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) {
+ return parseDate(source, FOR_MARTS.get(3));
+ } else {
+ throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
+
+
+ /**
+ * 格式化日期
+ *
+ * @param dateStr String 字符型日期
+ * @param format String 格式
+ * @return Date 日期
+ */
+ @SneakyThrows(Exception.class)
+ public Date parseDate(String dateStr, String format) {
+ DateFormat dateFormat = new SimpleDateFormat(format);
+ return dateFormat.parse(dateStr);
+ }
+
+ /**
+ * 根据时间戳,获取当天凌晨时间 2019-10-18 00:00:00.0
+ *
+ * @return {@link Timestamp}
+ */
+ public static Timestamp getCurrentDayStartTime() {
+ //当日零点零分零秒的毫秒数
+ long zero = todayZeroTime();
+ return new Timestamp(zero);
+ }
+
+ /**
+ * 根据时间戳,获取当天最晚时间段 2019-10-18 23:59:59.999
+ *
+ * @return {@link Timestamp}
+ */
+ public static Timestamp getCurrentDayEndTime() {
+ long zero = todayZeroTime();
+ //今天23点59分59秒的毫秒数
+ long twelve = zero + 24 * 60 * 60 * 1000 - 1;
+ return new Timestamp(twelve);
+ }
+
+ /**
+ * 今天零点零分零秒的毫秒数
+ *
+ * @return 今天零点零分零秒的毫秒数
+ */
+ private static long todayZeroTime(){
+ return System.currentTimeMillis() / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();
+ }
}
\ No newline at end of file
diff --git a/src/main/java/org/starrier/common/utils/FastJsonUtils.java b/src/main/java/org/starrier/common/utils/FastJsonUtils.java
new file mode 100644
index 0000000..2cf9c0b
--- /dev/null
+++ b/src/main/java/org/starrier/common/utils/FastJsonUtils.java
@@ -0,0 +1,58 @@
+package org.starrier.common.utils;
+
+import java.util.List;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+
+/**
+ * @author imperator
+ * @date 2019-09-10
+ */
+public class FastJsonUtils {
+
+ /**
+ * 功能描述:把JSON数据转换成指定的java对象
+ *
+ * @param jsonData JSON数据
+ * @param clazz 指定的java对象
+ * @return 指定的java对象
+ */
+ public static T getJsonToBean(String jsonData, Class clazz) {
+ return JSON.parseObject(jsonData, clazz);
+ }
+
+ /**
+ * 功能描述:把java对象转换成JSON数据
+ *
+ * @param object java对象
+ * @return JSON数据
+ */
+ public static String getBeanToJson(Object object) {
+ return JSON.toJSONString(object);
+ }
+
+ /**
+ * 功能描述:把JSON数据转换成指定的java对象列表
+ *
+ * @param jsonData JSON数据
+ * @param clazz 指定的java对象
+ * @return List
+ */
+ public static List getJsonToList(String jsonData, Class clazz) {
+ return JSON.parseArray(jsonData, clazz);
+ }
+
+ /**
+ * 功能描述:把JSON数据转换成较为复杂的List