diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..281336c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,29 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+.idea/
+*.iml
+**/target/
+
diff --git a/Dockerfile b/Dockerfile
new file mode 100755
index 0000000..f9ca924
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,20 @@
+# 基础镜像
+FROM openjdk:8
+# 作者
+MAINTAINER rongchao@elink-cn.com
+# 对应pom.xml文件中的dockerfile-maven-plugin插件JAR_FILE的值
+ARG JAR_FILE
+# 对应pom.xml文件中的dockerfile-maven-plugin插件JAR_NAME的值
+ARG JAR_NAME
+# 对应pom.xml文件中的dockerfile-maven-plugin插件SERVER_PORT的值
+ARG SERVER_PORT
+# 复制打包完成后的jar文件到/opt目录下
+ENV JAR_PATH /mnt/epdc/${JAR_NAME}.jar
+ADD ${JAR_FILE} $JAR_PATH
+# /data设为环境变量
+ENV DATAPATH /data
+# 挂载/data目录到主机
+VOLUME $DATAPATH
+# 启动容器时执行
+ENTRYPOINT java -jar $JAR_CONFIG $JAR_PATH
+EXPOSE ${SERVER_PORT}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..91b4362
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,261 @@
+
+
+ 4.0.0
+
+
+ com.esua.epdc.yushan
+ epdc-cloud-parent-yushan
+ 1.0.0
+ ../epdc-cloud-parent-yushan
+
+
+ epdc-cloud-gateway-yushan
+ jar
+ 榆山党建e家网关模块
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-hystrix
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zipkin
+
+
+
+
+ com.esua.epdc.yushan
+ epdc-commons-tools
+ ${epdc-cloud-commons.version}
+
+
+
+ com.esua.epdc.yushan
+ epdc-common-clienttoken
+ ${epdc-cloud-commons.version}
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+
+ true
+
+
+
+ com.spotify
+ dockerfile-maven-plugin
+
+
+
+
+
+
+ dev
+
+ true
+
+
+ 9094
+ dev
+ dev
+
+
+ 2
+ 47.104.224.45
+ 6379
+ elink@888
+
+
+ lb://epdc-auth-server
+ lb://epdc-admin-server
+
+ lb://epdc-activiti-server
+
+
+ http://127.0.0.1:9040
+ lb://epdc-app-server
+
+ lb://epdc-heart-server
+
+ lb://epdc-job-server
+
+ lb://epdc-message-server
+
+
+ http://127.0.0.1:9064
+ lb://epdc-oss-server
+ lb://epdc-events-server
+
+ http://127.0.0.1:9060
+
+
+ http://127.0.0.1:9085
+
+
+ lb://epdc-services-server
+
+
+
+ http://127.0.0.1:9068
+ lb://epdc-demo-server
+ http://127.0.0.1:9063
+
+ lb://epdc-websocket-server
+
+
+ lb://epdc-custom-server
+ lb://epdc-points-server
+
+ http://127.0.0.1:9069
+ lb://epdc-analysis-server
+
+
+ false
+ 47.104.224.45:8848
+
+ 6a3577b4-7b79-43f6-aebb-9c3f31263f6a
+
+ http://localhost:9411
+
+
+
+ test
+
+ 10000
+ test
+ test
+
+
+ 2
+ 114.215.125.123
+ 9603
+ epdc!redis@master1405
+
+
+ lb://epdc-auth-server
+ lb://epdc-admin-server
+ lb://epdc-activiti-server
+
+ lb://epdc-api-server
+ lb://epdc-app-server
+ lb://epdc-heart-server
+ lb://epdc-job-server
+ lb://epdc-message-server
+
+ lb://epdc-news-server
+ lb://epdc-oss-server
+ lb://epdc-events-server
+ lb://epdc-cloud-analysis-server
+
+ lb://epdc-work-record-server
+
+ lb://epdc-services-server
+
+ lb://epdc-user-server
+ lb://epdc-demo-server
+ lb://epdc-group-server
+ lb://epdc-websocket-server
+
+ lb://epdc-kpi-server
+ lb://epdc-custom-server
+ lb://epdc-points-server
+ lb://epdc-analysis-server
+
+
+
+ true
+ 47.104.224.45:8848
+ 47.104.85.99
+ 6a3577b4-7b79-43f6-aebb-9c3f31263f6a
+
+ http://localhost:9411
+
+
+
+
+ prod
+
+ 9094
+ prod
+ prod
+
+
+ lb://epdc-auth-server
+ lb://epdc-admin-server
+ lb://epdc-activiti-server
+
+ lb://epdc-api-server
+ lb://epdc-app-server
+ lb://epdc-heart-server
+ lb://epdc-job-server
+ lb://epdc-message-server
+
+ lb://epdc-news-server
+ lb://epdc-oss-server
+ lb://epdc-cloud-analysis-server
+
+ lb://epdc-work-record-server
+
+ lb://epdc-events-server
+ lb://epdc-services-server
+
+ lb://epdc-user-server
+ lb://epdc-demo-server
+ lb://epdc-group-server
+ lb://epdc-websocket-server
+
+ lb://epdc-kpi-server
+ lb://epdc-custom-server
+ lb://epdc-points-server
+ lb://epdc-analysis-server
+
+
+
+ 0
+ 172.16.0.54
+ 6379
+ Elink833066
+
+
+ true
+ 172.16.0.52:8848
+
+
+
+ http://localhost:9411
+
+
+
+
+
diff --git a/src/main/java/com/elink/esua/epdc/GatewayApplication.java b/src/main/java/com/elink/esua/epdc/GatewayApplication.java
new file mode 100644
index 0000000..a0d0e19
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/GatewayApplication.java
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+/**
+ * 网关服务
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients
+public class GatewayApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(GatewayApplication.class, args);
+ }
+
+}
diff --git a/src/main/java/com/elink/esua/epdc/config/CorsConfig.java b/src/main/java/com/elink/esua/epdc/config/CorsConfig.java
new file mode 100644
index 0000000..5f0515c
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/config/CorsConfig.java
@@ -0,0 +1,69 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.web.cors.reactive.CorsUtils;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.WebFilter;
+import org.springframework.web.server.WebFilterChain;
+import reactor.core.publisher.Mono;
+
+/**
+ * Cors跨域
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Configuration
+public class CorsConfig {
+
+ private static final String MAX_AGE = "18000L";
+
+ @Autowired
+ private ServerProperties serverProperties;
+
+ @Bean
+ public WebFilter corsFilter() {
+ return (ServerWebExchange ctx, WebFilterChain chain) -> {
+ ServerHttpRequest request = ctx.getRequest();
+ if (!CorsUtils.isCorsRequest(request)) {
+ return chain.filter(ctx);
+ }
+ HttpHeaders requestHeaders = request.getHeaders();
+ ServerHttpResponse response = ctx.getResponse();
+ HttpMethod requestMethod = requestHeaders.getAccessControlRequestMethod();
+ HttpHeaders headers = response.getHeaders();
+ if (!request.getURI().getPath().startsWith(serverProperties.getServlet().getContextPath().concat("/ws"))) {
+ headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, requestHeaders.getOrigin());
+ headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
+ }
+ headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders.getAccessControlRequestHeaders());
+ if (requestMethod != null) {
+ headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, requestMethod.name());
+ }
+ headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
+ headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE, MAX_AGE);
+ if (request.getMethod() == HttpMethod.OPTIONS) {
+ response.setStatusCode(HttpStatus.OK);
+ return Mono.empty();
+ }
+ return chain.filter(ctx);
+ };
+ }
+
+}
diff --git a/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java b/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java
new file mode 100644
index 0000000..86a6548
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/config/ModuleConfigImpl.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.config;
+
+import com.elink.esua.epdc.commons.tools.config.ModuleConfig;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模块配置信息
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class ModuleConfigImpl implements ModuleConfig {
+ @Override
+ public String getName() {
+ return "gateway";
+ }
+}
diff --git a/src/main/java/com/elink/esua/epdc/feign/ResourceFeignClient.java b/src/main/java/com/elink/esua/epdc/feign/ResourceFeignClient.java
new file mode 100644
index 0000000..b52b556
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/feign/ResourceFeignClient.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.feign;
+
+import com.elink.esua.epdc.common.token.dto.TokenDto;
+import com.elink.esua.epdc.feign.fallback.ResourceFeignClientFallback;
+import com.elink.esua.epdc.commons.tools.constant.ServiceConstant;
+import com.elink.esua.epdc.commons.tools.security.user.UserDetail;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestParam;
+
+/**
+ * 资源接口
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@FeignClient(name = ServiceConstant.EPDC_AUTH_SERVER, fallback = ResourceFeignClientFallback.class)
+public interface ResourceFeignClient {
+
+ /**
+ * 是否有资源访问权限
+ *
+ * @param token token
+ * @param url 资源URL
+ * @param method 请求方式
+ * @return 有访问权限,则返回用户信息
+ */
+ @PostMapping("auth/resource")
+ Result resource(@RequestHeader(HttpHeaders.ACCEPT_LANGUAGE) String language, @RequestParam("token") String token,
+ @RequestParam("url") String url, @RequestParam("method") String method);
+
+ /**
+ * 获取登录用户信息
+ *
+ * @param token
+ * @return com.elink.esua.epdc.commons.tools.utils.Result
+ * @author
+ * @date 2019/8/19 17:19
+ */
+ @GetMapping("auth/getLoginUserInfo")
+ Result getLoginUserInfo(@RequestParam("token") String token);
+}
diff --git a/src/main/java/com/elink/esua/epdc/feign/fallback/ResourceFeignClientFallback.java b/src/main/java/com/elink/esua/epdc/feign/fallback/ResourceFeignClientFallback.java
new file mode 100644
index 0000000..987d2ff
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/feign/fallback/ResourceFeignClientFallback.java
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.feign.fallback;
+
+import com.elink.esua.epdc.common.token.dto.TokenDto;
+import com.elink.esua.epdc.commons.tools.security.user.UserDetail;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import com.elink.esua.epdc.feign.ResourceFeignClient;
+import org.springframework.stereotype.Component;
+
+/**
+ * 资源接口 Fallback
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Component
+public class ResourceFeignClientFallback implements ResourceFeignClient {
+
+ @Override
+ public Result resource(String language, String token, String url, String method) {
+ return new Result().error();
+ }
+
+ @Override
+ public Result getLoginUserInfo(String token) {
+ return new Result().error();
+ }
+}
diff --git a/src/main/java/com/elink/esua/epdc/filter/AuthFilter.java b/src/main/java/com/elink/esua/epdc/filter/AuthFilter.java
new file mode 100644
index 0000000..864cf6f
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/filter/AuthFilter.java
@@ -0,0 +1,154 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.elink.esua.epdc.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.elink.esua.epdc.feign.ResourceFeignClient;
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+import com.elink.esua.epdc.commons.tools.security.user.UserDetail;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+/**
+ * 权限过滤器
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Configuration
+@ConfigurationProperties(prefix = "renren")
+public class AuthFilter implements GlobalFilter {
+
+ private final AntPathMatcher antPathMatcher = new AntPathMatcher();
+
+ @Autowired
+ private ResourceFeignClient resourceFeignClient;
+ /**
+ * 不拦截的urls
+ */
+ private List urls;
+
+ /**
+ * 不拦截工作端urls
+ */
+ private List workLoginUrls;
+
+ /**
+ * 拦截的工作端urls
+ */
+ private List workUrls;
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ ServerHttpRequest request = exchange.getRequest();
+ String requestUri = request.getPath().pathWithinApplication().value();
+
+ //请求放行,无需验证权限
+ if(pathMatcher(requestUri)){
+ return chain.filter(exchange);
+ }
+
+ //获取用户token
+ String token = request.getHeaders().getFirst(Constant.TOKEN_HEADER);
+ if(StringUtils.isBlank(token)){
+ token = request.getHeaders().getFirst(Constant.AUTHORIZATION_HEADER);
+ if (StringUtils.isBlank(token)) {
+ token = request.getQueryParams().getFirst(Constant.TOKEN_HEADER);
+ }
+ }
+
+ //资源访问权限
+ String language = request.getHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE);
+ Result result = resourceFeignClient.resource(language, token, requestUri, request.getMethod().toString());
+ //没权限访问,直接返回
+ if(!result.success()){
+ return response(exchange, result);
+ }
+
+ //获取用户信息
+ UserDetail userDetail = result.getData();
+ if(userDetail != null){
+ //当前登录用户userId,添加到header中
+ ServerHttpRequest build = exchange.getRequest().mutate().header(Constant.USER_KEY, userDetail.getId()+"").build();
+ return chain.filter(exchange.mutate().request(build).build());
+ }
+
+ return chain.filter(exchange);
+ }
+
+ private Mono response(ServerWebExchange exchange, Object object) {
+ String json = JSON.toJSONString(object);
+ DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8));
+ exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
+ exchange.getResponse().setStatusCode(HttpStatus.OK);
+ return exchange.getResponse().writeWith(Flux.just(buffer));
+ }
+
+ private boolean pathMatcher(String requestUri){
+ for (String url : workLoginUrls) {
+ if(antPathMatcher.match(url, requestUri)){
+ return true;
+ }
+ }
+
+ for (String url : workUrls) {
+ if(antPathMatcher.match(url, requestUri)){
+ return false;
+ }
+ }
+
+ for (String url : urls) {
+ if(antPathMatcher.match(url, requestUri)){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public List getUrls() {
+ return urls;
+ }
+
+ public void setUrls(List urls) {
+ this.urls = urls;
+ }
+
+ public List getWorkLoginUrls() {
+ return workLoginUrls;
+ }
+
+ public void setWorkLoginUrls(List workLoginUrls) {
+ this.workLoginUrls = workLoginUrls;
+ }
+
+ public List getWorkUrls() {
+ return workUrls;
+ }
+
+ public void setWorkUrls(List workUrls) {
+ this.workUrls = workUrls;
+ }
+}
diff --git a/src/main/java/com/elink/esua/epdc/filter/CpAuthGatewayFilterFactory.java b/src/main/java/com/elink/esua/epdc/filter/CpAuthGatewayFilterFactory.java
new file mode 100644
index 0000000..eb394b1
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/filter/CpAuthGatewayFilterFactory.java
@@ -0,0 +1,131 @@
+
+package com.elink.esua.epdc.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.elink.esua.epdc.common.token.dto.TokenDto;
+import com.elink.esua.epdc.commons.tools.constant.Constant;
+import com.elink.esua.epdc.commons.tools.utils.Result;
+import com.elink.esua.epdc.feign.ResourceFeignClient;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.util.AntPathMatcher;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * app接口权限过滤器
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Component("CpAuth")
+public class CpAuthGatewayFilterFactory extends AbstractGatewayFilterFactory {
+
+ @Autowired
+ private ResourceFeignClient resourceFeignClient;
+
+ @Autowired
+ private CpProperty cpProperty;
+
+ private final AntPathMatcher antPathMatcher = new AntPathMatcher();
+
+ @Override
+ public List shortcutFieldOrder() {
+ return Arrays.asList("enabled");
+ }
+
+ public CpAuthGatewayFilterFactory() {
+ super(CpAuthGatewayFilterFactory.CpAuthConfig.class);
+ }
+
+ @Override
+ public GatewayFilter apply(CpAuthConfig config) {
+ return (exchange, chain) -> {
+ if (!config.isEnabled()) {
+ return chain.filter(exchange);
+ }
+
+ ServerHttpRequest request = exchange.getRequest();
+ String requestUri = request.getPath().pathWithinApplication().value();
+
+ //请求放行,无需验证权限
+ if (!pathMatcher(requestUri)) {
+ return chain.filter(exchange);
+ }
+
+ HttpHeaders headers = request.getHeaders();
+ String token = headers.getFirst(Constant.AUTHORIZATION_HEADER);
+ if (StringUtils.isBlank(token)) {
+ token = request.getQueryParams().getFirst(Constant.AUTHORIZATION_HEADER);
+ if (StringUtils.isBlank(token)) {
+ return chain.filter(exchange);
+ }
+ }
+ Result result = resourceFeignClient.getLoginUserInfo(token);
+ if (!result.success()) {
+ return response(exchange, result);
+ }
+ TokenDto user = result.getData();
+ //当前登录用户userId,添加到header中
+ if (user != null) {
+ ServerHttpRequest build = exchange.getRequest().mutate().header(Constant.APP_USER_KEY, user.getUserId()).build();
+ return chain.filter(exchange.mutate().request(build).build());
+ }
+ return chain.filter(exchange);
+ };
+ }
+
+ private Mono response(ServerWebExchange exchange, Object object) {
+ String json = JSON.toJSONString(object);
+ DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8));
+ exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8);
+ exchange.getResponse().setStatusCode(HttpStatus.OK);
+ return exchange.getResponse().writeWith(Flux.just(buffer));
+ }
+
+ private boolean pathMatcher(String requestUri) {
+ for (String url : cpProperty.getSwaggerUrls()) {
+ if (antPathMatcher.match(url, requestUri)) {
+ return false;
+ }
+ }
+ for (String url : cpProperty.getUrls()) {
+ if (antPathMatcher.match(url, requestUri)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static class CpAuthConfig {
+
+ /**
+ * 控制是否开启认证
+ */
+ private boolean enabled;
+
+ public CpAuthConfig() {
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+ }
+}
diff --git a/src/main/java/com/elink/esua/epdc/filter/CpProperty.java b/src/main/java/com/elink/esua/epdc/filter/CpProperty.java
new file mode 100644
index 0000000..b15e785
--- /dev/null
+++ b/src/main/java/com/elink/esua/epdc/filter/CpProperty.java
@@ -0,0 +1,27 @@
+package com.elink.esua.epdc.filter;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @author rongchao
+ * @Date 19-5-17
+ */
+@Data
+@Component
+@EnableConfigurationProperties
+@ConfigurationProperties(prefix = "epdc")
+public class CpProperty {
+
+ private List urls;
+
+ /**
+ * 不处理token,直接通过
+ */
+ private List swaggerUrls;
+
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..2baead3
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,286 @@
+server:
+ tomcat:
+ max-swallow-size: 100MB
+ port: @server.port@
+ servlet:
+ context-path: /epdc-api
+
+spring:
+ application:
+ name: epdc-gateway-server
+ #环境 dev|test|prod
+ profiles:
+ active: @spring.profiles.active@
+ servlet:
+ multipart:
+ enabled: true
+ file-size-threshold: 0
+ max-file-size: 100MB
+ max-request-size: 100MB
+ redis:
+ database: @spring.redis.index@
+ host: @spring.redis.host@
+ timeout: 30s
+ port: @spring.redis.port@
+ password: @spring.redis.password@
+ cloud:
+ gateway:
+ locator:
+ enabled: true
+ routes:
+ #认证服务
+ - id: epdc-auth-server
+ uri: @gateway.routes.epdc-auth-server.uri@
+ order: 1
+ predicates:
+ - Path=${server.servlet.context-path}/auth/**
+ filters:
+ - StripPrefix=1
+ #Admin服务
+ - id: epdc-admin-server
+ uri: @gateway.routes.epdc-admin-server.uri@
+ order: 2
+ predicates:
+ - Path=${server.servlet.context-path}/sys/**
+ filters:
+ - StripPrefix=1
+ #OSS服务
+ - id: epdc-oss-server
+ uri: @gateway.routes.epdc-oss-server.uri@
+ order: 3
+ predicates:
+ - Path=${server.servlet.context-path}/oss/**
+ filters:
+ - StripPrefix=1
+ #消息服务
+ - id: epdc-message-server
+ uri: @gateway.routes.epdc-message-server.uri@
+ order: 4
+ predicates:
+ - Path=${server.servlet.context-path}/message/**
+ filters:
+ - StripPrefix=1
+ #工作流服务
+ - id: epdc-activiti-server
+ uri: @gateway.routes.epdc-activiti-server.uri@
+ order: 5
+ predicates:
+ - Path=${server.servlet.context-path}/activiti/**
+ filters:
+ - StripPrefix=1
+ #定时任务服务
+ - id: epdc-job-server
+ uri: @gateway.routes.epdc-job-server.uri@
+ order: 6
+ predicates:
+ - Path=${server.servlet.context-path}/job/**
+ filters:
+ - StripPrefix=1
+ #APP流服务
+ - id: epdc-api-server
+ uri: @gateway.routes.epdc-api-server.uri@
+ order: 7
+ predicates:
+ - Path=${server.servlet.context-path}/api/**
+ filters:
+ - StripPrefix=1
+ - CpAuth=true
+ #爱心互助模块
+ - id: epdc-heart-server
+ uri: @gateway.routes.epdc-heart-server.uri@
+ order: 8
+ predicates:
+ - Path=${server.servlet.context-path}/heart/**
+ filters:
+ - StripPrefix=1
+ #友邻社群模块
+ - id: epdc-group-server
+ uri: @gateway.routes.epdc-group-server.uri@
+ order: 9
+ predicates:
+ - Path=${server.servlet.context-path}/group/**
+ filters:
+ - StripPrefix=1
+ #新闻公告模块
+ - id: epdc-news-server
+ uri: @gateway.routes.epdc-news-server.uri@
+ order: 10
+ predicates:
+ - Path=${server.servlet.context-path}/news/**
+ filters:
+ - StripPrefix=1
+ #党群议事模块
+ - id: epdc-events-server
+ uri: @gateway.routes.epdc-events-server.uri@
+ order: 11
+ predicates:
+ - Path=${server.servlet.context-path}/events/**
+ filters:
+ - StripPrefix=1
+ #生活服务模块
+ - id: epdc-services-server
+ uri: @gateway.routes.epdc-services-server.uri@
+ order: 12
+ predicates:
+ - Path=${server.servlet.context-path}/services/**
+ filters:
+ - StripPrefix=1
+ #APP用户模块
+ - id: epdc-user-server
+ uri: @gateway.routes.epdc-user-server.uri@
+ order: 13
+ predicates:
+ - Path=${server.servlet.context-path}/app-user/**
+ filters:
+ - StripPrefix=1
+ #DEMO服务
+ - id: epdc-demo-server
+ uri: @gateway.routes.epdc-demo-server.uri@
+ order: 14
+ predicates:
+ - Path=${server.servlet.context-path}/demo/**
+ filters:
+ - StripPrefix=1
+ #websocket服务
+ - id: epdc-websocket-server
+ uri: @gateway.routes.epdc-websocket-server.uri@
+ order: 15
+ predicates:
+ - Path=${server.servlet.context-path}/ws/**
+ filters:
+ - StripPrefix=1
+ #绩效考核模块
+ - id: epdc-kpi-server
+ uri: @gateway.routes.epdc-kpi-server.uri@
+ order: 16
+ predicates:
+ - Path=${server.servlet.context-path}/kpi/**
+ filters:
+ - StripPrefix=1
+ #定制模块
+ - id: epdc-custom-server
+ uri: @gateway.routes.epdc-custom-server.uri@
+ order: 17
+ predicates:
+ - Path=${server.servlet.context-path}/custom/**
+ filters:
+ - StripPrefix=1
+ #积分管理
+ - id: epdc-points-server
+ uri: @gateway.routes.epdc-points-server.uri@
+ order: 18
+ predicates:
+ - Path=${server.servlet.context-path}/points/**
+ filters:
+ - StripPrefix=1
+ - id: epdc-cloud-analysis-server
+ uri: @gateway.routes.epdc-cloud-analysis-server.uri@
+ order: 19
+ predicates:
+ - Path=${server.servlet.context-path}/cloudAnalysis/**
+ filters:
+ - StripPrefix=1
+ #工作日志
+ - id: epdc-work-record-server
+ uri: @gateway.routes.epdc-work-record-server.uri@
+ order: 20
+ predicates:
+ - Path=${server.servlet.context-path}/workRecord/**
+ filters:
+ - StripPrefix=1
+ - id: epdc-analysis-server
+ uri: @gateway.routes.epdc-analysis-server.uri@
+ order: 21
+ predicates:
+ - Path=${server.servlet.context-path}/analysis/**
+ filters:
+ - StripPrefix=1
+ nacos:
+ discovery:
+ server-addr: @nacos.server-addr@
+ register-enabled: @nacos.register-enabled@
+ ip: @nacos.ip@
+ namespace: @nacos.namespace@
+ zipkin:
+ # 指定了 zipkin 服务器的地址
+ base-url: @spring.zipkin.base-url@
+ sleuth:
+ sampler:
+ # 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1
+ probability: 1.0
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ endpoint:
+ health:
+ show-details: ALWAYS
+
+
+feign:
+ hystrix:
+ enabled: true
+
+hystrix:
+ command:
+ default:
+ execution:
+ isolation:
+ thread:
+ timeoutInMilliseconds: 60000 #缺省为1000
+
+ribbon:
+ ReadTimeout: 300000
+ ConnectTimeout: 300000
+
+renren:
+ urls:
+ - /auth/captcha
+ - /auth/login
+ - /*/swagger-resources/**
+ - /*/swagger-ui.html
+ - /*/webjars/**
+ - /*/v2/api-docs
+ - /*/swagger/api-docs
+ - /monitor/**
+ - /api/**
+ - /activiti/modeler.html
+ - /activiti/service/**
+ - /activiti/editor-app/**
+ - /message/sms/sendCode #发送验证码
+ - /oss/file/download
+ - /ws/**
+ - /custom/epidemicSentryPost/downloadQRCode/**
+ workLoginUrls:
+ - /api/work/user/getToken #工作端-获取token
+ - /api/work/user/login #工作端-登录
+ - /api/analysis/user/getToken #数据分析端-获取token
+ - /api/analysis/user/login #数据分析端-登录
+ - /api/work/*/swagger/**
+ workUrls:
+ - /api/work/** #工作端接口
+ - /api/analysis/** #数据端接口
+ - /cloudAnalysis/** #数据端接口
+ - /workRecord/** #工作日志接口
+
+epdc:
+ # 党建e家接口
+ urls:
+ - /api/**
+ # 不处理token,直接通过
+ swaggerUrls:
+ - /api/wx/getWxConfig # 获取微信公众号配置
+ - /api/admin/dept/completeName # 获取完整部门名称
+ - /api/message/sms/sendCode # 发送短信验证码
+ - /api/message/sms/registerResult # 发送用户注册审核结果
+ - /api/events/issue/upload # 上传图片
+ - /api/app-user/user/mp/regist # 公众号用户注册
+ - /api/app-user/user/ma/getToken # 小程序用户 登录
+ - /api/app-user/user/ma/regist # 小程序用户 注册
+ - /api/app-user/user/ma/gridLeaderRegister # 小程序用户 网格长注册
+ - /api/app-user/user/ma/v2/getToken # 小程序用户 注册或登录(版本v2)
+ - /api/work/** #工作端接口不拦截
+ - /api/analysis/** #数据端接口不拦截
+ - /cloudAnalysis/** #数据端接口
+ - /workRecord/** #工作日志接口
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..96e2a17
--- /dev/null
+++ b/src/main/resources/logback-spring.xml
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ debug
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+ UTF-8
+
+
+
+
+
+
+
+ ${log.path}/debug.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+
+ ${log.path}/debug-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ debug
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/info.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+
+ ${log.path}/info-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ info
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/warn.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+ ${log.path}/warn-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ warn
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/error.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+ ${log.path}/error-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ ERROR
+ ACCEPT
+ DENY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+