Commit 001708c2 by qiuweili123

modify

parent b765c5c8
...@@ -12,9 +12,13 @@ ...@@ -12,9 +12,13 @@
### IntelliJ IDEA ### ### IntelliJ IDEA ###
.idea .idea
*.iws
*.iml *.iml
*.ipr .idea/.*
.idea/workspace.xml
.idea/*.*
.idea/
.idea/libraries/
### NetBeans ### ### NetBeans ###
/nbproject/private/ /nbproject/private/
...@@ -23,3 +27,14 @@ ...@@ -23,3 +27,14 @@
/dist/ /dist/
/nbdist/ /nbdist/
/.nb-gradle/ /.nb-gradle/
##MAVEN################################################################
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
...@@ -5,11 +5,61 @@ ...@@ -5,11 +5,61 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>common-core</artifactId> <artifactId>common-core</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</dependency>
<!--防止编译出现错误提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
package com.secoo.mall.common.constant;
public interface CharConstant {
String CHARSET_NAME = "UTF-8";
/**
* Carriage Return.
*/
char CR = '\r';
/**
* Double Quote.
*/
char DQUOTE = '\"';
/**
* Equals '='.
*/
char EQ = '=';
/**
* Line Feed.
*/
char LF = '\n';
/**
* Single Quote ['].
*/
char QUOTE = '\'';
/**
* Space.
*/
char SPACE = ' ';
/**
* Tab.
*/
char TAB = '\t';
/**
* DOT.
*/
char DOT = ',';
/**
* colon
*/
char COLON = ':';
/**
* minus
*/
char MINUS = '-';
/**
* Underline
*/
char UNDERLINE = '_';
}
package com.secoo.mall.common.constant;
public interface CommonConstant {
interface Success {
Integer CODE = 0;
String MSG = "success";
}
}
package com.secoo.mall.common.constant;
public interface PageConstant {
Long DEFAULT_CUR_PAGE = 1L;
Long DEFAULT_PAGE_SIZE = 20L;
String RESULT_LIST = "resultList";
String TOTAL_COUNT = "totalCount";
}
package com.secoo.mall.common.core.annotation;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TrationalService {
}
package com.secoo.mall.common.core.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import javax.annotation.Resource;
@Aspect
@Component
public class AopTransaction {
@Resource
private PlatformTransactionManager transactionManager;
/**
* 增加切入点
*/
@Pointcut("execution(* com.secoo.mall..service..add*(..)) " +
"|| execution(* com.secoo.mall..service..save*(..)) " +
"|| execution(* com.secoo.mall..service..create*(..))")
public void createPointCut() {
}
/**
* 更新切入点
*/
@Pointcut("execution(* com.secoo.mall..service..modify*(..)) " +
"|| execution(* com.secoo.mall..service..update*(..))")
public void updatePointCut() {
}
/**
* 删除切入点
*/
@Pointcut("execution(* com.secoo.mall..service..remove*(..)) " +
"|| execution(* com.secoo.mall..service..delete*(..))")
public void deletePointCut() {
}
/**
* 带有事务注解的方法
*/
@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")
public void transactionalAnnotation() {
}
/**
* 带有事务注解的方法不进行拦截
*
* @param joinPoint
* @return
*/
@Around("( AopTransaction.createPointCut() " +
"|| AopTransaction.deletePointCut() " +
"|| AopTransaction.updatePointCut()) " +
"&& !AopTransaction.transactionalAnnotation()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);
Object object = null;
try {
object = joinPoint.proceed();
transactionManager.commit(status);
} catch (Throwable e) {
transactionManager.rollback(status);
throw e;
}
return object;
}
}
package com.secoo.mall.common.core.bean;
import org.apache.commons.lang3.builder.ToStringBuilder;
import java.io.Serializable;
public abstract class AbsBaseBean<T> implements Serializable {
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
}
package com.secoo.mall.common.core.bean;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public class DefaultThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;
public DefaultThreadFactory(String name) {
SecurityManager s = System.getSecurityManager();
group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
if (null == name || name.isEmpty()) {
name = "pool";
}
namePrefix = name + "-" + poolNumber.getAndIncrement() + "-thread-";
}
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
if (t.isDaemon())
t.setDaemon(false);
if (t.getPriority() != Thread.NORM_PRIORITY)
t.setPriority(Thread.NORM_PRIORITY);
return t;
}
}
package com.secoo.mall.common.core.bean;
import java.util.List;
public interface Pageable<T> {
List<T> getResultList();
/*总记录数*/
Long getTotalCount();
/*当前页*/
Long getCurPage();
/*当前每页显示数 */
Long getPageSize();
}
package com.secoo.mall.common.core.bean;
import com.secoo.mall.common.constant.PageConstant;
public class ReqPage<T> {
/*当前页*/
private Long curPage;
/*当前每页显示数量*/
private Long pageSize;
public ReqPage(Long curPage, Long pageSize) {
this.curPage = curPage;
this.pageSize = pageSize;
}
public Long getCurPage() {
return curPage == null ? PageConstant.DEFAULT_CUR_PAGE : curPage;
}
public void setCurPage(Long curPage) {
this.curPage = curPage;
}
public Long getPageSize() {
return pageSize;
}
public void setPageSize(Long pageSize) {
this.pageSize = pageSize == null ? PageConstant.DEFAULT_PAGE_SIZE : pageSize;
}
}
package com.secoo.mall.common.core.bean;
import java.io.Serializable;
public class Response<T> implements Serializable {
private Integer code;
private String msg;
private T data;
public Response() {
}
public Response(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
package com.secoo.mall.common.core.bean;
public class Sort {
private String sort;
/*排序字段是否转化为下划线形式*/
private Boolean isToSnake;
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
public Boolean getToSnake() {
return isToSnake == null ? true : isToSnake;
}
public void setToSnake(Boolean toSnake) {
isToSnake = toSnake;
}
}
package com.secoo.mall.common.core.errorcode;
public interface CommonErrorCode {
ErrorCode DATABASE_OPERATION_EXCEPTION = new ErrorCode(1, "Db Operation Error");
ErrorCode PARAMETER_EXCEPTION = new ErrorCode(2, "");
ErrorCode SYSTEM_INTERNAL_EXCEPTION = new ErrorCode(3, "Intenal Server Error ");
ErrorCode INVALID_TOKEN = new ErrorCode(4, "Invalid Token");
ErrorCode OPERATIOIN_FAIL = new ErrorCode(5, "Operation Fail");
}
package com.secoo.mall.common.core.errorcode;
public class ErrorCode {
private Integer code;
private String msg;
public ErrorCode(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public Integer getCode() {
return code;
}
public String getMsg() {
return this.msg;
}
@Override
public String toString() {
return this.msg;
}
}
package com.secoo.mall.common.core.exception;
import com.secoo.mall.common.core.errorcode.ErrorCode;
import org.apache.commons.lang3.StringUtils;
public class BusinessException extends RuntimeException {
private ErrorCode errorCode;
private Integer code;
private String msg;
private Object[] args;
public BusinessException() {
super();
}
public BusinessException(ErrorCode errorCode) {
this(errorCode, new Object[0]);
}
public BusinessException(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public BusinessException(Integer code, String msg, Object... args) {
this.code = code;
this.msg = msg;
this.args = args;
}
public BusinessException(ErrorCode errorCode, Object arg) {
this(errorCode, new Object[]{arg});
}
public BusinessException(ErrorCode errorCode, Object... args) {
super();
this.errorCode = errorCode;
if (errorCode != null) {
this.code = errorCode.getCode();
this.msg = errorCode.getMsg();
}
if (args == null) {
this.args = new Object[0];
} else {
this.args = args;
}
}
public Integer getCode() {
return this.code;
}
public ErrorCode getErrorCode() {
return this.errorCode;
}
public Object[] getArgs() {
return this.args;
}
public String getMessage() {
StringBuilder exMessage = new StringBuilder();
exMessage.append("code: ");
exMessage.append(this.code);
exMessage.append("; message: ");
exMessage.append(getMsg());
return exMessage.toString();
}
public String getMsg() {
if (StringUtils.isNotEmpty(this.msg)) {
return String.format(this.msg, this.args);
}
return msg;
}
}
package com.secoo.mall.common.core.exception;
import com.secoo.mall.common.core.errorcode.CommonErrorCode;
public class ParameterException extends BusinessException {
public ParameterException() {
super(CommonErrorCode.PARAMETER_EXCEPTION);
}
public ParameterException(String msg) {
super(CommonErrorCode.PARAMETER_EXCEPTION.getCode(), msg);
}
public ParameterException(String msg, Object... args) {
super(CommonErrorCode.PARAMETER_EXCEPTION.getCode(), msg, args);
}
}
package com.secoo.mall.common.core.exception;
import com.secoo.mall.common.core.errorcode.CommonErrorCode;
/**
* 用于识别日志中的未知的系统异常,使用log.error输出
*/
public class SystemInternalException extends BusinessException {
public SystemInternalException() {
super(CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION);
}
}
...@@ -5,11 +5,22 @@ ...@@ -5,11 +5,22 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>common-util</artifactId> <artifactId>common-util</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
package com.secoo.mall.common.constant;
public interface ThreadPoolConstant {
//核心线程数
int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors();
//最大线程数
int MAX_POOL_SIZE = CORE_POOL_SIZE * 2;
}
package com.secoo.mall.common.util.array;
import org.apache.commons.lang3.ArrayUtils;
public class ArrayUtil extends ArrayUtils {
}
package com.secoo.mall.common.util.bean;
import com.secoo.mall.common.core.errorcode.CommonErrorCode;
import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.util.json.FastJsonUtil;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.ArrayUtils;
import java.lang.reflect.Field;
import java.util.Map;
public class BeanUtil extends BeanUtils {
public static boolean containsInteger(Integer[] arr, Integer obj) {
return ArrayUtils.contains(arr, obj);
}
public static boolean containsLong(Long[] arr, Long obj) {
return ArrayUtils.contains(arr, obj);
}
public static <T> Object getFieldValueByName(T obj, String fieldName) throws Exception {
Class clazz = obj.getClass();
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(obj);
}
public static <T> T transMap2Bean(Object object, Class<T> classOfT) {
if (object == null || !(object instanceof Map)) {
return null;
}
String tmp = FastJsonUtil.toString(object);
return FastJsonUtil.toBean(tmp, classOfT);
}
public static void copyProperties(Object dest, Object orig) {
try {
copyProperties(dest, orig);
} catch (Exception e) {
throw new BusinessException(CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION);
}
}
public static void copyProperties(Object bean, String name, Object value) {
try {
copyProperty(bean, name, value);
} catch (Exception e) {
throw new BusinessException(CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION);
}
}
}
package com.secoo.mall.common.util.checker;
import com.secoo.mall.common.core.errorcode.ErrorCode;
import com.secoo.mall.common.core.exception.ParameterException;
import com.secoo.mall.common.util.decimal.DecimalUtil;
import com.secoo.mall.common.util.colletion.MapUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
public abstract class BeanChecker {
public static void assertNotNull(Object obj, String errMsg) {
if (obj == null) {
throw new ParameterException(errMsg);
}
}
public static void assertNotEmpty(String str, String errMsg) {
if (StringUtils.isEmpty(str)) {
throw new ParameterException(errMsg);
}
}
public static void assertNotEmpty(Collection collection, String errMsg) {
if (CollectionUtils.isEmpty(collection)) {
throw new ParameterException(errMsg);
}
}
public static void assertNotEmpty(Map map, String errMsg) {
if (MapUtil.isEmpty(map)) {
throw new ParameterException(errMsg);
}
}
public static void assertPositive(Long o, String errMsg) {
if (o == null || o <= 0) {
throw new ParameterException(errMsg);
}
}
public static void assertPositive(Integer o, String errMsg) {
if (o == null || o <= 0) {
throw new ParameterException(errMsg);
}
}
public static void assertPositive(Float o, String errMsg) {
if (o == null || o <= 0) {
throw new ParameterException(errMsg);
}
}
public static void assertPositive(BigDecimal o, String errMsg) {
if (o == null || o.compareTo(new BigDecimal("0")) <= 0) {
throw new ParameterException(errMsg);
}
}
public static void assertLongPositive(List<Long> objs, String errMsg) {
for (Long o : objs) {
assertPositive(o, errMsg);
}
}
public static void assertIntegerPositive(List<Integer> objs, String errMsg) {
for (Integer o : objs) {
assertPositive(o, errMsg);
}
}
public static void assertNotNegative(Long o, String errMsg) {
if (o == null || o < 0) {
throw new ParameterException(errMsg);
}
}
public static void assertNotNegative(Integer o, String errMsg) {
if (o == null || o < 0) {
throw new ParameterException(errMsg);
}
}
public static void assertNotNegative(BigDecimal o, String errMsg) {
if (o == null || o.compareTo(new BigDecimal("0")) < 0) {
throw new ParameterException(errMsg);
}
}
public static void assertNotNegativeLong(List<Long> objs, String errMsg) {
for (Long o : objs) {
assertNotNegative(o, errMsg);
}
}
public static void assertNotNegativeInteger(List<Integer> objs, String errMsg) {
for (Integer o : objs) {
assertNotNegative(o, errMsg);
}
}
public static void assertPattern(String str, String pattern, String errMsg) {
if (StringUtils.isEmpty(str)
|| StringUtils.isEmpty(pattern)
|| !Pattern.matches(pattern, str)) {
throw new ParameterException(errMsg);
}
}
public static void assertPattern(String str, String pattern, ErrorCode errCode) {
if (StringUtils.isEmpty(str)
|| StringUtils.isEmpty(pattern)
|| !Pattern.matches(pattern, str)) {
throw new ParameterException(errCode.getMsg());
}
}
public static void assertBefore(Date date1, Date date2, String errMsg) {
if (date1 == null || date2 == null
|| !date1.before(date2)) {
throw new ParameterException(errMsg);
}
}
public static void assertBetween(BigDecimal data, BigDecimal min, BigDecimal max, String errMsg) {
if (!DecimalUtil.isBetween(data, min, max)) {
throw new ParameterException(errMsg);
}
}
public static void assertMaxLength(String str, int maxLength, String errMsg) {
if (StringUtils.isNotEmpty(str)
&& str.length() > maxLength) {
throw new ParameterException(errMsg);
}
}
}
package com.secoo.mall.common.util.colletion;
import org.apache.commons.collections.CollectionUtils;
public class CollectionUtil extends CollectionUtils {
}
package com.secoo.mall.common.util.colletion;
import org.apache.commons.collections.ListUtils;
public class ListUtil extends ListUtils {
}
package com.secoo.mall.common.util.colletion;
import org.apache.commons.collections.MapUtils;
public class MapUtil extends MapUtils {
}
package com.secoo.mall.common.util.colletion;
import org.apache.commons.collections.SetUtils;
public class SetUtil extends SetUtils {
}
package com.secoo.mall.common.util.decimal;
import com.secoo.mall.common.core.exception.ParameterException;
import java.math.BigDecimal;
import java.util.Objects;
/**
* Created by liqiuwei on 2017/11/21.
*/
public class DecimalUtil {
// 默认小数运算精度
private static final int DEF_DIV_SCALE = 2;
private static final BigDecimal DEF_V = new BigDecimal("0");
// 默认四舍五入
private static final int ROUND_MODE = BigDecimal.ROUND_HALF_UP;
public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
return calculate(v1, v2, Operator.ADD);
}
public static BigDecimal sub(BigDecimal v1, BigDecimal v2) {
return calculate(v1, v2, Operator.SUB);
}
public static BigDecimal mul(BigDecimal v1, BigDecimal v2) {
return calculate(v1, v2, Operator.MUL);
}
public static BigDecimal div(BigDecimal v1, BigDecimal v2) {
return calculate(v1, v2, Operator.DIV);
}
public static BigDecimal div(BigDecimal v1, BigDecimal v2, int scale) {
if (scale < 0 || v2.intValue() == 0) {
throw new ParameterException();
}
return v1.divide(v2, scale, ROUND_MODE);
}
/**
* 等于
*
* @param v1
* @param v2
* @return
*/
public static boolean eq(BigDecimal v1, BigDecimal v2) {
return compare(v1, v2, Operator.EQ);
}
/**
* 不等于
*
* @param v1
* @param v2
* @return
*/
public static boolean neq(BigDecimal v1, BigDecimal v2) {
return compare(v1, v2, Operator.NEQ);
}
/**
* 大于
*
* @param v1
* @param v2
* @return
*/
public static boolean gt(BigDecimal v1, BigDecimal v2) {
return compare(v1, v2, Operator.GT);
}
/**
* 大于等于
*
* @param v1
* @param v2
* @return
*/
public static boolean egt(BigDecimal v1, BigDecimal v2) {
return compare(v1, v2, Operator.EGT);
}
/**
* 小于
*
* @param v1
* @param v2
* @return
*/
public static boolean lt(BigDecimal v1, BigDecimal v2) {
return compare(v1, v2, Operator.LT);
}
/**
* 小于等于
*
* @param v1
* @param v2
* @return
*/
public static boolean elt(BigDecimal v1, BigDecimal v2) {
return compare(v1, v2, Operator.ELT);
}
public static boolean isBetween(BigDecimal data, BigDecimal min, BigDecimal max) {
data = getScaleValue(data);
min = getScaleValue(min);
max = getScaleValue(max);
if (data.compareTo(min) >= 0 && data.compareTo(max) <= 0) {
return true;
} else {
return false;
}
}
public static BigDecimal getScaleValue(BigDecimal o) {
BigDecimal n = Objects.isNull(o) ? DEF_V : o;
return n.setScale(DEF_DIV_SCALE, ROUND_MODE);
}
private static BigDecimal calculate(BigDecimal v1, BigDecimal v2, Operator operator) {
BigDecimal b1 = getScaleValue(v1);
BigDecimal b2 = getScaleValue(v2);
switch (operator) {
case ADD:
return b1.add(b2);
case SUB:
return b1.subtract(b2);
case MUL:
return b1.multiply(b2);
case DIV:
return div(b1, b2, DEF_DIV_SCALE);
}
return null;
}
private static boolean compare(BigDecimal v1, BigDecimal v2, Operator operator) {
BigDecimal b1 = getScaleValue(v1);
BigDecimal b2 = getScaleValue(v2);
int result = b1.compareTo(b2);
switch (operator) {
case EQ:
return result == 0;
case NEQ:
return result != 0;
case GT:
return result == 1;
case EGT:
return result >= 0;
case LT:
return result == -1;
case ELT:
return result <= 0;
}
return false;
}
enum Operator {
ADD, SUB, MUL, DIV, EQ, NEQ, GT, EGT, LT, ELT;
}
}
package com.secoo.mall.common.util.json;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public interface FastJsonUtil {
SerializerFeature[] FEATURES = {
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullNumberAsZero,
SerializerFeature.WriteNullBooleanAsFalse,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.WriteDateUseDateFormat
};
/**
* 直接获取第一个key相同的string
*
* @param payload
* @param key
* @return
*/
static String getString(String payload, String key) {
JSONObject payloadJson = JSON.parseObject(payload);
return getString(payloadJson, key);
}
static String getString(JSONObject payloadJson, String key) {
Set entrySet = payloadJson.entrySet();
String result;
for (Object entry : entrySet) {
HashMap.Entry entryNode = (HashMap.Entry) entry;
String innerKey = String.valueOf(entryNode.getKey());
if (innerKey.equals(key) && !(entryNode.getValue() instanceof JSONObject)) {
return String.valueOf(entryNode.getValue());
} else {
if (entryNode.getValue() instanceof JSONObject) {
result = getString(String.valueOf(payloadJson.getString(innerKey)), key);
if (StringUtils.isNotBlank(result)) {
return result;
}
} else if (entryNode.getValue() instanceof JSONArray) {
JSONArray jarray = (JSONArray) entryNode.getValue();
for (Object jo : jarray) {
result = getString(JSON.toJSONString(jo), key);
if (StringUtils.isNotBlank(result)) {
return result;
}
}
} else {
continue;
}
}
}
return null;
}
/**
* 通过父、子节点键值对获取值
*
* @param payload
* @param fatherKey
* @param key
* @return
*/
static String getStringWithFatherKey(String payload, String fatherKey, String key) {
JSONObject payloadJson = JSON.parseObject(payload);
return getStringWithFatherKey(payloadJson, fatherKey, key, fatherKey);
}
static String getStringWithFatherKey(JSONObject payloadJson, String fatherKey, String key, String originFatherKey) {
Set entrySet = payloadJson.entrySet();
String result;
for (Object entry : entrySet) {
HashMap.Entry entryNode = (HashMap.Entry) entry;
String innerKey = String.valueOf(entryNode.getKey());
if (innerKey.equals(key) && fatherKey.equals(originFatherKey) && !(entryNode.getValue() instanceof JSONObject)) {
return String.valueOf(entryNode.getValue());
} else {
if (entryNode.getValue() instanceof JSONObject) {
result = getStringWithFatherKey((JSONObject) entryNode.getValue(), innerKey, key, originFatherKey);
if (StringUtils.isNotBlank(result)) {
return result;
}
} else if (entryNode.getValue() instanceof JSONArray) {
JSONArray jarray = (JSONArray) entryNode.getValue();
for (Object jo : jarray) {
result = getStringWithFatherKey((JSONObject) jo, innerKey, key, originFatherKey);
if (StringUtils.isNotBlank(result)) {
return result;
}
}
} else {
continue;
}
}
}
return null;
}
/**
* 直接获取第一个key相同, 类相同的值
*
* @param payload
* @param key
* @return
*/
static <T> T getValue(String payload, String key, Class<T> clazz) {
JSONObject payloadJson = JSON.parseObject(payload);
return getValue(payloadJson, key, clazz);
}
static <T> T getValue(JSONObject payloadJson, String key, Class<T> clazz) {
Set entrySet = payloadJson.entrySet();
T result;
for (Object entry : entrySet) {
HashMap.Entry entryNode = (HashMap.Entry) entry;
String innerKey = String.valueOf(entryNode.getKey());
if (innerKey.equals(key) && clazz.isInstance(entryNode.getValue())) {
return (T) entryNode.getValue();
} else {
if (entryNode.getValue() instanceof JSONObject) {
result = getValue(payloadJson.getJSONObject(innerKey), key, clazz);
if (result != null) {
return result;
}
} else if (entryNode.getValue() instanceof JSONArray) {
JSONArray jarray = (JSONArray) entryNode.getValue();
for (Object jo : jarray) {
result = getValue((JSONObject) jo, key, clazz);
if (result != null) {
return result;
}
}
} else {
continue;
}
}
}
return null;
}
/**
* <pre>
* 将对象转为json,下划线输出
* fastjson缺省使用CamelCase,在1.2.15版本之后,fastjson支持配置PropertyNamingStrategy
* </pre>
*
* @param obj
* @return
*/
static <T> String toSnakeCaseString(T obj) {
SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
return JSON.toJSONString(obj, config, FEATURES);
}
static <T> String toString(T obj) {
String string = JSON.toJSONString(obj);
return string;
}
static Object toBean(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
return JSON.parse(text);
}
static <T> T toBean(String text, Class<T> clazz) {
if (StringUtils.isBlank(text)) {
return null;
}
return JSON.parseObject(text, clazz);
}
static <T> Object[] toArray(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
return toList(text).toArray();
}
static <T> Object[] toArray(String text, Class<T> clazz) {
return toList(text, clazz).toArray();
}
static <T> List toList(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
return toList(text, null);
}
static <T> List<T> toList(String text, Class<T> clazz) {
if (StringUtils.isBlank(text)) {
return null;
}
return JSON.parseArray(text, clazz);
}
}
package com.secoo.mall.common.util.log;
import com.secoo.mall.common.core.errorcode.ErrorCode;
import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.util.json.FastJsonUtil;
import com.secoo.mall.common.util.string.StringUtil;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
/**
* Created by liqiuwei on 2018/7/12.
*/
public class LoggerUtil {
private static Logger logger = LoggerFactory.getLogger("app");
private static Logger errorLogger = LoggerFactory.getLogger("error");
private static String errorMsgTemplate = "exception msg:{} ";
private static String warnMsgTemplate = "warn msg:{} ";
public static Logger getLogger(Class clazz) {
return LoggerFactory.getLogger(clazz);
}
public static void info(String msg) {
logger.info(msg);
}
public static void info(String msg, Object... objs) {
Object[] objects = Arrays.stream(objs).map(obj -> FastJsonUtil.toString(obj)).toArray();
logger.info(msg, objects);
}
public static void warn(Throwable e) {
logger.warn(warnMsgTemplate, ExceptionUtils.getMessage(e), e);
}
public static void warn(String msg, Throwable e) {
logger.warn(msg, e);
}
public static void warn(String msg, Throwable e, Object... objs) {
Object[] objects = null;
if (ArrayUtils.isNotEmpty(objs)) {
Arrays.stream(objs).map(obj -> FastJsonUtil.toString(obj)).toArray();
logger.warn(msg, objects);
}
warn(e);
}
public static void error(Throwable e) {
error(null, e);
}
public static void error(String msg, Throwable e) {
error(msg, e, null);
}
public static void error(String msg, Throwable e, Object... objs) {
String msgInfo = ExceptionUtils.getMessage(e);
msg = StringUtil.isNotEmpty(msg) ? msg : errorMsgTemplate;
if (ArrayUtils.isNotEmpty(objs)) {
Object[] objects = Arrays.stream(objs).map(obj -> FastJsonUtil.toString(obj)).toArray();
logger.error(msg, objects);
logger.error(msg, e);
} else {
logger.error(msg, e);
}
errorLogger.error(errorMsgTemplate, msgInfo);
}
public static void rethrowException(Throwable e, ErrorCode errorCode) {
error(e);
throw new BusinessException(errorCode);
}
}
package com.secoo.mall.common.util.response;
import com.secoo.mall.common.constant.CommonConstant;
import com.secoo.mall.common.core.bean.Response;
import com.secoo.mall.common.core.exception.BusinessException;
public interface ResponseUtil {
static Response getFailResponse(Integer code, String msg) {
Response response = new Response(code, msg);
return response;
}
static Response getFailResponse(BusinessException e) {
Response response = new Response(e.getCode(), e.getMsg());
return response;
}
static <T> Response getSuccessResponse(T data) {
Response response = new Response(CommonConstant.Success.CODE, CommonConstant.Success.MSG);
response.setData(data);
return response;
}
}
package com.secoo.mall.common.util.string;
import com.google.common.base.CaseFormat;
import com.secoo.mall.common.constant.CharConstant;
import org.apache.commons.lang3.StringUtils;
public class StringUtil extends StringUtils {
public static String toCamelCase(String str) {
if (isEmpty(str)) {
return null;
}
return toCamelCase(str, CharConstant.UNDERLINE);
}
/**
* kebab、snake转换为camel
* kebab:短线间隔
*
* @param str
* @return
*/
public static String toCamelCase(String str, char ch) {
if (isEmpty(str)) {
return null;
}
switch (ch) {
case CharConstant.MINUS:
return CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_CAMEL, str);
default:
return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, str);
}
}
public static String toSnakeCase(String str) {
if (isEmpty(str)) {
return null;
}
return toSnakeCase(str, CharConstant.UNDERLINE);
}
/**
* camel转换为snake
*
* @param str
* @return
*/
public static String toSnakeCase(String str, char ch) {
if (isEmpty(str)) {
return null;
}
switch (ch) {
case CharConstant.MINUS:
return CaseFormat.LOWER_HYPHEN.to(CaseFormat.LOWER_UNDERSCORE, str);
default:
return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, str);
}
}
public static void main(String[] args) {
String str = "test_jata";
System.out.println(toCamelCase(str));
System.out.println(toCamelCase("test-jdate", '-'));
String str2 = "testJdate";
System.out.println(toSnakeCase(str));
System.out.println(toSnakeCase("test-jdate", '-'));
}
}
package com.secoo.mall.common.util.thread;
import com.secoo.mall.common.constant.ThreadPoolConstant;
import com.secoo.mall.common.core.bean.DefaultThreadFactory;
import java.util.concurrent.*;
public interface ThreadPoolUtil {
static ScheduledExecutorService newScheduledExecutorService(String threadName) {
return new ScheduledThreadPoolExecutor(ThreadPoolConstant.CORE_POOL_SIZE, new DefaultThreadFactory(threadName));
}
static ExecutorService newFixedExecutorService(String threadName) {
return new ThreadPoolExecutor(ThreadPoolConstant.CORE_POOL_SIZE, ThreadPoolConstant.MAX_POOL_SIZE, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new DefaultThreadFactory(threadName));
}
static ExecutorService newSingleExecutorService(String threadName) {
return new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new DefaultThreadFactory(threadName));
}
static void shutdown(ExecutorService executorService) {
executorService.shutdownNow();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd"> -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<!-- <property name="LOG_HOME" value="./log" /> -->
<!--取得spring boot中的变量值有2种方式,一种是resource,另外一种是使用springProperty,使用springProperty好处能指定默认值-->
<!-- <property resource="application.properties"/>
-->
<springProperty scope="context" name="logLevel" source="log.level" defaultValue="info"/>
<springProperty scope="context" name="logName" source="spring.application.name" defaultValue="app"/>
<springProperty scope="context" name="logPath" source="log.path" defaultValue="./logs"/>
<property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{traceId}|%thread|%-5level|%logger{36}-%msg%n"/>
<!-- <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %X{requestId} %-5level %logger{36} - %msg%n"/>-->
<property name="CHARSET" value="UTF-8"/>
<jmxConfigurator/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}|%msgno|%thread|%-5level|%logger{20}-%msg%n</pattern> -->
<pattern>${PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level> <!-- 只记录error级别的日志 -->
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 定义文件的名称 -->
<file>${logPath}/${logName}/error.log
</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily -->
<!-- 设置达到指定大小限制后输出的日志名称 -->
<fileNamePattern>${logPath}/${logName}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="APP" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 定义文件的名称 -->
<file>${logPath}/${logName}/app.log
</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily -->
<!-- 设置达到指定大小限制后输出的日志名称 -->
<fileNamePattern>${logPath}/${logName}/app-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="ASYN_APP" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="APP"/>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
</appender>
<appender name="ASYN_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ERROR"/>
<queueSize>1024</queueSize>
<neverBlock>true</neverBlock>
</appender>
<logger name="app" level="${logLevel}">
<appender-ref ref="ASYN_APP"/>
</logger>
<logger name="error" level="${logLevel}">
<appender-ref ref="ASYN_ERROR"/>
</logger>
<!-- 业务日志输出-->
<logger name="com.secoo.mall" level="${logLevel}">
<appender-ref ref="ASYN_APP"/>
</logger>
<!--统一日志输出级别,其他appender中如果有高于此处等级设置的也会被输出 -->
<root level="${logLevel}">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
\ No newline at end of file
...@@ -5,11 +5,29 @@ ...@@ -5,11 +5,29 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-starter</artifactId> <artifactId>dubbo-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>swagger-dubbo</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
package com.secoo.mall.dubbo.annotation;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
public @interface DubboService {
@AliasFor(
annotation = Service.class
)
String value() default "";
}
...@@ -5,11 +5,21 @@ ...@@ -5,11 +5,21 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>elasticsearch-starter</artifactId> <artifactId>elasticsearch-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
...@@ -5,11 +5,21 @@ ...@@ -5,11 +5,21 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>mongodb-starter</artifactId> <artifactId>mongodb-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
...@@ -5,11 +5,30 @@ ...@@ -5,11 +5,30 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>mybatis-starter</artifactId> <artifactId>mybatis-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-util</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
package com.secoo.mall.mybatis.bean;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.secoo.mall.common.core.bean.Pageable;
import java.util.List;
public class DataPage<T> implements Pageable<T> {
private Page<T> page;
public DataPage(Page<T> page) {
this.page = page;
}
@Override
public List<T> getResultList() {
return page.getRecords();
}
@Override
public Long getTotalCount() {
return page.getTotal();
}
@Override
public Long getCurPage() {
return page.getCurrent();
}
@Override
public Long getPageSize() {
return page.getSize();
}
}
package com.secoo.mall.mybatis.config;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.baomidou.mybatisplus.extension.toolkit.PackageHelper;
import com.secoo.mall.mybatis.handler.FillDefaultValueHandler;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Configuration
public class MybatisConfig {
@Value("${spring.profiles.active}")
private String profile;
@Bean("mybatisSqlSession")
public SqlSessionFactory sqlSessionFactory(DataSource dataSource, GlobalConfig globalConfig) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
String[] aliasesPackages = PackageHelper.convertTypeAliasesPackage("com.secoo.mall.**.bean.domain");
List<String> list = Stream.of(aliasesPackages).collect(Collectors.toList());
/*文件包别名加载*/
sqlSessionFactory.setTypeAliasesPackage(StringUtils.join(list, ","));
/*配置文件*/
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/*.xml"));
/* 数据源 */
sqlSessionFactory.setDataSource(dataSource);
/* entity扫描,mybatis的Alias功能 */
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setJdbcTypeForNull(JdbcType.NULL);
/* 驼峰转下划线 */
configuration.setMapUnderscoreToCamelCase(true);
/* 分页插件 */
configuration.addInterceptor(new PaginationInterceptor());
/* 乐观锁插件 */
// configuration.addInterceptor(new OptimisticLockerInterceptor());
//非生产环境加载的插件
if (!profile.equals("prod")) {
configuration.addInterceptor(new PerformanceInterceptor());
}
sqlSessionFactory.setConfiguration(configuration);
/* 自动填充插件 */
globalConfig.setMetaObjectHandler(new FillDefaultValueHandler());
sqlSessionFactory.setGlobalConfig(globalConfig);
return sqlSessionFactory.getObject();
}
@Bean("globalConfig")
public GlobalConfig globalConfig() {
GlobalConfig conf = new GlobalConfig();
GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
dbConfig.setIdType(IdType.AUTO);
conf.setDbConfig(dbConfig);
return conf;
}
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
}
package com.secoo.mall.mybatis.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class FillDefaultValueHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Object createTime = this.getFieldValByName("createTime", metaObject);
if (createTime == null) {
this.setInsertFieldValByName("createTime", new Date(), metaObject);
}
}
@Override
public void updateFill(MetaObject metaObject) {
}
}
package com.secoo.mall.mybatis.util;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.secoo.mall.common.constant.PageConstant;
import com.secoo.mall.common.core.bean.ReqPage;
import com.secoo.mall.common.core.bean.Sort;
import com.secoo.mall.common.core.exception.ParameterException;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.mybatis.bean.DataPage;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public interface PageUtil {
static <T> Page<T> createPage(ReqPage reqPage) {
if (Objects.isNull(reqPage)) {
return new Page<T>(PageConstant.DEFAULT_CUR_PAGE, PageConstant.DEFAULT_PAGE_SIZE);
}
if (reqPage.getPageSize() <= 0) {
throw new ParameterException("页面大小为负");
}
if (reqPage.getCurPage() < 0) {
throw new ParameterException("页码为负");
}
return new Page<>(reqPage.getCurPage(), reqPage.getPageSize());
}
static <T> Page<T> createPage(ReqPage reqPage, Sort sort) {
Page<T> page = createPage(reqPage);
createSorts(page, sort);
return page;
}
static <T> DataPage<T> createDataPage(IPage<T> page) {
if (Objects.isNull(page)) {
throw new ParameterException("page对象不能为空");
}
return new DataPage<T>((Page<T>) page);
}
static void createSorts(Page page, Sort sort) {
if (Objects.isNull(page)) {
throw new ParameterException("page对象不能为空");
}
if (Objects.isNull(sort)) {
throw new ParameterException("sort对象不能为空");
}
if (StringUtils.isNotEmpty(sort.getSort())) {
List<String> ascList = new ArrayList<>();
List<String> descList = new ArrayList<>();
String[] sortPros = StringUtils.split(sort.getSort(), ",");
for (String sortPro : sortPros) {
String[] pro = StringUtils.split(sortPro, "_");
String orderType = pro[1];
String proValue = sort.getToSnake() ? StringUtil.toSnakeCase(pro[0]) : pro[0];
if ("asc".equals(orderType)) {
ascList.add(proValue);
} else {
descList.add(proValue);
}
}
if (!CollectionUtils.isEmpty(ascList)) {
page.setAscs(ascList);
}
if (!CollectionUtils.isEmpty(descList)) {
page.setDescs(descList);
}
}
}
}
...@@ -5,13 +5,12 @@ ...@@ -5,13 +5,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<artifactId>mall-parent</artifactId> <artifactId>mall-parent</artifactId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<modules> <modules>
......
...@@ -5,11 +5,21 @@ ...@@ -5,11 +5,21 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>redis-starter</artifactId> <artifactId>redis-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
...@@ -5,11 +5,21 @@ ...@@ -5,11 +5,21 @@
<parent> <parent>
<artifactId>mall-common</artifactId> <artifactId>mall-common</artifactId>
<groupId>com.secoo.mall</groupId> <groupId>com.secoo.mall</groupId>
<version>1.0.1</version> <version>1.0.2.1006-DEV-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>web-starter</artifactId> <artifactId>web-starter</artifactId>
<dependencies>
<dependency>
<groupId>com.secoo.mall</groupId>
<artifactId>common-util</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project> </project>
\ No newline at end of file
package com.secoo.mall.web.advice;
import com.secoo.mall.common.core.errorcode.CommonErrorCode;
import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.core.exception.ParameterException;
import com.secoo.mall.common.util.log.LoggerUtil;
import com.secoo.mall.common.util.response.ResponseUtil;
import com.secoo.mall.web.annotation.ApiController;
import com.secoo.mall.web.annotation.ApiIgnoreJson;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.core.MethodParameter;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import javax.annotation.Resource;
@RestControllerAdvice(annotations = ApiController.class)
public class ControllerResponseAdvice implements ResponseBodyAdvice<Object> {
@Resource
private MessageSource messageSource;
@ExceptionHandler(BusinessException.class)
public Object businessExcepstionHandler(BusinessException e) {
LoggerUtil.warn("businessException info:", e);
return ResponseUtil.getFailResponse(e.getCode(), getMsg(e));
}
@ExceptionHandler(ParameterException.class)
public Object parameterExceptionHandler(ParameterException e) {
return ResponseUtil.getFailResponse(e.getCode(), getMsg(e));
}
@ExceptionHandler(Exception.class)
public Object exceptionHandler(Exception e) {
LoggerUtil.error(e);
return ResponseUtil.getFailResponse(CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION.getCode(), CommonErrorCode.SYSTEM_INTERNAL_EXCEPTION.getMsg());
}
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return AnnotationUtils.findAnnotation(methodParameter.getMethod(), ApiIgnoreJson.class) == null;
}
@Override
public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
return ResponseUtil.getSuccessResponse(o);
}
private String getMsg(BusinessException e) {
return messageSource.getMessage(e.getMsg(), e.getArgs(), LocaleContextHolder.getLocale());
}
}
package com.secoo.mall.web.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RestController
@RequestMapping
public @interface ApiController {
@AliasFor(annotation = RequestMapping.class)
String name() default "";
@AliasFor(annotation = RequestMapping.class, attribute = "value")
String[] value() default {};
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
}
\ No newline at end of file
package com.secoo.mall.web.annotation;
public @interface ApiIgnoreJson {
}
package com.secoo.mall.web.annotation;
import com.secoo.mall.common.core.annotation.TrationalService;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Service;
import java.lang.annotation.*;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Service
@TrationalService
public @interface ApiService {
@AliasFor(
annotation = Service.class
)
String value() default "";
}
package com.secoo.mall.web.annotation;
import java.lang.annotation.*;
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ApiVersion {
String value() default "version";
boolean required() default false;
String defaultValue() default "1.0";
}
package com.secoo.mall.web.config;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.secoo.mall.web.annotation.ApiController;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
@Profile({"dev", "local", "test"})
public class SwaggerConfig {
@Value("${spring.application.name}")
private String appName;
@Value("${spring.application.version:1.0.1}")
private String appVersion;
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.groupName("SecooMall")
.select()
.apis(RequestHandlerSelectors.withClassAnnotation(ApiController.class))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title(appName + " RESTful APIs")
.version(appVersion)
.description("更多内容请关注:http://apims.siku.cn")
.build();
}
}
\ No newline at end of file
package com.secoo.mall.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import java.util.Locale;
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 自定义国际化文件存放路径
*
* @return
*/
/*@Bean
public org.springframework.validation.Validator getValidator() {
Validator validator = Validation.byDefaultProvider()
.configure()
.messageInterpolator(new ResourceBundleMessageInterpolator(new PlatformResourceBundleLocator("i18n/message")))
.buildValidatorFactory().getValidator();
return (org.springframework.validation.Validator) validator;
}*/
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("i18n/message");
return messageSource;
}
@Bean
public LocaleResolver localeHeaderResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(Locale.SIMPLIFIED_CHINESE);
return localeResolver;
}
@Bean
public LocaleResolver localeCookieResolver() {
CookieLocaleResolver localeResolver = new CookieLocaleResolver();
localeResolver.setCookieName("language");
//设置默认区域
localeResolver.setDefaultLocale(Locale.CANADA);
localeResolver.setCookieMaxAge(3600);//设置cookie有效期.
return localeResolver;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
// 参数名
lci.setParamName("lang");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
package com.secoo.mall.web.filter;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ApiVersionFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
System.out.println(httpServletRequest);
}
}
package com.secoo.mall.web.util;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class WebUtil {
public static String getParameter(String name) {
return getRequest().getParameter(name);
}
public static <T> T getAttribute(String name) {
return (T) getRequest().getAttribute(name);
}
public static String getHeader(String name) {
return getRequest().getHeader(name);
}
public static HttpServletRequest getRequest() {
return getRequestAttributes().getRequest();
}
public static HttpServletResponse getResponse() {
return getRequestAttributes().getResponse();
}
public static HttpSession getSession() {
return getRequest().getSession();
}
public static ServletRequestAttributes getRequestAttributes() {
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
return (ServletRequestAttributes) attributes;
}
public static <T> void setAttribute(String name,T obj) {
getRequest().setAttribute(name,obj);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment