diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..eb03bcb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,36 @@
+catalina.base_IS_UNDEFINED/
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+*.db
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+logs
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
+
+### maven ###
+.mvn
+mvnw
diff --git a/README.md b/README.md
index e7a8caf..c4fcc0a 100644
--- a/README.md
+++ b/README.md
@@ -1,37 +1,9 @@
-# kongx
+初始化
-#### 介绍
-kong网关的可视化管理界面,更人性、更方便管理微服务的网关管理。
+##设置版本号
+mvn versions:set -DnewVersion=1.0.1
-#### 软件架构
-软件架构说明
-
-
-#### 安装教程
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 使用说明
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 参与贡献
-
-1. Fork 本仓库
-2. 新建 Feat_xxx 分支
-3. 提交代码
-4. 新建 Pull Request
-
-
-#### 码云特技
-
-1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
-3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
-4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
-5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
-6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
+##设置错误回滚
+mvn versions:revert
+##提交
+mvn versions:commit
\ No newline at end of file
diff --git a/docs/dashboard.png b/docs/dashboard.png
new file mode 100644
index 0000000..eb7e4d3
Binary files /dev/null and b/docs/dashboard.png differ
diff --git a/docs/plugin_add.png b/docs/plugin_add.png
new file mode 100644
index 0000000..9894c9d
Binary files /dev/null and b/docs/plugin_add.png differ
diff --git a/docs/route_add.png b/docs/route_add.png
new file mode 100644
index 0000000..cf429d8
Binary files /dev/null and b/docs/route_add.png differ
diff --git a/docs/route_plugin.png b/docs/route_plugin.png
new file mode 100644
index 0000000..76ca940
Binary files /dev/null and b/docs/route_plugin.png differ
diff --git a/docs/service_list.png b/docs/service_list.png
new file mode 100644
index 0000000..feb6f7f
Binary files /dev/null and b/docs/service_list.png differ
diff --git a/docs/service_route.png b/docs/service_route.png
new file mode 100644
index 0000000..0b8b60b
Binary files /dev/null and b/docs/service_route.png differ
diff --git a/docs/service_view.png b/docs/service_view.png
new file mode 100644
index 0000000..b6345e2
Binary files /dev/null and b/docs/service_view.png differ
diff --git a/docs/shell.png b/docs/shell.png
new file mode 100644
index 0000000..60826bc
Binary files /dev/null and b/docs/shell.png differ
diff --git a/docs/upsream_targets.png b/docs/upsream_targets.png
new file mode 100644
index 0000000..b910434
Binary files /dev/null and b/docs/upsream_targets.png differ
diff --git a/docs/upstream_healthcheck.png b/docs/upstream_healthcheck.png
new file mode 100644
index 0000000..cfd07c2
Binary files /dev/null and b/docs/upstream_healthcheck.png differ
diff --git a/docs/upstream_list.png b/docs/upstream_list.png
new file mode 100644
index 0000000..cf27f1d
Binary files /dev/null and b/docs/upstream_list.png differ
diff --git a/docs/upstream_view.png b/docs/upstream_view.png
new file mode 100644
index 0000000..2cc289c
Binary files /dev/null and b/docs/upstream_view.png differ
diff --git a/healthcheck.html b/healthcheck.html
new file mode 100644
index 0000000..e69de29
diff --git a/kongx-common/pom.xml b/kongx-common/pom.xml
new file mode 100644
index 0000000..9a39ca4
--- /dev/null
+++ b/kongx-common/pom.xml
@@ -0,0 +1,46 @@
+
+
+
+ kongx
+ com.kongx
+ 1.0.0
+
+ 4.0.0
+
+ kongx-common
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ com.auth0
+ java-jwt
+ 3.4.0
+
+
+ com.google.guava
+ guava
+
+
+ com.github.pagehelper
+ pagehelper-spring-boot-starter
+ 1.2.11
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ commons-codec
+ commons-codec
+
+
+
\ No newline at end of file
diff --git a/kongx-common/src/main/java/com/kongx/common/KongxBanner.java b/kongx-common/src/main/java/com/kongx/common/KongxBanner.java
new file mode 100644
index 0000000..edf425a
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/KongxBanner.java
@@ -0,0 +1,50 @@
+package com.kongx.common;
+
+import org.springframework.boot.Banner;
+import org.springframework.boot.SpringBootVersion;
+import org.springframework.boot.ansi.AnsiColor;
+import org.springframework.boot.ansi.AnsiOutput;
+import org.springframework.boot.ansi.AnsiStyle;
+import org.springframework.core.env.Environment;
+
+import java.io.PrintStream;
+
+public class KongxBanner implements Banner {
+ private static final String BANNER = " \\ \n" +
+ " | , __. , __ ___. _ .-\n" +
+ " | / .' \\ |' `. .' ` \\,' \n" +
+ " |-< | | | | | | /\\ \n" +
+ " / \\_ `._.' / | `---| / \\ \n" +
+ " \\___/ \n";
+
+ private static final String SPRING_BOOT = " :: Spring Boot :: ";
+
+ private static final int STRAP_LINE_SIZE = 42;
+
+ @Override
+ public void printBanner(Environment environment, Class> sourceClass, PrintStream printStream) {
+ this.print(" :: Support kong :: ", "(v1.2.1)", printStream);
+ printStream.println(BANNER);
+ String copyright = " :: Copyright@2020 :: ";
+ String version = SpringBootVersion.getVersion();
+ version = (version != null) ? " (v" + version + ")" : "";
+ this.print(copyright, "raoxiaoyan", printStream);
+ this.print(SPRING_BOOT, version, printStream);
+
+ printStream.println();
+ }
+
+ private void print(String title, String msg, PrintStream printStream) {
+ StringBuilder padding = new StringBuilder();
+ while (padding.length() < STRAP_LINE_SIZE - (msg.length() + title.length())) {
+ padding.append(" ");
+ }
+
+ printStream.println(
+ AnsiOutput.toString(
+ AnsiColor.GREEN, title, AnsiColor.DEFAULT,
+ padding.toString(), AnsiStyle.FAINT, msg
+ )
+ );
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/aop/LoginValidateInterceptor.java b/kongx-common/src/main/java/com/kongx/common/aop/LoginValidateInterceptor.java
new file mode 100644
index 0000000..0d737bb
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/aop/LoginValidateInterceptor.java
@@ -0,0 +1,72 @@
+package com.kongx.common.aop;
+
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.common.utils.JWTTokenUtils;
+import com.kongx.common.utils.Jackson2Helper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+public class LoginValidateInterceptor implements HandlerInterceptor {
+ static Logger log = LoggerFactory.getLogger(LoginValidateInterceptor.class);
+
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ log.info("LoginValidateInterceptor preHandle " + request.getRequestURL());
+ log.debug("start try fetch user info...");
+ Object dLoginUser = request.getSession().getAttribute("USER_INFO");
+ String token = request.getHeader("Authorization");
+ if (token == null || dLoginUser == null || !JWTTokenUtils.verify(token.replaceAll("Bearer ", ""))) {
+ // 未登录,转向登录页面!
+ JsonHeaderWrapper baseDTO = new JsonHeaderWrapper<>();
+ response.setContentType("text/html;charset=UTF-8");
+ baseDTO.setErrmsg("Token已失效或用户未登录!");
+ PrintWriter writer = response.getWriter();
+ Map data = new HashMap<>(2);
+ baseDTO.setData(data);
+ baseDTO.setStatus(401);
+ writer.print(Jackson2Helper.toJsonString(baseDTO));
+ return false;
+ }
+ HandlerMethod method = (HandlerMethod) handler;
+ Method method1 = method.getMethod();
+ Class[] classes = method1.getParameterTypes();
+ for (Class aClass : classes) {
+ aClass.getAnnotation(PreAuthorize.class);
+ }
+ PreAuthorize preAuthorize = method.getMethodAnnotation(PreAuthorize.class);
+ if (Optional.ofNullable(preAuthorize).isPresent()) {
+ String value = preAuthorize.value();
+ if ("".equals(value)) {
+ return true;
+ }
+ Object list = request.getSession().getAttribute("PERMISSIONS");
+ if (list != null) {
+ Set strings = (Set) list;
+ boolean authorize = strings.stream().filter((s) -> value.equalsIgnoreCase(s)).count() > 0;
+ if (!authorize) {
+ JsonHeaderWrapper baseDTO = new JsonHeaderWrapper<>();
+ response.setCharacterEncoding("utf-8");
+ response.setContentType("text/html; charset=utf-8");
+ PrintWriter writer = response.getWriter();
+ baseDTO.setErrmsg("拒绝访问");
+ baseDTO.setStatus(403);
+ writer.print(Jackson2Helper.toJsonString(baseDTO));
+ }
+ return authorize;
+ }
+ }
+ return true;
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/aop/PreAuthorize.java b/kongx-common/src/main/java/com/kongx/common/aop/PreAuthorize.java
new file mode 100644
index 0000000..409bd73
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/aop/PreAuthorize.java
@@ -0,0 +1,11 @@
+package com.kongx.common.aop;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Documented
+public @interface PreAuthorize {
+ String value();
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/aop/UserArgumentResolver.java b/kongx-common/src/main/java/com/kongx/common/aop/UserArgumentResolver.java
new file mode 100644
index 0000000..7204ed5
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/aop/UserArgumentResolver.java
@@ -0,0 +1,28 @@
+package com.kongx.common.aop;
+
+import com.kongx.common.core.entity.UserInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.MethodParameter;
+import org.springframework.web.bind.support.WebArgumentResolver;
+import org.springframework.web.context.request.NativeWebRequest;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class UserArgumentResolver implements WebArgumentResolver {
+ static Logger log = LoggerFactory.getLogger(UserArgumentResolver.class);
+
+ @Override
+ public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {
+ if (methodParameter.getParameterType().equals(UserInfo.class)) {
+ HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
+ UserInfo dLoginUser = (UserInfo) request.getSession().getAttribute("USER_INFO");
+ if (dLoginUser == null) {
+ dLoginUser = new UserInfo();
+ }
+ log.debug("LoginUser={}", dLoginUser);
+ return dLoginUser;
+ }
+ return UNRESOLVED;
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/cache/CacheResults.java b/kongx-common/src/main/java/com/kongx/common/cache/CacheResults.java
new file mode 100644
index 0000000..7d3c6ff
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/cache/CacheResults.java
@@ -0,0 +1,17 @@
+package com.kongx.common.cache;
+
+import lombok.Data;
+
+@Data
+public class CacheResults {
+ private String type;
+ private T data;
+
+ public CacheResults() {
+ }
+
+ public CacheResults(T data) {
+ this.data = data;
+ }
+
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/config/KongxConfig.java b/kongx-common/src/main/java/com/kongx/common/config/KongxConfig.java
new file mode 100644
index 0000000..9fd5b37
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/config/KongxConfig.java
@@ -0,0 +1,29 @@
+package com.kongx.common.config;
+
+import com.kongx.common.aop.LoginValidateInterceptor;
+import com.kongx.common.aop.UserArgumentResolver;
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter;
+
+import java.util.List;
+
+@Configurable
+public class KongxConfig implements WebMvcConfigurer {
+ @Value("${portal.exclude.paths:/index,/authorize/login.do,/inner/monitor/ping,/health/check,/authorize/getUserInfo.do,/authorize/logout.do," +
+ "/authorize/errorTimes.do,/index.html,/cdn/**,/css/**,/img/**,/js/**,/svg/**,/util/**,/favicon.ico}")
+ private String excludePaths;
+
+ @Override
+ public void addArgumentResolvers(List argumentResolvers) {
+ argumentResolvers.add(new ServletWebArgumentResolverAdapter(new UserArgumentResolver()));
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(new LoginValidateInterceptor()).excludePathPatterns(excludePaths.split(","));
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/core/entity/BaseEntity.java b/kongx-common/src/main/java/com/kongx/common/core/entity/BaseEntity.java
new file mode 100644
index 0000000..ce911e7
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/core/entity/BaseEntity.java
@@ -0,0 +1,15 @@
+package com.kongx.common.core.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BaseEntity extends PaginationQC {
+ private int id;//主键
+ private Date create_at = new Date(); //创建时间
+ private String creator;//创建人
+ private Date modify_at = new Date();//修改时间
+ private String modifier;//修改人
+ protected String remark;
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/core/entity/PaginationQC.java b/kongx-common/src/main/java/com/kongx/common/core/entity/PaginationQC.java
new file mode 100644
index 0000000..75a5ad1
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/core/entity/PaginationQC.java
@@ -0,0 +1,54 @@
+package com.kongx.common.core.entity;
+
+import java.io.Serializable;
+
+@SuppressWarnings("serial")
+public class PaginationQC implements Serializable {
+
+ @Override
+ public String toString() {
+ return "PaginationQC [page=" + page + ", start=" + start + ", limit=" + limit + "]";
+ }
+
+ public Integer getPage() {
+ return page;
+ }
+
+ public void setPage(Integer page) {
+ this.page = page;
+ }
+
+ public Integer getStart() {
+ return start;
+ }
+
+ public void setStart(Integer start) {
+ if (start <= 0) {
+ start = 0;
+ }
+ this.start = start;
+ }
+
+ public Integer getLimit() {
+ return limit;
+ }
+
+ public void setLimit(Integer limit) {
+ this.limit = limit;
+ }
+
+ public String getSort() {
+ return sort;
+ }
+
+ public void setSort(String sort) {
+ this.sort = sort;
+ }
+
+
+ private Integer page = 0;
+ private Integer start = 0;
+ private Integer limit = 10;
+ private String sort;
+
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/core/entity/PaginationSupport.java b/kongx-common/src/main/java/com/kongx/common/core/entity/PaginationSupport.java
new file mode 100644
index 0000000..3ee99d1
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/core/entity/PaginationSupport.java
@@ -0,0 +1,165 @@
+package com.kongx.common.core.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import java.util.List;
+
+/**
+ * 用于HTML 与 Action的参数传递,Action与BO的传递
+ * 1. HTML指定: 显示的页号(startIndex)、每页的记录数(pageSize)
+ * 2. BO 指定 总记录数(totalCount)
+ * 重新计算:currPageNo 从1开始
+ * 填写一页的业务数据列表 List items
+ *
+ * @param
+ */
+
+@SuppressWarnings("serial")
+public class PaginationSupport implements java.io.Serializable {
+
+
+ public final static int PAGESIZE = 25;
+
+ private int pageSize = PAGESIZE;
+
+ private List items;
+
+ private int totalCount;
+
+ /**
+ * 重0开始,代表记录序号
+ */
+ private int startIndex = 0;
+
+
+ /**
+ * buli
+ * 总页数 , 每次计算
+ */
+ public PaginationSupport() {
+ }
+
+ public PaginationSupport(List items, int totalCount) {
+ setPageSize(PAGESIZE);
+ setTotalCount(totalCount);
+ setItems(items);
+ setStartIndex(0);
+ }
+
+ public PaginationSupport(List items, int totalCount, int startIndex) {
+ setPageSize(PAGESIZE);
+ setTotalCount(totalCount);
+ setItems(items);
+ setStartIndex(startIndex);
+ }
+
+ public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) {
+ setPageSize(pageSize);
+ setTotalCount(totalCount);
+ setItems(items);
+ setStartIndex(startIndex);
+ }
+
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List items) {
+ this.items = items;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public int getTotalCount() {
+ return totalCount;
+ }
+
+ public void setTotalCount(int totalCount) {
+ this.totalCount = totalCount;
+ computeStartIndex();
+ }
+
+ public int getStartIndex() {
+ return startIndex;
+ }
+
+
+ /**
+ * HTML提交,不能马上计算, 又了真正的 totalCount后,才能计算computeStartIndex()
+ *
+ * @param startIndex
+ */
+ public void setStartIndex(int startIndex) {
+ this.startIndex = startIndex;
+ }
+
+
+ /**
+ * BO放入 totalCount后,要重新计算 当前页号
+ * startIndex是从0开始的
+ */
+ public int computeStartIndex() {
+ if (totalCount <= 0) {
+ this.startIndex = 0;
+ }else if (startIndex >= totalCount) {
+ this.startIndex = (getTotalPages() - 1) * pageSize;
+ }else if (startIndex < 0) {
+ this.startIndex = 0;
+ }else {
+
+ }
+ return startIndex;
+ }
+
+
+ /**
+ * 取出当前页号,从1开始
+ *
+ * @return
+ */
+ public int getCurrPageNo() {
+ return getStartIndex() / pageSize + 1;
+ }
+
+ /**
+ * 取出总页数,从1开始
+ *
+ * @return
+ */
+ public int getTotalPages() {
+ int totalPages = getTotalCount() / pageSize;
+ if (getTotalCount() % pageSize > 0) {
+ totalPages++;
+ }
+ if (totalPages <= 0) {
+ totalPages = 1;
+ }
+ return totalPages;
+ }
+
+ @JsonIgnore
+ public int getNextIndex() {
+ int nextIndex = getStartIndex() + pageSize;
+ if (nextIndex >= totalCount) {
+ return getStartIndex();
+ } else {
+ return nextIndex;
+ }
+ }
+
+ @JsonIgnore
+ public int getPreviousIndex() {
+ int previousIndex = getStartIndex() - pageSize;
+ if (previousIndex < 0) {
+ return 0;
+ } else {
+ return previousIndex;
+ }
+ }
+}
\ No newline at end of file
diff --git a/kongx-common/src/main/java/com/kongx/common/core/entity/UserInfo.java b/kongx-common/src/main/java/com/kongx/common/core/entity/UserInfo.java
new file mode 100644
index 0000000..edcb9e4
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/core/entity/UserInfo.java
@@ -0,0 +1,35 @@
+package com.kongx.common.core.entity;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class UserInfo extends BaseEntity {
+
+ public static final String SUPER_ADMIN = "super_admin";
+
+ public static final String DOMESTIC_CONSUMER = "domestic_consumer";
+
+ public static final String MENUS = "menus";
+
+ public static final String PERMISSIONS = "permission";
+
+ private String userId;//用户Id
+
+ private String name;//用户名
+
+ private String email;//邮箱
+
+ private String password;//密码
+
+ private String mobile;//手机号
+
+ private String roleName = DOMESTIC_CONSUMER;//角色
+
+ private String status = "activate";
+
+ private String creator;
+
+ private Date create_at = new Date();
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/exception/ExceptionGlobalHandler.java b/kongx-common/src/main/java/com/kongx/common/exception/ExceptionGlobalHandler.java
new file mode 100644
index 0000000..c5c6d04
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/exception/ExceptionGlobalHandler.java
@@ -0,0 +1,23 @@
+package com.kongx.common.exception;
+
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import feign.FeignException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@ControllerAdvice(basePackages = "com.kongx.kong")
+@Slf4j
+public class ExceptionGlobalHandler {
+ @ResponseBody
+ @ExceptionHandler(value = FeignException.class)
+ public JsonHeaderWrapper errorHandler(FeignException ex) {
+ FeignException exception = (FeignException) ex.getCause();
+ JsonHeaderWrapper jsonWrapper = new JsonHeaderWrapper<>();
+ jsonWrapper.setStatus(ex.status());
+ jsonWrapper.setErrmsg(ex.getMessage());
+ log.info("Error msg{}", ex.getMessage());
+ return jsonWrapper;
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/handler/JSONHandler.java b/kongx-common/src/main/java/com/kongx/common/handler/JSONHandler.java
new file mode 100644
index 0000000..dd3c9ee
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/handler/JSONHandler.java
@@ -0,0 +1,107 @@
+package com.kongx.common.handler;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class JSONHandler extends BaseTypeHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(JSONHandler.class);
+
+ private static final ObjectMapper mapper = new ObjectMapper();
+
+ private Class clazz;
+
+ static {
+ mapper.configure(JsonParser.Feature.ALLOW_MISSING_VALUES, false);
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ public JSONHandler(Class clazz) {
+ if (clazz == null) {
+ throw new NullPointerException("Type argument cannot be null");
+ }
+ this.clazz = clazz;
+ }
+
+ /**
+ * object转json string
+ *
+ * @param object
+ * @return
+ */
+ private String toJSON(T object) {
+ try {
+ String string = mapper.writeValueAsString(object);
+ LOGGER.info(">>>> json execute string:{} <<<<", string);
+ return string;
+ } catch (Exception e) {
+ LOGGER.error(">>>> covert object to json string failed, error message: <<<<", e.getMessage());
+ }
+ return null;
+ }
+
+ /**
+ * json转object
+ *
+ * @param json
+ * @param clazz
+ * @return
+ * @throws IOException
+ */
+ private T toObject(String json, Class clazz) throws IOException {
+ if (json != null && json != "") {
+ return mapper.readValue(json, clazz);
+ }
+ return null;
+ }
+
+ @Override
+ public void setNonNullParameter(PreparedStatement preparedStatement, int i, T t, JdbcType jdbcType) throws SQLException {
+ try {
+ preparedStatement.setString(i, toJSON(t));
+ } catch (Exception e) {
+ LOGGER.error(">>>> preparedStatement set string failed, error message:{} <<<<", e.getMessage());
+ }
+ }
+
+ @Override
+ public T getNullableResult(ResultSet resultSet, String s) throws SQLException {
+ try {
+ return toObject(resultSet.getString(s), clazz);
+ } catch (IOException e) {
+ LOGGER.error(">>>> convert json string to object failed, error message:{} <<<<", e.getMessage());
+ }
+ return null;
+ }
+
+ @Override
+ public T getNullableResult(ResultSet resultSet, int i) throws SQLException {
+ try {
+ return toObject(resultSet.getString(i), clazz);
+ } catch (IOException e) {
+ LOGGER.error(">>>> convert json string to object failed, error message:{} <<<<", e.getMessage());
+ }
+ return null;
+ }
+
+ @Override
+ public T getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
+ try {
+ return toObject(callableStatement.getString(i), clazz);
+ } catch (IOException e) {
+ LOGGER.error(">>>> convert json string to object failed, error message:{} <<<<", e.getMessage());
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/kongx-common/src/main/java/com/kongx/common/jsonwrapper/JsonHeaderWrapper.java b/kongx-common/src/main/java/com/kongx/common/jsonwrapper/JsonHeaderWrapper.java
new file mode 100644
index 0000000..1f86344
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/jsonwrapper/JsonHeaderWrapper.java
@@ -0,0 +1,220 @@
+package com.kongx.common.jsonwrapper;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+import java.util.UUID;
+
+/**
+ * 所有数据传输对象的父类 Created by liuyang on 2015/3/10.
+ */
+public class JsonHeaderWrapper {
+
+
+ /**
+ * 当前数据结构的版本号, 版本升级意味着json数据结构变化
+ */
+ private String version = "1.0";
+ /**
+ * 客户标识. 要求接口传入, 原值返回
+ */
+ private String clientFrom;
+
+ /**
+ * 服务器返回json时的时间戳
+ */
+ private String timestamp;
+ /**
+ * 可选, http get请求的原始URL, post请求可不填写, 用于跟踪调试
+ */
+ private String url;
+ /**
+ * 0:全部成功, 202:部分成功, 405:接口超时返回,406客户流量超量, 500:全部失败, 505:传入参数错误(如:不存在的参数名称)
+ */
+ private int status;
+ /**
+ * 可选, 错误信息, 当status不为0的时候必填
+ */
+ private String errmsg;
+ /**
+ * 可选, 接口接到请求到返回数据花销的毫秒数, 建议填写
+ */
+ private long elapsed;
+
+ /**
+ * 必填, 用于表示本次会话的唯一ID
+ */
+ private String trackId;
+ /**
+ * 可选, 安全限制 [内网(1),内网认证(2),公网(3),公网认证(4),IP限制(5)], 建议填写, 该值可能会在反向代理等节点做安全处理
+ */
+ @JsonIgnore
+ private int securType;
+ /**
+ * 业务数据
+ */
+ private T data;
+
+ /*
+ */
+ public JsonHeaderWrapper() {
+ clientFrom = "";
+ url = "";
+ status = StatusEnum.Success.getCode();
+ errmsg = "";
+ elapsed = 0;
+ trackId = UUID.randomUUID().toString();
+ securType = SecurTypeEnum.UnknownOther.getCode();
+ data = null;
+ }
+
+
+ public String getVersion() {
+ return version;
+ }
+
+ public String getClientFrom() {
+ return clientFrom;
+ }
+
+ public void setClientFrom(String clientFrom) {
+ this.clientFrom = clientFrom;
+ }
+
+ public String getTimestamp() {
+ return timestamp;
+ }
+
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ public String getErrmsg() {
+ return errmsg;
+ }
+
+ public void setErrmsg(String errmsg) {
+ this.errmsg = errmsg;
+ }
+
+ public long getElapsed() {
+ return elapsed;
+ }
+
+
+ /*
+ * public void setAcc_point(String acc_point) { this.acc_point = acc_point;
+ * }
+ */
+ public String getTrackId() {
+ return trackId;
+ }
+
+ public void setTrackId(String trackId) {
+ this.trackId = trackId;
+ }
+
+ public int getSecurType() {
+ return securType;
+ }
+
+ public void setSecurType(int securType) {
+ this.securType = securType;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ public enum SecurTypeEnum {
+ /**
+ * 安全限制 [内网(1),内网认证(2),公网(3),公网认证(4),IP限制(5)], 建议填写, 该值可能会在反向代理等节点做安全处理
+ */
+
+ InnerAcc(1, "内网"), InnerAuthAcc(2, "内网认证"), PublicAcc(3, "公网"), PublicAuthAcc(4, "公网认证"), IPAuthAcc(5, "IP限制"), UnknownOther(599, "未知类型");
+
+ private int code;
+ private String desc;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCodee(int code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ SecurTypeEnum(int code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ }
+
+ /**
+ * 状态枚举类
+ */
+ public enum StatusEnum {
+
+ Success(0, "全部成功"), //
+ Success4M(200, "全部成功"),
+ //无线端统一使用200作为成功代码返回
+ PartialSuccess(202, "库存数不足"), //
+ Timeout(405, "接口超时返回"), //
+ OverFlowCtrl(406, "客户流量超量"), //
+ Failed(500, "全部失败"), //
+ ParamError(505, "传入参数错误"), //
+ UnknownOther(599, "未知错误,系统错误");
+
+ private int code;
+ private String desc;
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int value) {
+ this.code = value;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ StatusEnum(int code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ }
+
+
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/utils/BaseUtils.java b/kongx-common/src/main/java/com/kongx/common/utils/BaseUtils.java
new file mode 100644
index 0000000..bdaf7a6
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/utils/BaseUtils.java
@@ -0,0 +1,52 @@
+package com.kongx.common.utils;
+
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
+
+public class BaseUtils {
+ private static String base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+ public static String atob(String inStr) {
+ if (inStr == null) return null;
+ inStr = inStr.replaceAll("\\s|=", "");
+ StringBuilder result = new StringBuilder();
+
+ int cur;
+ int prev = -1;
+ int mod;
+ int i = 0;
+ while (i < inStr.length()) {
+ cur = base64hash.indexOf(inStr.charAt(i));
+ mod = i % 4;
+ switch (mod) {
+ case 0:
+ break;
+ case 1:
+ result.append(String.valueOf((char) (prev << 2 | cur >> 4)));
+ break;
+ case 2:
+ result.append(String.valueOf((char) ((prev & 0x0f) << 4 | cur >> 2)));
+ break;
+ case 3:
+ result.append(String.valueOf((char) ((prev & 3) << 6 | cur)));
+ break;
+ }
+ prev = cur;
+ i++;
+ }
+ return result.toString();
+ }
+
+
+ public static String sha1(String psw) {
+ if (StringUtils.isEmpty(psw)) {
+ return null;
+ } else {
+ return DigestUtils.sha1Hex(psw);
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println(sha1("UmFveHkyMDE4"));
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/utils/DateUtils.java b/kongx-common/src/main/java/com/kongx/common/utils/DateUtils.java
new file mode 100644
index 0000000..a61111e
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/utils/DateUtils.java
@@ -0,0 +1,106 @@
+package com.kongx.common.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * 描述:公共日期工具类
+ */
+public class DateUtils {
+
+ private static Logger logger = LoggerFactory.getLogger(DateUtils.class);
+
+
+ public static final String DATE_FORMAT = "yyyy-MM-dd";
+
+ public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+
+ public static final String DATE_FORMAT_CHINESE = "yyyy年M月d日";
+
+ public static final String FORMAT_HH_MM = "HH:mm";
+
+
+ public static long dateDiffMinute(Date start, Date end) {
+ long diff = end.getTime() - start.getTime();
+ return diff / 60 / 1000;
+ }
+
+ /**
+ * 将字符串日期转换为日期格式 自定義格式
+ *
+ * @param datestr
+ * @return
+ */
+ public static Date stringToDate(String datestr, String dateformat) {
+ Date date = new Date();
+ SimpleDateFormat df = new SimpleDateFormat(dateformat);
+ try {
+ date = df.parse(datestr);
+ } catch (ParseException e) {
+ logger.error(e.getMessage(), e);
+ }
+ return date;
+ }
+
+ /**
+ * 将日期格式日期转换为字符串格式 自定義格式
+ *
+ * @param date
+ * @param dateformat
+ * @return
+ */
+ public static String dateToString(Date date, String dateformat) {
+ if (date == null) {
+ return "";
+ }
+ String datestr = null;
+ SimpleDateFormat df = new SimpleDateFormat(dateformat);
+ datestr = df.format(date);
+ return datestr;
+ }
+
+ /**
+ * 日期转换
+ *
+ * @param effectDateStr
+ * @param pattern
+ * @return
+ * @throws ParseException
+ */
+ public static Date parseDate(String effectDateStr, String pattern) throws ParseException {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
+ Date effectDate = simpleDateFormat.parse(effectDateStr);
+ return effectDate;
+ }
+
+
+ public static String getDateDiff(Date endDate, Date nowDate) {
+ long nd = 1000 * 24 * 60 * 60;
+ long nh = 1000 * 60 * 60;
+ long nm = 1000 * 60;
+ // 获得两个时间的毫秒时间差异
+ long diff = endDate.getTime() - nowDate.getTime();
+ // 计算差多少天
+ long day = diff / nd;
+ // 计算差多少小时
+ long hour = diff % nd / nh;
+ // 计算差多少分钟
+ long min = diff % nd % nh / nm;
+ StringBuilder result = new StringBuilder();
+ if (day > 0) {
+ result.append(day + "天");
+ }
+ if (hour > 0) {
+ result.append(hour + "小时");
+ }
+ if (min > 0) {
+ result.append(min + "分钟");
+ }
+ return result.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/kongx-common/src/main/java/com/kongx/common/utils/JWTTokenUtils.java b/kongx-common/src/main/java/com/kongx/common/utils/JWTTokenUtils.java
new file mode 100644
index 0000000..d188c14
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/utils/JWTTokenUtils.java
@@ -0,0 +1,36 @@
+package com.kongx.common.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTVerifier;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.exceptions.JWTVerificationException;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.kongx.common.core.entity.UserInfo;
+
+public abstract class JWTTokenUtils {
+ private final static String SECRET = "kongx";
+
+ public static String getToken(UserInfo user) {
+ String token = "";
+ token = JWT.create().withAudience(Jackson2Helper.toJsonString(user))
+ .sign(Algorithm.HMAC256(SECRET));
+ return token;
+ }
+
+ public static UserInfo decode(String token) {
+ String user = JWT.decode(token).getAudience().get(0);
+ return Jackson2Helper.parsonObject(user, new TypeReference() {
+ });
+ }
+
+ public static boolean verify(String token) {
+ JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
+ try {
+ DecodedJWT decodedJWT = jwtVerifier.verify(token);
+ } catch (JWTVerificationException e) {
+ return false;
+ }
+ return true;
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/utils/Jackson2Helper.java b/kongx-common/src/main/java/com/kongx/common/utils/Jackson2Helper.java
new file mode 100644
index 0000000..8d80389
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/utils/Jackson2Helper.java
@@ -0,0 +1,81 @@
+package com.kongx.common.utils;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.util.List;
+
+public class Jackson2Helper {
+ private static final ObjectMapper MAPPER = new ObjectMapper();
+ private static Logger log = LoggerFactory.getLogger(Jackson2Helper.class);
+
+ public static final String toJsonString(Object obj) {
+ if (null == obj) {
+ return null;
+ }
+ try {
+ // Writer strWriter = new StringWriter();
+ // mapper.writeValue(strWriter, obj);
+ // return strWriter.toString();
+ return MAPPER.writeValueAsString(obj);
+ } catch (Exception e) {
+ log.error("", e);
+ }
+ return null;
+ }
+
+ /**
+ * 支持泛型
+ *
+ * @param jsonString
+ * @param valueTypeRef
+ * @return T
+ * @Author 杨健/YangJian
+ * @Date 2015年3月30日 下午12:35:45
+ * @Version 1.0.0
+ */
+ public static final T parsonObject(String jsonString, TypeReference valueTypeRef) {
+ try {
+
+ // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性
+ MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ return MAPPER.readValue(jsonString, valueTypeRef);
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("parsonObject error ", e);
+ }
+ return null;
+ }
+
+ public static JsonNode readJson(String json) {
+ try {
+ return MAPPER.readTree(json);
+ } catch (Exception e) {
+ log.error("readJson error ", e);
+ }
+ return null;
+ }
+
+ public static List jsonToList(String json, Class bean) {
+ JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, bean);
+ try {
+ return MAPPER.readValue(json, javaType);
+ } catch (IOException e) {
+ log.error("jsonToList error ", e);
+ }
+ return null;
+ }
+
+ public static void main(String[] args) {
+ String vlaues = "[\"betadeva\",\"betadevb\",\"betaa\",\"betab\",\"betac\",\"betad\",\"betae\",\"betad\",\"betap\",\"betai\",\"betat\",\"prod\"]";
+ List values = Jackson2Helper.parsonObject(vlaues, new TypeReference>() {
+ });
+ System.out.println(Jackson2Helper.toJsonString(values));
+ }
+}
diff --git a/kongx-common/src/main/java/com/kongx/common/utils/WebUtil.java b/kongx-common/src/main/java/com/kongx/common/utils/WebUtil.java
new file mode 100644
index 0000000..a54856e
--- /dev/null
+++ b/kongx-common/src/main/java/com/kongx/common/utils/WebUtil.java
@@ -0,0 +1,208 @@
+package com.kongx.common.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Enumeration;
+
+/**
+ * WebUtil 负责Cookie/Session等的管理。通常,所有对Cookie/Session的操作都通过此类来完成。
+ *
+ * @author shubing.wang
+ * @date 2014-01-07
+ * @version 1.0
+ */
+public class WebUtil {
+ /**
+ * 根据名字从Session中获取一个对象
+ *
+ * @param request
+ * HttpServletRequest对象
+ * @param name
+ * Session中对象的名字
+ * @return Object
+ */
+ @SuppressWarnings("unchecked")
+ public static T getObject(HttpServletRequest request, String name) {
+ return (T) request.getSession().getAttribute(name);
+ }
+
+ /**
+ * 根据给定的name将一个对象保存到Session中
+ *
+ * @param request
+ * HttpServletRequest对象
+ * @param name
+ * Session中对象的名字
+ * @param object
+ * 需要保存到Session的对象
+ */
+ public static void putObject(HttpServletRequest request, String name, T object) {
+ request.getSession().setAttribute(name, object);
+ }
+
+ /**
+ * 将Session置为无效状态,通常在注销时调用
+ *
+ * @param request
+ * HttpServletRequest
+ */
+ public static void invalidateSession(HttpServletRequest request) {
+ request.getSession().invalidate();
+ }
+
+ /**
+ * 获取URI的路径,如路径为http://www.example.com/example/user.do?method=add, 得到的值为"/example/user.do"
+ *
+ * @param request
+ * @return String
+ */
+ public static String getRequestURI(HttpServletRequest request) {
+ return request.getRequestURI();
+ }
+
+ /**
+ * 获取不包含应用名字的URI的路径, 并去掉最前面的"/",
+ * 如路径为http://r.daling.com:8080/appName/user/list.do, 得到的值为"user/list.do",其中appNames为应用的名字
+ *
+ * @param request
+ * @return String
+ */
+ public static String getNoAppNamedRequestURI(HttpServletRequest request) {
+ String contextPath = request.getContextPath();
+ String uri = request.getRequestURI();
+ if (uri.indexOf(contextPath) >= 0) {
+ uri = uri.substring(contextPath.length());
+ }
+ while (uri.startsWith("/")) {
+ uri = uri.substring(1);
+ }
+ uri = uri.replaceAll("/+", "/");
+ return uri;
+ }
+
+ public static String getHttpHeaderInfo(HttpServletRequest request) {
+ Enumeration names = request.getHeaderNames();
+ StringBuilder buf =new StringBuilder(0);
+
+
+ while (names.hasMoreElements()) {
+ String name = (String)names.nextElement();
+ buf.append(name+": "+request.getHeader(name)+" \n");
+ }
+
+ return buf.toString();
+ }
+
+
+ /**
+ * 获取应用的根目录
+ *
+ * @param request
+ * @return
+ */
+ public static String getContextPath(HttpServletRequest request) {
+ String contextPath = request.getContextPath();
+ if ("/".equals(contextPath)) {
+ return "";
+ }
+ return contextPath;
+ }
+
+ /**
+ * 获取完整请求路径(含内容路径及请求参数)
+ *
+ * @param request
+ * @return
+ */
+ public static String getRequestURIWithParam(HttpServletRequest request) {
+ return getRequestURI(request) + (request.getQueryString() == null ? "" : "?" + request.getQueryString());
+ }
+
+ /**
+ * 添加cookie
+ *
+ * @param response
+ * @param name
+ * cookie的名称
+ * @param value
+ * cookie的值
+ * @param maxAge
+ * cookie存放的时间(以秒为单位,假如存放三天,即3*24*60*60; 如果值为0,cookie将随浏览器关闭而清除)
+ */
+ public static void addCookie(HttpServletResponse response, String name, String value, int maxAge) {
+ Cookie cookie = new Cookie(name, value);
+ cookie.setPath("/");
+ if (maxAge > 0) {
+ cookie.setMaxAge(maxAge);
+ }
+ response.addCookie(cookie);
+ }
+
+ public static void addCookie(HttpServletResponse response, String name, String value, int maxAge, String domain) {
+ Cookie cookie = new Cookie(name, value);
+ cookie.setPath("/");
+ if (maxAge > 0) {
+ cookie.setMaxAge(maxAge);
+ }
+ cookie.setDomain(domain);
+ response.addCookie(cookie);
+ }
+
+ /**
+ * 获取cookie的值
+ *
+ * @param request
+ * @param name
+ * cookie的名称
+ * @return
+ */
+ public static String getCookieByName(HttpServletRequest request, String name) {
+ Cookie[] cookies = request.getCookies();
+ if (null != cookies) {
+ for (int i = 0; i < cookies.length; i++) {
+ if (cookies[i].getName().equals(name)) {
+ return cookies[i].getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ public static String getOSName(){
+ String os ="Windows";
+ if (System.getProperty("os.name").indexOf("Linux")!=-1 ) {
+ os = "Linux";
+ } else if (System.getProperty("os.name").indexOf("Windows")!=-1 ) {
+ os ="Windows";
+ }
+ return os;
+ }
+
+ public static void main(String[] s){
+ String os = WebUtil.getOSName();
+ System.out.println(os);
+ }
+
+ private static String[] getVisitorIp(HttpServletRequest request) {
+ if (request == null) {
+ return new String[]{"127.0.0.1"};
+ }
+ String ip = request.getHeader("X-Real-IP");
+ if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("X-Forwarded-For");
+ }
+ if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getRemoteAddr();
+ }
+ return ip.split("\\s,\\s");
+ }
+
+ public static String getClientIp(HttpServletRequest request) {
+ String[] ips = getVisitorIp(request);
+ return (ips == null || ips.length == 0) ? "127.0.0.1" : ips[0];
+ }
+}
diff --git a/kongx-serve/pom.xml b/kongx-serve/pom.xml
new file mode 100644
index 0000000..053065e
--- /dev/null
+++ b/kongx-serve/pom.xml
@@ -0,0 +1,127 @@
+
+
+
+ kongx
+ com.kongx
+ 1.0.0
+
+ 4.0.0
+
+ kongx-serve
+
+
+ com.kongx
+ kongx-common
+ 1.0.0
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter
+
+
+ org.bouncycastle
+ bcpkix-jdk15on
+
+
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+
+
+
+ commons-configuration
+ commons-configuration
+ 1.8
+
+
+ commons-logging
+ commons-logging
+
+
+
+
+ org.springframework.boot
+ spring-boot-actuator
+
+
+ org.springframework
+ spring-web
+ 5.0.11.RELEASE
+ compile
+
+
+ com.alibaba
+ fastjson
+ 1.2.70
+
+
+ mysql
+ mysql-connector-java
+ 5.1.47
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.10
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+ com.kongx.serve.Application
+
+
+
+ com.spotify
+ docker-maven-plugin
+ 0.4.13
+
+ ${project.artifactId}
+ src/main/docker
+
+
+ /
+ ${project.build.directory}
+ *.zip
+
+
+
+
+
+ maven-assembly-plugin
+
+
+ package
+
+ single
+
+
+ ${project.artifactId}-${project.version}
+ false
+
+ src/assembly/assembly-descriptor.xml
+
+
+
+
+
+
+
+
diff --git a/kongx-serve/src/assembly/assembly-descriptor.xml b/kongx-serve/src/assembly/assembly-descriptor.xml
new file mode 100644
index 0000000..ab11afa
--- /dev/null
+++ b/kongx-serve/src/assembly/assembly-descriptor.xml
@@ -0,0 +1,46 @@
+
+ kongx-assembly
+
+ zip
+
+ false
+
+
+
+ src/main/scripts
+ scripts
+
+ *.sh
+
+ 0755
+ unix
+
+
+ src/main/config
+ ./
+
+ kongx-serve.conf
+
+ unix
+
+
+ target/classes
+ ./config
+
+ application.properties
+
+
+
+
+ target
+ ./
+
+ ${project.artifactId}-*.jar
+
+ 0755
+
+
+
diff --git a/kongx-serve/src/main/config/application.properties b/kongx-serve/src/main/config/application.properties
new file mode 100644
index 0000000..4449abb
--- /dev/null
+++ b/kongx-serve/src/main/config/application.properties
@@ -0,0 +1,3 @@
+spring.datasource.url= @spring_datasource_url@
+spring.datasource.username= @spring_datasource_username@
+spring.datasource.password= @spring_datasource_password@
\ No newline at end of file
diff --git a/kongx-serve/src/main/config/kongx-serve.conf b/kongx-serve/src/main/config/kongx-serve.conf
new file mode 100644
index 0000000..ca61230
--- /dev/null
+++ b/kongx-serve/src/main/config/kongx-serve.conf
@@ -0,0 +1,3 @@
+MODE=service
+PID_FOLDER=.
+LOG_FOLDER=/var/log/kongx/
\ No newline at end of file
diff --git a/kongx-serve/src/main/java/com/kongx/serve/Application.java b/kongx-serve/src/main/java/com/kongx/serve/Application.java
new file mode 100644
index 0000000..008137c
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/Application.java
@@ -0,0 +1,24 @@
+package com.kongx.serve;
+
+import com.kongx.common.KongxBanner;
+import com.kongx.common.config.KongxConfig;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Configurable;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Import;
+
+@SpringBootApplication()
+@EnableFeignClients(basePackages = "com.kongx")
+@Configurable
+@Import(KongxConfig.class)
+@MapperScan("com.kongx.serve.mapper")
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication application = new SpringApplication(Application.class);
+ application.setBanner(new KongxBanner());
+ application.run(args);
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/config/FastJsonConfiguration.java b/kongx-serve/src/main/java/com/kongx/serve/config/FastJsonConfiguration.java
new file mode 100644
index 0000000..766a403
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/config/FastJsonConfiguration.java
@@ -0,0 +1,31 @@
+package com.kongx.serve.config;
+
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class FastJsonConfiguration {
+ @Bean
+ public HttpMessageConverters fastJsonHttpMessageConverters() {
+ FastJsonHttpMessageConverter fasHttpMessageConverter = new FastJsonHttpMessageConverter();
+ HttpMessageConverter> converter = fasHttpMessageConverter;
+
+ FastJsonConfig fastJsonConfig = new FastJsonConfig();
+ List fastMediaTypes = new ArrayList<>();
+ fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
+ fastMediaTypes.add(MediaType.TEXT_HTML);
+ fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
+ fasHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
+ fasHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
+
+ return new HttpMessageConverters(converter);
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/config/FormSupportConfig.java b/kongx-serve/src/main/java/com/kongx/serve/config/FormSupportConfig.java
new file mode 100644
index 0000000..0ae1509
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/config/FormSupportConfig.java
@@ -0,0 +1,40 @@
+package com.kongx.serve.config;
+
+import feign.Logger;
+import feign.codec.Encoder;
+import feign.form.spring.SpringFormEncoder;
+import org.springframework.beans.factory.ObjectFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
+import org.springframework.cloud.openfeign.support.SpringEncoder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Primary;
+import org.springframework.stereotype.Component;
+
+@Component
+public class FormSupportConfig {
+ @Autowired
+ private ObjectFactory messageConverters;
+
+ /**
+ * new一个form编码器,实现支持form表单提交
+ *
+ * @return
+ */
+ @Bean
+ @Primary
+ public Encoder feignFormEncoder() {
+ return new SpringFormEncoder(new SpringEncoder(messageConverters));
+ }
+
+
+ /**
+ * 开启Feign的日志
+ *
+ * @return
+ */
+ @Bean
+ public Logger.Level logger() {
+ return Logger.Level.FULL;
+ }
+}
\ No newline at end of file
diff --git a/kongx-serve/src/main/java/com/kongx/serve/config/KongRequestInterceptor.java b/kongx-serve/src/main/java/com/kongx/serve/config/KongRequestInterceptor.java
new file mode 100644
index 0000000..c0b7d5e
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/config/KongRequestInterceptor.java
@@ -0,0 +1,14 @@
+package com.kongx.serve.config;
+
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+public class KongRequestInterceptor implements RequestInterceptor {
+ @Override
+ public void apply(RequestTemplate template) {
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/config/MyBatisConfiguration.java b/kongx-serve/src/main/java/com/kongx/serve/config/MyBatisConfiguration.java
new file mode 100644
index 0000000..6228bb4
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/config/MyBatisConfiguration.java
@@ -0,0 +1,21 @@
+package com.kongx.serve.config;
+
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import javax.sql.DataSource;
+
+@Configuration
+public class MyBatisConfiguration {
+
+ @Bean
+ public SqlSessionFactory sqlSessionFactory( DataSource dataSource) throws Exception {
+ SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+ factoryBean.setDataSource(dataSource);
+ factoryBean.setVfs(SpringBootVFS.class);
+ return factoryBean.getObject();
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/AuthorizeController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/AuthorizeController.java
new file mode 100644
index 0000000..c10d075
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/AuthorizeController.java
@@ -0,0 +1,133 @@
+package com.kongx.serve.controller;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.common.utils.JWTTokenUtils;
+import com.kongx.serve.entity.system.Menu;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.entity.system.ServerConfig;
+import com.kongx.serve.service.system.ServerConfigService;
+import com.kongx.serve.service.system.UserInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+import static com.kongx.common.core.entity.UserInfo.SUPER_ADMIN;
+
+/**
+ * @ClassName AuthorizeEndpoint
+ * @Description TODO
+ * @Author raoxiaoyan
+ * @Date 2019/3/20 15:06
+ * @Version 1.0
+ **/
+@RequestMapping
+@RestController
+@Slf4j
+public class AuthorizeController extends BaseController {
+
+ @Autowired
+ private ServerConfigService serverConfigService;
+
+
+ @Autowired
+ private UserInfoService userInfoService;
+
+ @RequestMapping(value = "/authorize/login.do", method = RequestMethod.POST)
+ public ResponseEntity> authorize(HttpServletRequest request, HttpServletResponse response) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ UserInfo userInfo = userInfoService.login(request.getParameter("username"), request.getParameter("password"));
+ jsonHeaderWrapper.setData(JWTTokenUtils.getToken(userInfo));
+ this.log(userInfo, OperationLog.OperationType.OPERATION_LOGIN, OperationLog.OperationTarget.SYSTEM, userInfo);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(500);
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return new ResponseEntity<>(jsonHeaderWrapper, HttpStatus.OK);
+ }
+
+ public final static String COOKIE_ACCESS_TOKEN = "E_ACCESS_TOKEN";
+
+ public static String getAccessToken(HttpServletRequest request) {
+ String accessToken = getCookieByName(request, COOKIE_ACCESS_TOKEN);
+ if (StringUtils.isEmpty(accessToken)) {
+ accessToken = request.getHeader(COOKIE_ACCESS_TOKEN);
+ }
+ return accessToken;
+ }
+
+ public static String getCookieByName(HttpServletRequest request, String name) {
+ Cookie[] cookies = request.getCookies();
+ if (null != cookies) {
+ for (int i = 0; i < cookies.length; i++) {
+ if (cookies[i].getName().equals(name)) {
+ return cookies[i].getValue();
+ }
+ }
+ }
+ return null;
+ }
+
+ @RequestMapping(value = "/authorize/getUserInfo.do", method = RequestMethod.GET)
+ public ResponseEntity getUserInfo(HttpServletRequest request) {
+ Map results = new HashMap<>(3);
+ String token = getAccessToken(request);
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ UserInfo userInfo = JWTTokenUtils.decode(token);
+ UserInfo entityUserInfo = this.userInfoService.findById(userInfo.getUserId());
+ List list = new ArrayList<>();
+ list.add("");
+ results.put("roles", list);
+ ServerConfig superServerConfig = this.serverConfigService.findByKey(SUPER_ADMIN);
+ String[] nameList = superServerConfig.getConfigValue().split(",");
+ long cnt = Arrays.stream(nameList).filter((name) -> userInfo.getUserId().equals(name)).count();
+ //为超级管理员
+ if (cnt > 0) {
+ entityUserInfo.setRoleName(SUPER_ADMIN);
+ }
+ results.put("userInfo", entityUserInfo);
+ Set pointCodes = new HashSet<>();
+ Optional> optional = this.userInfoService.findAllMenu(entityUserInfo, null, "point", this.systemProfile(userInfo));
+ optional.get().stream().forEach((menu -> pointCodes.add(menu.getCode())));
+ results.put("permission", pointCodes);
+ request.getSession().setAttribute("USER_INFO", entityUserInfo);
+ request.getSession().setAttribute("PERMISSIONS", pointCodes);
+ jsonHeaderWrapper.setData(results);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(500);
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return new ResponseEntity<>(jsonHeaderWrapper, HttpStatus.OK);
+ }
+
+ @RequestMapping(value = "/authorize/getMenu.do", method = RequestMethod.GET)
+ public ResponseEntity getMenu(UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ jsonHeaderWrapper.setData(this.userInfoService.findAllMenu(userInfo, -1, "menu", this.systemProfile(userInfo)));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(500);
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return new ResponseEntity<>(jsonHeaderWrapper, HttpStatus.OK);
+ }
+
+ @RequestMapping(value = "/authorize/logout.do", method = RequestMethod.GET)
+ public ResponseEntity logout(HttpServletRequest request, HttpServletResponse response) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+
+ return new ResponseEntity<>(jsonHeaderWrapper, HttpStatus.OK);
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/BaseController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/BaseController.java
new file mode 100644
index 0000000..0d2f50b
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/BaseController.java
@@ -0,0 +1,55 @@
+package com.kongx.serve.controller;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.entity.system.SystemProfile;
+import com.kongx.serve.service.system.LogService;
+import com.kongx.serve.service.system.SystemProfileService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public abstract class BaseController {
+
+ @Autowired
+ private SystemProfileService systemProfileService;
+
+ @Autowired
+ protected LogService logService;
+
+ public Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ public JsonHeaderWrapper init() {
+ JsonHeaderWrapper jsonHeaderWrapper = new JsonHeaderWrapper();
+ return jsonHeaderWrapper;
+ }
+
+ protected SystemProfile systemProfile(UserInfo userInfo) {
+ return this.systemProfileService.getClientByName(userInfo.getUserId());
+ }
+
+ protected void log(UserInfo userInfo, OperationLog.OperationType operationType, OperationLog.OperationTarget operationTarget, Object content) {
+ OperationLog operationLog = to(userInfo, operationType, operationTarget, content);
+ this.logService.log(systemProfile(userInfo), operationLog);
+ }
+
+ private OperationLog to(UserInfo userInfo, OperationLog.OperationType operationType, OperationLog.OperationTarget operationTarget, Object content) {
+ OperationLog operationLog = new OperationLog();
+ SystemProfile systemProfile = this.systemProfile(userInfo);
+ operationLog.setUserId(userInfo.getUserId());
+ operationLog.setCreator(userInfo.getName());
+ operationLog.setTarget(operationTarget.getType());
+ operationLog.setOperation(operationType.getType());
+ operationLog.setProfile(systemProfile.getProfile());
+ operationLog.setContent(content);
+ operationLog.setRemark(String.format("%s %s %s", operationLog.getCreator(), operationType.getRemark(), operationTarget.getTarget()));
+ return operationLog;
+ }
+
+ protected void log(UserInfo userInfo, OperationLog.OperationType operationType, OperationLog.OperationTarget operationTarget, Object content, String remark) {
+ OperationLog operationLog = to(userInfo, operationType, operationTarget, content);
+ operationLog.setRemark(String.format("%s %s %s %s", operationLog.getCreator(), operationType.getRemark(), operationTarget.getTarget(), remark));
+ this.logService.log(systemProfile(userInfo), operationLog);
+ }
+}
\ No newline at end of file
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/HealthCheckController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/HealthCheckController.java
new file mode 100644
index 0000000..402d8d6
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/HealthCheckController.java
@@ -0,0 +1,28 @@
+package com.kongx.serve.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+
+@RestController
+@RequestMapping
+public class HealthCheckController {
+
+ @RequestMapping(value = "/inner/monitor/ping")
+ public void ping(HttpServletResponse response) {
+ int status = 200;
+ File file = new File("./healthcheck.html");
+ if (!file.exists()) {
+ status = 404;
+ }
+ response.setStatus(status);
+ }
+
+ @RequestMapping(value = "/health/check")
+ public void check(HttpServletResponse response) {
+ response.setStatus(200);
+
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/SignInController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/SignInController.java
new file mode 100644
index 0000000..85f418c
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/SignInController.java
@@ -0,0 +1,19 @@
+package com.kongx.serve.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * @author raoxiaoyan
+ */
+@Controller
+public class SignInController {
+
+ @GetMapping("/index")
+ public String login(@RequestParam(value = "error", required = false) String error,
+ @RequestParam(value = "logout", required = false) String logout) {
+ return "index.html";
+ }
+
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/ConsumerController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/ConsumerController.java
new file mode 100644
index 0000000..6392c3e
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/ConsumerController.java
@@ -0,0 +1,128 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.gateway.Consumer;
+import com.kongx.serve.entity.gateway.KongEntity;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.service.gateway.ConsumerService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URISyntaxException;
+
+@RestController("consumerController")
+@RequestMapping("/kong/api/")
+@Slf4j
+public class ConsumerController extends BaseController {
+ private static final String CONSUMER_URI = "/consumers";
+ private static final String CONSUMER_URI_ID = "/consumers/{id}";
+
+ @Autowired
+ private ConsumerService consumerService;
+
+ /**
+ * 查询所有upstream
+ *
+ * @return
+ */
+ @RequestMapping(value = CONSUMER_URI, method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity upstreamKongEntity = consumerService.findAll(systemProfile(userInfo));
+ jsonHeaderWrapper.setData(upstreamKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 新增upstream
+ *
+ * @param consumer
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = CONSUMER_URI, method = RequestMethod.POST)
+ public JsonHeaderWrapper addUpstream(UserInfo userInfo, @RequestBody Consumer consumer) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Consumer results = this.consumerService.add(systemProfile(userInfo), consumer.trim());
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, OperationLog.OperationTarget.UPSTREAM, consumer.getUsername());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 更新consumer
+ *
+ * @param id
+ * @param consumer
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = CONSUMER_URI_ID, method = RequestMethod.POST)
+ public JsonHeaderWrapper update(UserInfo userInfo, @PathVariable String id, @RequestBody Consumer consumer) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Consumer results = this.consumerService.update(systemProfile(userInfo), id, consumer.trim());
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, OperationLog.OperationTarget.UPSTREAM, consumer, consumer.getUsername());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 删除consumer
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = CONSUMER_URI_ID, method = RequestMethod.DELETE)
+ public JsonHeaderWrapper remove(UserInfo userInfo, @PathVariable String id) throws Exception {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Consumer consumer = this.consumerService.findConsumer(systemProfile(userInfo), id);
+ KongEntity upstreamKongEntity = this.consumerService.remove(systemProfile(userInfo), id);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_DELETE, OperationLog.OperationTarget.UPSTREAM, consumer);
+ jsonHeaderWrapper.setData(upstreamKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 查询单个consumer的信息
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = CONSUMER_URI_ID, method = RequestMethod.GET)
+ public JsonHeaderWrapper findUpstream(UserInfo userInfo, @PathVariable String id) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Consumer results = this.consumerService.findConsumer(systemProfile(userInfo), id);
+ jsonHeaderWrapper.setData(results);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/KongInfoController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/KongInfoController.java
new file mode 100644
index 0000000..72b9fed
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/KongInfoController.java
@@ -0,0 +1,31 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.service.gateway.KongInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.net.URISyntaxException;
+import java.util.Map;
+
+@RestController("/KongInfoController")
+@RequestMapping("/kong/api/")
+public class KongInfoController extends BaseController {
+ private static final String INFO_URI = "/info";
+ private static final String STATUS_URI = "/status";
+ @Autowired
+ private KongInfoService kongInfoService;
+
+ @RequestMapping(value = INFO_URI, method = RequestMethod.GET)
+ public Map info(UserInfo userInfo) throws URISyntaxException {
+ return kongInfoService.info(systemProfile(userInfo));
+ }
+
+ @RequestMapping(value = STATUS_URI, method = RequestMethod.GET)
+ public Map status(UserInfo userInfo) throws URISyntaxException {
+ return kongInfoService.status(systemProfile(userInfo));
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/PluginController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/PluginController.java
new file mode 100644
index 0000000..68225cc
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/PluginController.java
@@ -0,0 +1,206 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.gateway.*;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.service.gateway.PluginService;
+import com.kongx.serve.service.gateway.RouteService;
+import com.kongx.serve.service.gateway.ServiceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.openfeign.FeignClientsConfiguration;
+import org.springframework.context.annotation.Import;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URISyntaxException;
+import java.util.Map;
+
+@RestController("/PluginController")
+@RequestMapping("/kong/api/")
+@Import(FeignClientsConfiguration.class)
+public class PluginController extends BaseController {
+ private static final String PLUGIN_URI = "/plugins";
+ private static final String PLUGIN_ROUTE_URI_PATH = "/routes/{routeId}/plugins";
+ private static final String PLUGIN_SERVICE_URI_PATH = "/services/{serviceId}/plugins";
+ private static final String PLUGIN_URI_ID_PATH = "/plugins/{id}";
+ private static final String PLUGIN_URI_SCHEMA_PATH = "/plugins/schema/{name}";
+ @Autowired
+ private PluginService kongFeignService;
+
+ @Autowired
+ private RouteService routeService;
+
+ @Autowired
+ private ServiceService serviceService;
+
+
+ /**
+ * 查询所有plugin
+ *
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = PLUGIN_URI, method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity pluginVOKongEntity = this.kongFeignService.findAll(systemProfile(userInfo));
+ jsonHeaderWrapper.setData(pluginVOKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = PLUGIN_ROUTE_URI_PATH, method = RequestMethod.GET)
+ public JsonHeaderWrapper findAllByRoute(UserInfo userInfo, @PathVariable String routeId) throws URISyntaxException {
+
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity pluginVOKongEntity = this.kongFeignService.findAllByRoute(systemProfile(userInfo), routeId);
+ jsonHeaderWrapper.setData(pluginVOKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = PLUGIN_SERVICE_URI_PATH, method = RequestMethod.GET)
+ public JsonHeaderWrapper findAllByService(UserInfo userInfo, @PathVariable String serviceId) throws URISyntaxException {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity pluginVOKongEntity = this.kongFeignService.findAllByService(systemProfile(userInfo), serviceId);
+ jsonHeaderWrapper.setData(pluginVOKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = PLUGIN_URI_SCHEMA_PATH, method = RequestMethod.GET)
+ public Map findPluginSchema(UserInfo userInfo, @PathVariable String name) throws URISyntaxException {
+ return this.kongFeignService.findPluginSchema(systemProfile(userInfo), name);
+
+ }
+
+ /**
+ * 新增全局的plugin
+ *
+ * @param plugin
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = PLUGIN_URI, method = RequestMethod.POST)
+ public JsonHeaderWrapper add(UserInfo userInfo, @RequestBody Plugin plugin) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ Plugin result = this.kongFeignService.add(systemProfile(userInfo), plugin);
+ jsonHeaderWrapper.setData(result);
+
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, OperationLog.OperationTarget.GLOBAL_PLUGIN, plugin, remark(userInfo, plugin));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ private String remark(UserInfo userInfo, Plugin plugin) {
+ String remark = String.format(" '%s' 从属于全局", plugin.getName());
+ try {
+ if (plugin.getRoute() != null) {
+ Route route = routeService.find(systemProfile(userInfo), plugin.getRoute().getId());
+ remark = String.format("'%s' 从属于路由 '%s'", plugin.getName(), route.getName());
+ }
+ if (plugin.getService() != null) {
+ Service service = this.serviceService.find(systemProfile(userInfo), plugin.getService().getId());
+ remark = String.format("'%s' 从属于服务 '%s'", plugin.getName(), service.getName());
+ }
+ } catch (URISyntaxException e) {
+ return "";
+ }
+ return remark;
+ }
+
+ @RequestMapping(value = PLUGIN_ROUTE_URI_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper addByRoute(UserInfo userInfo, @PathVariable String routeId, @RequestBody Plugin plugin) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ this.kongFeignService.addByRoute(systemProfile(userInfo), routeId, plugin);
+ KongEntity pluginVOKongEntity = this.kongFeignService.findAllByRoute(systemProfile(userInfo), routeId);
+ jsonHeaderWrapper.setData(pluginVOKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = PLUGIN_SERVICE_URI_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper addByService(UserInfo userInfo, @PathVariable String routeId, @RequestBody Plugin plugin) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ this.kongFeignService.addByService(systemProfile(userInfo), routeId, plugin);
+ KongEntity pluginVOKongEntity = this.kongFeignService.findAllByService(systemProfile(userInfo), routeId);
+ jsonHeaderWrapper.setData(pluginVOKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 更新Plugin
+ *
+ * @param id
+ * @param plugin
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = PLUGIN_URI_ID_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper update(UserInfo userInfo, @PathVariable String id, @RequestBody Plugin plugin) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ Plugin result = this.kongFeignService.update(systemProfile(userInfo), id, plugin);
+ jsonHeaderWrapper.setData(result);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, OperationLog.OperationTarget.GLOBAL_PLUGIN, plugin, remark(userInfo, plugin));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 删除Plugin
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = PLUGIN_URI_ID_PATH, method = RequestMethod.DELETE)
+ public JsonHeaderWrapper remove(UserInfo userInfo, @PathVariable String id) throws URISyntaxException {
+ Plugin plugin = this.find(userInfo, id);
+ this.kongFeignService.remove(systemProfile(userInfo), id);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_DELETE, OperationLog.OperationTarget.GLOBAL_PLUGIN, plugin, remark(userInfo, plugin));
+ return findAll(userInfo);
+ }
+
+ /**
+ * 查询单个Plugin的信息
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = PLUGIN_URI_ID_PATH, method = RequestMethod.GET)
+ public Plugin find(UserInfo userInfo, @PathVariable String id) throws URISyntaxException {
+ return this.kongFeignService.find(systemProfile(userInfo), id);
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/RouteController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/RouteController.java
new file mode 100644
index 0000000..88860d7
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/RouteController.java
@@ -0,0 +1,225 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.common.utils.Jackson2Helper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.gateway.KongEntity;
+import com.kongx.serve.entity.gateway.Route;
+import com.kongx.serve.entity.gateway.RouteParams;
+import com.kongx.serve.entity.gateway.Service;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.entity.system.SystemProfile;
+import com.kongx.serve.service.gateway.RouteService;
+import com.kongx.serve.service.gateway.ServiceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URISyntaxException;
+
+@RestController("/RouteController")
+@RequestMapping("/kong/api/")
+public class RouteController extends BaseController {
+ private static final String ROUTE_URI = "/routes";
+ private static final String ROUTE_URI_ID_PATH = "/routes/{id}";
+ private static final String ROUTE_PLUGIN_URI_ID_PATH = "/plugins/{pluginId}/route";
+ private static final String ROUTE_SERVICE_URI_PATH = "/services/{serviceId}/routes";
+ private static final String ROUTE_HOSTS_URI_PATH = "/routes/hosts";
+ private static final String ROUTE_SERVICE_LIST_URI_PATH = "/services/{serviceId}/routes/list";
+
+ @Autowired
+ private RouteService kongFeignService;
+
+
+ /**
+ * 查询所有route
+ *
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_URI, method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity routeKongEntity = kongFeignService.findAll(systemProfile(userInfo));
+ jsonHeaderWrapper.setData(routeKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 查询所有route
+ *
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_SERVICE_LIST_URI_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper findAllRoutesByService(UserInfo userInfo, @PathVariable String serviceId, @RequestBody SystemProfile systemProfile) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ SystemProfile activeClient = this.systemProfile(userInfo);
+ KongEntity routeKongEntity = this.kongFeignService.findAllByService(systemProfile.IS_NULL() ? activeClient : systemProfile, serviceId);
+ jsonHeaderWrapper.setData(routeKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 批量更新路由Hosts
+ *
+ * @return
+ */
+ @RequestMapping(value = {ROUTE_HOSTS_URI_PATH}, method = RequestMethod.POST)
+ public JsonHeaderWrapper batchUpdateRouteDomain(UserInfo userInfo, @RequestBody RouteParams routeParams) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ SystemProfile systemProfile = this.systemProfile(userInfo);
+ KongEntity routeKongEntity = this.kongFeignService.findAll(systemProfile);
+ if (routeParams.getService() != null) {
+ Service service = this.serviceService.find(systemProfile, routeParams.getService().getId());
+ routeKongEntity = this.kongFeignService.findAllByService(systemProfile, service.getName());
+ }
+ StringBuilder routeNames = new StringBuilder();
+ for (Route datum : routeKongEntity.getData()) {
+ datum.setHosts(routeParams.getHosts());
+ this.kongFeignService.update(systemProfile, datum.getId(), datum);
+ }
+ if (!routeKongEntity.getData().isEmpty()) {
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, OperationLog.OperationTarget.ROUTE, routeParams,
+ routeKongEntity.getData().get(0).getName() + " ...等路由的主机名为:" + Jackson2Helper.toJsonString(routeParams.getHosts()));
+ }
+ jsonHeaderWrapper.setErrmsg(routeNames.toString());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 新增Route
+ *
+ * @param route
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_SERVICE_URI_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper add(UserInfo userInfo, @PathVariable String serviceId, @RequestBody Route route) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity routeKongEntity = this.kongFeignService.add(systemProfile(userInfo), serviceId, route.clear());
+ jsonHeaderWrapper.setData(routeKongEntity.getData());
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, OperationLog.OperationTarget.ROUTE, route, remark(userInfo, route));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @Autowired
+ private ServiceService serviceService;
+
+ private String remark(UserInfo userInfo, Route route) {
+ String remark = "";
+ try {
+ if (route.getService() != null) {
+ Service service = this.serviceService.find(systemProfile(userInfo), route.getService().getId());
+ remark = String.format("'%s' 从属于服务 '%s'", route.getName(), service.getName());
+ }
+ } catch (URISyntaxException e) {
+ return "";
+ }
+ return remark;
+ }
+
+ /**
+ * 更新Route
+ *
+ * @param id
+ * @param route
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_URI_ID_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper update(UserInfo userInfo, @PathVariable String id, @RequestBody Route route) throws URISyntaxException {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Route results = this.kongFeignService.update(systemProfile(userInfo), id, route.clear());
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, OperationLog.OperationTarget.ROUTE, route, remark(userInfo, route));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 删除Route
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_URI_ID_PATH, method = RequestMethod.DELETE)
+ public JsonHeaderWrapper remove(UserInfo userInfo, @PathVariable String id) throws URISyntaxException {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Route route = this.kongFeignService.find(systemProfile(userInfo), id);
+ KongEntity routeKongEntity = this.kongFeignService.remove(systemProfile(userInfo), id);
+ jsonHeaderWrapper.setData(routeKongEntity.getData());
+ this.log(userInfo, OperationLog.OperationType.OPERATION_DELETE, OperationLog.OperationTarget.ROUTE, route, remark(userInfo, route));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 查询单个route的信息
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_URI_ID_PATH, method = RequestMethod.GET)
+ public JsonHeaderWrapper find(UserInfo userInfo, @PathVariable String id) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Route results = this.kongFeignService.find(systemProfile(userInfo), id);
+ jsonHeaderWrapper.setData(results);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 通过插件查询单个route的信息
+ *
+ * @param pluginId
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = ROUTE_PLUGIN_URI_ID_PATH, method = RequestMethod.GET)
+ public JsonHeaderWrapper findByPlugin(UserInfo userInfo, @PathVariable String pluginId) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Route results = this.kongFeignService.findByPlugin(systemProfile(userInfo), pluginId);
+ jsonHeaderWrapper.setData(results);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/ServiceController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/ServiceController.java
new file mode 100644
index 0000000..b8dbd5a
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/ServiceController.java
@@ -0,0 +1,154 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.gateway.KongEntity;
+import com.kongx.serve.entity.gateway.PluginVO;
+import com.kongx.serve.entity.gateway.Service;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.entity.system.SystemProfile;
+import com.kongx.serve.service.gateway.PluginService;
+import com.kongx.serve.service.gateway.ServiceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URISyntaxException;
+
+@RestController("/ServiceController")
+@RequestMapping("/kong/api/")
+public class ServiceController extends BaseController {
+ private static final String SERVICE_URI = "/services";
+ private static final String SERVICE_URI_ID_PATH = "/services/{id}";
+ private static final String SERVICE_URI_ID_PLUGIN_PATH = "/services/{serviceId}/list/plugins";
+ private static final String SERVICE_ROUTE_URI_ID_PATH = "/routes/{routeId}/service";
+ private static final String SERVICE_PLUGIN_URI_ID_PATH = "/plugins/{pluginId}/service";
+
+ @Autowired
+ private ServiceService kongFeignService;
+
+ @Autowired
+ private PluginService pluginService;
+
+ /**
+ * 查询所有SERVICE
+ *
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = SERVICE_URI, method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity upstreamKongEntity = kongFeignService.findAll(systemProfile(userInfo));
+ jsonHeaderWrapper.setData(upstreamKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = SERVICE_URI_ID_PLUGIN_PATH, method = {RequestMethod.POST})
+ public JsonHeaderWrapper findAllPlugin(UserInfo userInfo, @PathVariable String serviceId, @RequestBody SystemProfile systemProfile) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ SystemProfile activeClient = this.systemProfile(userInfo);
+ Service service = this.kongFeignService.find(this.systemProfile(userInfo), serviceId);
+ KongEntity pluginVOKongEntity = pluginService.findAllPluginByService(systemProfile.IS_NULL() ? activeClient : systemProfile, serviceId);
+ jsonHeaderWrapper.setData(pluginVOKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 新增service
+ *
+ * @param service
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = SERVICE_URI, method = RequestMethod.POST)
+ public JsonHeaderWrapper add(UserInfo userInfo, @RequestBody Service service) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Service results = this.kongFeignService.add(systemProfile(userInfo), service);
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, OperationLog.OperationTarget.SERVICE, results, results.getName());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 更新service
+ *
+ * @param id
+ * @param service
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = SERVICE_URI_ID_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper update(UserInfo userInfo, @PathVariable String id, @RequestBody Service service) throws URISyntaxException {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Service results = this.kongFeignService.update(systemProfile(userInfo), id, service);
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, OperationLog.OperationTarget.SERVICE, results, results.getName());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 删除upstream
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = SERVICE_URI_ID_PATH, method = RequestMethod.DELETE)
+ public JsonHeaderWrapper remove(UserInfo userInfo, @PathVariable String id) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Service service = this.kongFeignService.find(systemProfile(userInfo), id);
+ KongEntity upstreamKongEntity = this.kongFeignService.remove(systemProfile(userInfo), id);
+ jsonHeaderWrapper.setData(upstreamKongEntity.getData());
+ this.log(userInfo, OperationLog.OperationType.OPERATION_DELETE, OperationLog.OperationTarget.SERVICE, service, service.getName());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+
+ }
+
+ /**
+ * 查询单个upstream的信息
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = SERVICE_URI_ID_PATH, method = RequestMethod.GET)
+ public Service find(UserInfo userInfo, @PathVariable String id) throws URISyntaxException {
+ return this.kongFeignService.find(systemProfile(userInfo), id);
+ }
+
+ @RequestMapping(value = SERVICE_ROUTE_URI_ID_PATH, method = RequestMethod.GET)
+ public Service findByRoute(UserInfo userInfo, @PathVariable String routeId) throws URISyntaxException {
+ return this.kongFeignService.findByRoute(systemProfile(userInfo), routeId);
+ }
+
+ @RequestMapping(value = SERVICE_PLUGIN_URI_ID_PATH, method = RequestMethod.GET)
+ public Service findByPlugin(UserInfo userInfo, @PathVariable String pluginId) throws URISyntaxException {
+ return this.kongFeignService.findByPlugin(systemProfile(userInfo), pluginId);
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/SyncConfigController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/SyncConfigController.java
new file mode 100644
index 0000000..a6bef1a
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/SyncConfigController.java
@@ -0,0 +1,107 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.PaginationSupport;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.serve.entity.gateway.Service;
+import com.kongx.serve.entity.gateway.SyncConfig;
+import com.kongx.serve.entity.gateway.SyncEntity;
+import com.kongx.serve.entity.gateway.SyncLog;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.entity.system.SystemProfile;
+import com.kongx.serve.service.SyncLogService;
+import com.kongx.serve.service.system.SyncConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController("/SyncConfigController")
+@RequestMapping("/kong/sync/")
+public class SyncConfigController extends BaseController {
+ @Autowired
+ private SyncConfigService syncConfigService;
+
+ @Autowired
+ private SyncLogService syncLogService;
+
+ @RequestMapping(value = "/configs", method = RequestMethod.POST)
+ public JsonHeaderWrapper add(UserInfo userInfo, @RequestBody SyncConfig syncConfig) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ syncConfig.setCreator(userInfo.getName());
+ jsonHeaderWrapper.setData(this.syncConfigService.addSyncConfig(userInfo, syncConfig));
+ this.log(userInfo, OperationLog.OperationType.OPERATION_SYNC, OperationLog.OperationTarget.SYNC_SERVICE, syncConfig, remark(userInfo, syncConfig));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ private String remark(UserInfo userInfo, SyncConfig syncConfig) {
+ String remark = String.format(",源环境为:%s", this.systemProfile(userInfo).getProfile());
+ StringBuilder names = new StringBuilder();
+ for (Service service : syncConfig.getServices()) {
+ names.append(service.getName()).append(",");
+ }
+ StringBuilder profiles = new StringBuilder();
+ for (SystemProfile client : syncConfig.getClients()) {
+ profiles.append(client.getProfile()).append(",");
+ }
+ return String.format(remark + ",目标环境列表为:%s服务列表为:%s", profiles, names);
+ }
+
+ @RequestMapping(value = "/configs", method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(SyncConfig syncConfig) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ PaginationSupport paginationSupport = this.syncConfigService.findAll(syncConfig);
+ jsonHeaderWrapper.setData(paginationSupport);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = "/configs/{syncNo}/logs", method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(@PathVariable String syncNo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ List syncLogList = this.syncLogService.findAllBySyncNo(syncNo);
+ jsonHeaderWrapper.setData(syncLogList);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = "/configs/logs", method = RequestMethod.GET)
+ public JsonHeaderWrapper findAll(SyncLog syncLog) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ List syncLogList = this.syncLogService.findBySyncNoAndService(syncLog.getSyncNo(), syncLog.getService(), syncLog.getDest_client());
+ jsonHeaderWrapper.setData(syncLogList);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = "/configs/{syncNo}/config", method = RequestMethod.GET)
+ public JsonHeaderWrapper findBySyncNo(@PathVariable String syncNo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ SyncEntity syncConfig = this.syncConfigService.findBySyncConfig(syncNo);
+ jsonHeaderWrapper.setData(syncConfig);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ }
+ return jsonHeaderWrapper;
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/TargetController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/TargetController.java
new file mode 100644
index 0000000..914a830
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/TargetController.java
@@ -0,0 +1,111 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.gateway.KongEntity;
+import com.kongx.serve.entity.gateway.Target;
+import com.kongx.serve.entity.gateway.TargetHealth;
+import com.kongx.serve.entity.gateway.Upstream;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.entity.system.SystemProfile;
+import com.kongx.serve.service.gateway.TargetService;
+import com.kongx.serve.service.gateway.UpstreamService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.openfeign.FeignClientsConfiguration;
+import org.springframework.context.annotation.Import;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URISyntaxException;
+
+@RestController("/targetController")
+@RequestMapping("/kong/api/")
+@Import(FeignClientsConfiguration.class)
+public class TargetController extends BaseController {
+ private static final String TARGET_URI_PATH = "/upstreams/{id}/targets";
+ private static final String TARGET_URI_HEALTH_PATH = "/upstreams/{id}/targets/health";
+ private static final String TARGET_URI_ID_PATH = "/upstreams/{upstreamId}/targets/{id}";
+
+ @Autowired
+ private TargetService targetFeignService;
+
+ /**
+ * 查询upstream下的所有target
+ *
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = TARGET_URI_HEALTH_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper findAll(UserInfo userInfo, @PathVariable String id, @RequestBody SystemProfile systemProfile) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ SystemProfile activeClient = this.systemProfile(userInfo);
+ KongEntity results = this.targetFeignService.findAllHealth(systemProfile.IS_NULL() ? activeClient : systemProfile, id);
+ jsonHeaderWrapper.setData(results.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 新增upstream
+ *
+ * @param target
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = TARGET_URI_PATH, method = RequestMethod.POST)
+ public JsonHeaderWrapper add(UserInfo userInfo, @PathVariable String id, @RequestBody Target target) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ this.targetFeignService.add(systemProfile(userInfo), id, target);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, OperationLog.OperationTarget.TARGETS, target,
+ remark(userInfo, target, target.getUpstream().getId()));
+ } catch (Exception e) {
+ e.printStackTrace();
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 删除target
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = TARGET_URI_ID_PATH, method = RequestMethod.DELETE)
+ public JsonHeaderWrapper remove(UserInfo userInfo, @PathVariable String upstreamId, @PathVariable String id) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ Target target = this.targetFeignService.findById(systemProfile(userInfo), upstreamId, id);
+ this.targetFeignService.remove(systemProfile(userInfo), upstreamId, id);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_DELETE, OperationLog.OperationTarget.TARGETS, target,
+ remark(userInfo, target, upstreamId));
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @Autowired
+ private UpstreamService upstreamService;
+
+ private String remark(UserInfo userInfo, Target target, String upstreamId) {
+ Upstream upstream = null;
+ String remark = "";
+ try {
+ upstream = this.upstreamService.findUpstream(systemProfile(userInfo), upstreamId);
+ remark = String.format("'%s' 从属于上游服务 '%s'", target.getTarget(), upstream.getName());
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ return remark;
+ }
+
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/UpstreamController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/UpstreamController.java
new file mode 100644
index 0000000..abd8064
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/gateway/UpstreamController.java
@@ -0,0 +1,134 @@
+package com.kongx.serve.controller.gateway;
+
+import com.kongx.common.aop.PreAuthorize;
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.gateway.KongEntity;
+import com.kongx.serve.entity.gateway.Upstream;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.service.gateway.UpstreamService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.openfeign.FeignClientsConfiguration;
+import org.springframework.context.annotation.Import;
+import org.springframework.web.bind.annotation.*;
+
+import java.net.URISyntaxException;
+
+@RestController("/upstreamController")
+@RequestMapping("/kong/api/")
+@Import(FeignClientsConfiguration.class)
+@Slf4j
+public class UpstreamController extends BaseController {
+ private static final String UPSTREAM_URI = "/upstreams";
+ private static final String UPSTREAM_URI_ID = "/upstreams/{id}";
+
+ @Autowired
+ private UpstreamService upstreamService;
+
+ /**
+ * 查询所有upstream
+ *
+ * @return
+ */
+ @RequestMapping(value = UPSTREAM_URI, method = RequestMethod.GET)
+ @PreAuthorize("upstream_view")
+ public JsonHeaderWrapper findAll(UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ KongEntity upstreamKongEntity = upstreamService.findAll(systemProfile(userInfo));
+ jsonHeaderWrapper.setData(upstreamKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 新增upstream
+ *
+ * @param upstream
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = UPSTREAM_URI, method = RequestMethod.POST)
+ @PreAuthorize("upstream_add")
+ public JsonHeaderWrapper addUpstream(UserInfo userInfo, @RequestBody Upstream upstream) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Upstream results = this.upstreamService.add(systemProfile(userInfo), upstream.clear());
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, OperationLog.OperationTarget.UPSTREAM, upstream, upstream.getName());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 更新upstream
+ *
+ * @param id
+ * @param upstream
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = UPSTREAM_URI_ID, method = RequestMethod.POST)
+ public JsonHeaderWrapper update(UserInfo userInfo, @PathVariable String id, @RequestBody Upstream upstream) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Upstream results = this.upstreamService.update(systemProfile(userInfo), id, upstream.clear());
+ jsonHeaderWrapper.setData(results);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, OperationLog.OperationTarget.UPSTREAM, upstream, upstream.getName());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 删除upstream
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = UPSTREAM_URI_ID, method = RequestMethod.DELETE)
+ public JsonHeaderWrapper remove(UserInfo userInfo, @PathVariable String id) throws Exception {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Upstream upstream = this.upstreamService.findUpstream(systemProfile(userInfo), id);
+ KongEntity upstreamKongEntity = this.upstreamService.remove(systemProfile(userInfo), id);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_DELETE, OperationLog.OperationTarget.UPSTREAM, upstream, upstream.getName());
+ jsonHeaderWrapper.setData(upstreamKongEntity.getData());
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ /**
+ * 查询单个upstream的信息
+ *
+ * @param id
+ * @return
+ * @throws URISyntaxException
+ */
+ @RequestMapping(value = UPSTREAM_URI_ID, method = RequestMethod.GET)
+ public JsonHeaderWrapper findUpstream(UserInfo userInfo, @PathVariable String id) {
+ JsonHeaderWrapper jsonHeaderWrapper = this.init();
+ try {
+ Upstream results = this.upstreamService.findUpstream(systemProfile(userInfo), id);
+ jsonHeaderWrapper.setData(results);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/system/DefaultController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/system/DefaultController.java
new file mode 100644
index 0000000..d8df525
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/system/DefaultController.java
@@ -0,0 +1,70 @@
+package com.kongx.serve.controller.system;
+
+import com.kongx.common.core.entity.PaginationSupport;
+import com.kongx.common.core.entity.UserInfo;
+import com.kongx.common.jsonwrapper.JsonHeaderWrapper;
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.entity.system.OperationLog;
+import com.kongx.serve.service.IBaseService;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import java.util.List;
+
+public abstract class DefaultController extends BaseController {
+ protected IBaseService baseService;
+
+ @RequestMapping(value = "/page", method = RequestMethod.GET)
+ public JsonHeaderWrapper findByPage(T project) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ PaginationSupport paginationSupport = baseService.findByPage(project);
+ jsonHeaderWrapper.setData(paginationSupport);
+ } catch (Exception e) {
+ e.printStackTrace();
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(value = "/list", method = RequestMethod.GET)
+ public List findAll(T project) {
+ return baseService.findAll(project);
+ }
+
+
+ @RequestMapping(method = RequestMethod.POST)
+ public JsonHeaderWrapper add(@RequestBody T project, UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ this.baseService.add(project, userInfo);
+ jsonHeaderWrapper.setData(project);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_ADD, operationTarget(), project);
+ } catch (Exception e) {
+ e.printStackTrace();
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ @RequestMapping(path = "/{id}", method = RequestMethod.POST)
+ public JsonHeaderWrapper update(@RequestBody T project, UserInfo userInfo) {
+ JsonHeaderWrapper jsonHeaderWrapper = init();
+ try {
+ this.baseService.update(project, userInfo);
+ jsonHeaderWrapper.setData(project);
+ this.log(userInfo, OperationLog.OperationType.OPERATION_UPDATE, operationTarget(), project);
+ } catch (Exception e) {
+ jsonHeaderWrapper.setStatus(JsonHeaderWrapper.StatusEnum.Failed.getCode());
+ jsonHeaderWrapper.setErrmsg(e.getMessage());
+ }
+ return jsonHeaderWrapper;
+ }
+
+ protected abstract void setBaseService(IBaseService iBaseService);
+
+ protected abstract OperationLog.OperationTarget operationTarget();
+}
diff --git a/kongx-serve/src/main/java/com/kongx/serve/controller/system/EnvController.java b/kongx-serve/src/main/java/com/kongx/serve/controller/system/EnvController.java
new file mode 100644
index 0000000..2a4982a
--- /dev/null
+++ b/kongx-serve/src/main/java/com/kongx/serve/controller/system/EnvController.java
@@ -0,0 +1,30 @@
+package com.kongx.serve.controller.system;
+
+import com.kongx.serve.controller.BaseController;
+import com.kongx.serve.service.system.EnvService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController("/EnvController")
+@RequestMapping("/system/envs/")
+public class EnvController extends BaseController {
+
+ @Autowired
+ private EnvService envService;
+
+ @RequestMapping(method = RequestMethod.GET)
+ public List