diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c0418d --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ + +\.idea/ + +target/ + +\.DS_Store diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..29e76e5 --- /dev/null +++ b/pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + + com.irrigation + common-lib + 1.0-SNAPSHOT + + + UTF-8 + 1.8 + 2.7.0 + 1.16.20 + 1.11 + 20.0 + 1.7.24 + 1.2.46 + 4.3.14.RELEASE + 4.2.4.RELEASE + + + + + + org.slf4j + slf4j-api + ${slf4j.version} + provided + + + com.google.guava + guava + ${guava.vsersion} + provided + + + io.springfox + springfox-swagger2 + ${swagger.version} + provided + + + guava + com.google.guava + + + slf4j-api + org.slf4j + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + commons-codec + commons-codec + ${commons-codec.version} + provided + + + com.alibaba + fastjson + ${fastjson.version} + provided + + + + org.springframework + spring-web + ${spring-web.version} + provided + + + + org.springframework.security + spring-security-core + ${spring-security-core.version} + provided + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-source-plugin + 2.4 + + true + + + + deploy + + jar-no-fork + + + + + + + + + + nexus-releases + http://39.108.110.2:8081/repository/maven-releases/ + + + nexus-snapshot + http://39.108.110.2:8081/repository/maven-snapshots/ + + + \ No newline at end of file diff --git a/src/main/java/com/irrigation/icl/entity/PageList.java b/src/main/java/com/irrigation/icl/entity/PageList.java new file mode 100644 index 0000000..f741653 --- /dev/null +++ b/src/main/java/com/irrigation/icl/entity/PageList.java @@ -0,0 +1,26 @@ +package com.irrigation.icl.entity; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "分页返回类") +public class PageList { + + @ApiModelProperty(value = "总页数") + private int pages; + @ApiModelProperty(value = "总条数") + private long total; + @ApiModelProperty(value = "返回数据") + private List list; + + +} diff --git a/src/main/java/com/irrigation/icl/entity/PageParam.java b/src/main/java/com/irrigation/icl/entity/PageParam.java new file mode 100644 index 0000000..ca921ee --- /dev/null +++ b/src/main/java/com/irrigation/icl/entity/PageParam.java @@ -0,0 +1,19 @@ +package com.irrigation.icl.entity; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value = "分页参数类") +public class PageParam { + + @ApiModelProperty(value = "当前页") + private Integer page = 1; + @ApiModelProperty(value = "每页最大条目") + private Integer rows = 10; +} diff --git a/src/main/java/com/irrigation/icl/entity/RestResult.java b/src/main/java/com/irrigation/icl/entity/RestResult.java new file mode 100644 index 0000000..aff2c7c --- /dev/null +++ b/src/main/java/com/irrigation/icl/entity/RestResult.java @@ -0,0 +1,31 @@ +package com.irrigation.icl.entity; + + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.annotation.JsonValue; +import com.irrigation.icl.enums.ResultEnum; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "公共返回类") +public class RestResult { + @ApiModelProperty(value = "返回编码类型") + private int code; + @ApiModelProperty(value = "返回提示消息") + private String message; + @ApiModelProperty(value = "返回请求数据对象") + private T data; + + public String getMessage() { + return message != null?message: ResultEnum.getCode(code).getMessage(); + } + public String toString(){ + return JSON.toJSONString(this); + } +} diff --git a/src/main/java/com/irrigation/icl/enums/ResultEnum.java b/src/main/java/com/irrigation/icl/enums/ResultEnum.java new file mode 100644 index 0000000..8bfab7d --- /dev/null +++ b/src/main/java/com/irrigation/icl/enums/ResultEnum.java @@ -0,0 +1,51 @@ +package com.irrigation.icl.enums; + +import java.util.Arrays; +import java.util.Optional; + +public enum ResultEnum { + + SUCCESS(200, "success"), + SUCCESS_NO_DATA(202,"查询成功,无数据"), + ERROR(400, "failed"), + + PARAMETER_MISMATCH(402, "参数不匹配!"), + + INVALID_REQUEST(405, "请求错误!"), + + HTTP_SERVER_ERROR(500, "服务异常!"), + + DATA_ACCESS(501, "数据库异常!"), + + DATA_OPT(502, "数据库操作异常!"), + + REMOTE_CALL_FAILED(503,"远程调用失败"), + + SESSION_EXPIRE(401, "会话失效,请重新登录!"); + + private final int code; + private final String message; + + private ResultEnum(int code, String message) { + this.code = code; + this.message = message; + } + + + public int getCode() { + return this.code; + } + + public String getMessage() { + + return this.message; + } + + public static ResultEnum getCode(int code) { + ResultEnum[] codes = ResultEnum.values(); + Optional optional = Arrays + .stream(codes) + .filter(t -> t.code == code).findFirst(); + return optional.isPresent() ? optional.get() : ResultEnum.ERROR; + } +} diff --git a/src/main/java/com/irrigation/icl/exception/AbstractException.java b/src/main/java/com/irrigation/icl/exception/AbstractException.java new file mode 100644 index 0000000..50a07bb --- /dev/null +++ b/src/main/java/com/irrigation/icl/exception/AbstractException.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018. + * 项目名称:auth-gateway-backend + * 文件名称:AbstractException.java + * Date:18-3-21 上午10:15 + * Author:boni + */ + +package com.irrigation.icl.exception; + + + +import com.irrigation.icl.exception.code.ErrorCode; +import org.springframework.http.HttpStatus; + +import java.io.PrintWriter; +import java.io.StringWriter; + +public abstract class AbstractException extends RuntimeException { + private static final long serialVersionUID = 1L; + + private final HttpStatus status; + + private final int code; + + private final String message; + + private final String detailMessage; + + public AbstractException(HttpStatus status, ErrorCode errorCode) { + this.status = status; + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + this.detailMessage = errorCode.getDetailMessage(); + } + + public AbstractException(HttpStatus status) { + this.status = status; + code = 0; + message = null; + detailMessage = null; + } + + public AbstractException(HttpStatus status, ErrorCode errorCode, Throwable cause) { + super(cause); + this.status = status; + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + detailMessage = (cause.getMessage() != null ? cause.getMessage() : "") + toStackTrace(cause); + } + + private String toStackTrace(Throwable e) { + StringWriter errorStackTrace = new StringWriter(); + e.printStackTrace(new PrintWriter(errorStackTrace)); + return errorStackTrace.toString(); + + } + + public HttpStatus getStatus() { + return status; + } + + public ErrorCode getCode() { + return new ErrorCode(code, message, detailMessage); + } + + @Override + public String getMessage() { + return message; + } + + public String getDetailMessage() { + return detailMessage; + } +} diff --git a/src/main/java/com/irrigation/icl/exception/ContextRuntimeException.java b/src/main/java/com/irrigation/icl/exception/ContextRuntimeException.java new file mode 100644 index 0000000..9e70b52 --- /dev/null +++ b/src/main/java/com/irrigation/icl/exception/ContextRuntimeException.java @@ -0,0 +1,12 @@ +package com.irrigation.icl.exception; + +public class ContextRuntimeException extends RuntimeException { + + public ContextRuntimeException(String message) { + super(message); + } + + public ContextRuntimeException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/irrigation/icl/exception/RemoteException.java b/src/main/java/com/irrigation/icl/exception/RemoteException.java new file mode 100644 index 0000000..cd8f78a --- /dev/null +++ b/src/main/java/com/irrigation/icl/exception/RemoteException.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018. + * 项目名称:auth-gateway-backend + * 文件名称:RemoteException.java + * Date:18-3-21 上午10:15 + * Author:boni + */ + +package com.irrigation.icl.exception; + + + +import com.irrigation.icl.exception.code.ErrorCode; + +import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR; + +public class RemoteException extends AbstractException { + + public RemoteException() { + super(INTERNAL_SERVER_ERROR); + } + + public RemoteException(ErrorCode errorCode) { + super(INTERNAL_SERVER_ERROR, errorCode); + } + + public RemoteException(ErrorCode errorCode, Throwable cause) { + super(INTERNAL_SERVER_ERROR, errorCode, cause); + } +} diff --git a/src/main/java/com/irrigation/icl/exception/code/ErrorCode.java b/src/main/java/com/irrigation/icl/exception/code/ErrorCode.java new file mode 100644 index 0000000..0a83547 --- /dev/null +++ b/src/main/java/com/irrigation/icl/exception/code/ErrorCode.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018. + * 项目名称:auth-gateway-backend + * 文件名称:ErrorCode.java + * Date:18-3-21 上午10:15 + * Author:boni + */ + +package com.irrigation.icl.exception.code; + +public class ErrorCode { + + private final int code; + private final String message; + private final String detailMessage; + + public ErrorCode(int code, String message, String detailMessage) { + this.code = code; + this.message = message; + this.detailMessage = detailMessage; + } + + public ErrorCode(String message, String detailMessage) { + this.code = 0; + this.message = message; + this.detailMessage = detailMessage; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + public String getDetailMessage() { + return detailMessage; + } +} diff --git a/src/main/java/com/irrigation/icl/exception/code/ErrorCodes.java b/src/main/java/com/irrigation/icl/exception/code/ErrorCodes.java new file mode 100644 index 0000000..4073b31 --- /dev/null +++ b/src/main/java/com/irrigation/icl/exception/code/ErrorCodes.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018. + * 项目名称:auth-gateway-backend + * 文件名称:ErrorCodes.java + * Date:18-3-21 上午10:15 + * Author:boni + */ + +package com.irrigation.icl.exception.code; + + +public class ErrorCodes { + + private ErrorCodes(){} + public static final String CLIENT_ID_IS_NULL_STR = "CLIENT_ID_IS_NULL"; + public static final String CLIENT_SECRET_IS_NULL_STR = "CLIENT_SECRET_IS_NULL"; + + public static final String ORGANIZAITON_ID_IS_NULL_STR = "ORGANIZAITON_ID_IS_NULL"; + + /* 500 Internal Server Error */ + + public static final ErrorCode DEVICE_ID_IS_NULL_STR = new ErrorCode("DEVICE_ID_IS_NULL_STR", "设备 ID 非法"); + public static final ErrorCode NOT_LOGIN_YET = new ErrorCode("NOT_LOGIN_YET", "没有用户已登录当前设备"); + + public static final ErrorCode USER_SERVICE_CALL_FAILURE = new ErrorCode("USER_SERVICE_CALL_FAILURE", "无法调用远程用户系统,或调用失败"); + public static final ErrorCode ID_SERVICE_CALL_FAILURE = new ErrorCode("ID_SERVICE_CALL_FAILURE", "无法调用远程用ID_SERVICE,或调用失败"); + + public static final ErrorCode INVALID_AUTHENTICATION_ERROR = new ErrorCode("INVALID_AUTHENTICATION", "用户证书校验失败"); + +} diff --git a/src/main/java/com/irrigation/icl/exception/code/GenericErrorCodes.java b/src/main/java/com/irrigation/icl/exception/code/GenericErrorCodes.java new file mode 100644 index 0000000..a268055 --- /dev/null +++ b/src/main/java/com/irrigation/icl/exception/code/GenericErrorCodes.java @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2018. + * 项目名称:auth-gateway-backend + * 文件名称:GenericErrorCodes.java + * Date:18-3-21 上午10:15 + * Author:boni + */ + +package com.irrigation.icl.exception.code; + +public class GenericErrorCodes { + public static ErrorCode GENERIC_API_ERROR_CODE = + new ErrorCode(0001, "GENERIC_API_ERROR_CODE", "generic API error message"); + public static ErrorCode GENERIC_UNAUTHORIZED_ERROR_CODE = + new ErrorCode(0002, "GENERIC_UNAUTHORIZED_ERROR_CODE", "generic unauthorized error message"); + public static ErrorCode DATA_ACCESS_ERROR_CODE = + new ErrorCode(0003, "DATA_ACCESS_ERROR", "database access error"); +} diff --git a/src/main/java/com/irrigation/icl/utils/PasswordEncoderUtil.java b/src/main/java/com/irrigation/icl/utils/PasswordEncoderUtil.java new file mode 100644 index 0000000..8bd3600 --- /dev/null +++ b/src/main/java/com/irrigation/icl/utils/PasswordEncoderUtil.java @@ -0,0 +1,18 @@ +package com.irrigation.icl.utils; + +import org.springframework.security.authentication.encoding.BasePasswordEncoder; +import org.springframework.security.authentication.encoding.Md5PasswordEncoder; + +public class PasswordEncoderUtil { + + private final static BasePasswordEncoder encoder = new Md5PasswordEncoder(); + + public static String encodePassword(String password) { + return encoder.encodePassword(password, null); + } + + public static boolean isPasswordValid(String rawPassword, String encodedPassword) { + return encoder.isPasswordValid(encodedPassword, rawPassword, null); + } + +} diff --git a/src/main/java/com/irrigation/icl/utils/RestResultGeneratorUtil.java b/src/main/java/com/irrigation/icl/utils/RestResultGeneratorUtil.java new file mode 100644 index 0000000..1797e90 --- /dev/null +++ b/src/main/java/com/irrigation/icl/utils/RestResultGeneratorUtil.java @@ -0,0 +1,33 @@ +package com.irrigation.icl.utils; + + +import com.irrigation.icl.entity.RestResult; +import com.irrigation.icl.enums.ResultEnum; + +public class RestResultGeneratorUtil { + + public static RestResult getResult(int code, T data, String message) { + RestResult result = new RestResult<>(code, message, data); + return result; + } + + public static RestResult getSuccessResult(T data) { + return getResult(ResultEnum.SUCCESS.getCode(), data, ResultEnum.SUCCESS.getMessage()); + } + + public static RestResult getSuccessResult() { + return getResult(ResultEnum.SUCCESS.getCode(), null, ResultEnum.SUCCESS.getMessage()); + } + + public static RestResult getErrorResult(String message) { + return getResult(ResultEnum.ERROR.getCode(), null, message); + } + + public static RestResult getErrorResult(int code, String message) { + return getResult(code, null, message); + } + + public static RestResult getErrorResult(ResultEnum resultEnum) { + return getResult(resultEnum.getCode(), null, resultEnum.getMessage()); + } +} diff --git a/src/main/java/com/irrigation/icl/utils/SignUtil.java b/src/main/java/com/irrigation/icl/utils/SignUtil.java new file mode 100644 index 0000000..0ad813e --- /dev/null +++ b/src/main/java/com/irrigation/icl/utils/SignUtil.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2018. + * 项目名称:auth-gateway-backend + * 文件名称:SignUtil.java + * Date:18-3-23 下午3:34 + * Author:boni + */ + +package com.irrigation.icl.utils; + +import org.apache.commons.codec.digest.DigestUtils; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.Map; + +/** + * 签名方法 + */ +public class SignUtil { + /** + * 使用apiSecret对params进行签名,自动加入了当前日期 + * @param params + * @param apiSecret + * @return + */ + public static String sign(Map params, String apiSecret) { + String[] sortParams = params.keySet().toArray(new String[]{}); + Arrays.sort(sortParams); + StringBuilder stringBuilder = new StringBuilder(); + for (String key : sortParams) { + stringBuilder.append(key).append(params.get(key)); + } + String signRawData = apiSecret + ":" + getDate() + ":" + stringBuilder.toString(); + String signedValue = DigestUtils.md5Hex(signRawData); + return signedValue; + } + + private static String getDate() { + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + String sDateSuffix = dateFormat.format(date); + return sDateSuffix; + } +}