Compare commits

..

10 Commits

Author SHA1 Message Date
8cc78be9da common.js增加img转base64 2022-05-05 17:42:34 +08:00
98a3f7cb1c 修改账号变更说明 2022-02-25 22:12:09 +08:00
49cbe7a9ff 修改配置与依赖 2021-12-12 23:07:37 +08:00
67ea450d18 处理问题 2021-10-14 23:09:07 +08:00
e89c104a43 新增常量 2021-08-26 07:44:27 +08:00
338287c995 新增Kafka,api同步 2021-08-23 15:56:44 +08:00
f7ac52bb4c 修改问题 2021-06-02 23:56:37 +08:00
151d621d04 新增了请求头、参数和响应头参数的控制过滤器 2021-06-02 23:36:00 +08:00
27c60b05fc 新增header和parameter处理器 2021-06-02 14:22:54 +08:00
00046d5bc9 新增请求头,请求参数配置 2021-05-31 23:01:35 +08:00
34 changed files with 2131 additions and 24 deletions

14
pom.xml
View File

@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>ink.wgink</groupId>
@ -30,6 +30,7 @@
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
@ -59,6 +60,17 @@
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>

View File

@ -25,4 +25,6 @@ public @interface CheckEmptyAnnotation {
String regex() default "";
boolean noBlank() default false;
}

View File

@ -0,0 +1,61 @@
package ink.wgink.gateway.component;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import ink.wgink.gateway.dao.route.IRouteDao;
import ink.wgink.gateway.pojo.route.Route;
import ink.wgink.gateway.util.DateUtil;
import ink.wgink.gateway.util.RegexUtil;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
/**
* @ClassName: ApiPublishConsumer
* @Description: api发布消费者
* @Author: wanggeng
* @Date: 2021/8/22 9:31 下午
* @Version: 1.0
*/
@Component
public class ApiPublishConsumer implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
private MongoTemplate mongoTemplate;
public ApiPublishConsumer(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
@KafkaListener(topics = {"apiPublish"})
public void onPublish(ConsumerRecord<?, ?> record) {
JSONObject publishObject = JSON.parseObject(record.value().toString());
JSONObject apiObject = publishObject.getJSONObject("api");
JSONObject systemObject = publishObject.getJSONObject("system");
System.out.println(apiObject);
Route route = new Route();
route.setUuid(apiObject.getString("apiId"));
route.setTitle(apiObject.getString("title"));
route.setUri(String.format("%s://%s", systemObject.getString("requestSchema"), systemObject.getString("ipAddress")));
route.setPath(String.format("%s%s", systemObject.getString("systemContext"), RegexUtil.replacePathParams(apiObject.getString("url"), "*")));
String datetime = DateUtil.getTime();
route.setCreator("1");
route.setGmtCreate(datetime);
route.setModifier("1");
route.setGmtModified(datetime);
mongoTemplate.save(route, IRouteDao.COLLECTION_NAME);
this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
}

View File

@ -1,17 +1,25 @@
package ink.wgink.gateway.component;
import ink.wgink.gateway.consts.ISystemConst;
import ink.wgink.gateway.dao.route.IRouteDao;
import ink.wgink.gateway.dao.route.request.IRequestHeaderDao;
import ink.wgink.gateway.dao.route.request.IRequestParameterDao;
import ink.wgink.gateway.dao.route.request.IResponseHeaderDao;
import ink.wgink.gateway.enums.FilterRequestResponseTypeEnum;
import ink.wgink.gateway.filter.local.CommonFiltersDefinition;
import ink.wgink.gateway.pojo.route.Route;
import ink.wgink.gateway.pojo.route.request.RequestHeader;
import ink.wgink.gateway.pojo.route.request.RequestParameter;
import ink.wgink.gateway.pojo.route.request.ResponseHeader;
import ink.wgink.gateway.util.UUIDUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.filter.factory.*;
import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition;
import org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionRepository;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriComponentsBuilder;
import reactor.core.publisher.Flux;
@ -35,10 +43,12 @@ import java.util.Map;
@Component
public class MongoRouteDefinitionRepository implements RouteDefinitionRepository {
public IRouteDao routeDao;
private IRouteDao routeDao;
private MongoTemplate mongoTemplate;
public MongoRouteDefinitionRepository(IRouteDao routeDao) {
public MongoRouteDefinitionRepository(IRouteDao routeDao, MongoTemplate mongoTemplate) {
this.routeDao = routeDao;
this.mongoTemplate = mongoTemplate;
}
@Override
@ -107,7 +117,77 @@ public class MongoRouteDefinitionRepository implements RouteDefinitionRepository
if (!StringUtils.isBlank(route.getSetPath())) {
filterDefinitions.add(commonFiltersDefinition.setPath(route));
}
requestHeaderFilter(filterDefinitions, commonFiltersDefinition, route);
requestParameterFilter(filterDefinitions, commonFiltersDefinition, route);
responseHeaderFilter(filterDefinitions, commonFiltersDefinition, route);
return filterDefinitions;
}
/**
* 请求头过滤器
*
* @param filterDefinitions
* @param commonFiltersDefinition
*/
private void requestHeaderFilter(List<FilterDefinition> filterDefinitions, CommonFiltersDefinition commonFiltersDefinition, Route route) {
// 添加请求头参数过滤器
List<RequestHeader> addRequestHeaderList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.ADD.getValue())), RequestHeader.class, IRequestHeaderDao.COLLECTION_NAME);
if (!addRequestHeaderList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.addRequestHeader(addRequestHeaderList));
}
// 设置请求头参数过滤器
List<RequestHeader> setRequestHeaderList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.SET.getValue())), RequestHeader.class, IRequestHeaderDao.COLLECTION_NAME);
if (!setRequestHeaderList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.setRequestHeader(setRequestHeaderList));
}
// 删除请求头参数过滤器
List<RequestHeader> removeRequestHeaderList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.REMOVE.getValue())), RequestHeader.class, IRequestHeaderDao.COLLECTION_NAME);
if (!removeRequestHeaderList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.removeRequestHeader(removeRequestHeaderList));
}
}
/**
* 请求参数过滤器
*
* @param filterDefinitions
* @param commonFiltersDefinition
*/
private void requestParameterFilter(List<FilterDefinition> filterDefinitions, CommonFiltersDefinition commonFiltersDefinition, Route route) {
// 添加请求参数过滤器
List<RequestParameter> addRequestParameterList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.ADD.getValue())), RequestParameter.class, IRequestParameterDao.COLLECTION_NAME);
if (!addRequestParameterList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.addRequestParameter(addRequestParameterList));
}
// 删除请求参数过滤器
List<RequestParameter> removeRequestParameterList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.REMOVE.getValue())), RequestParameter.class, IRequestParameterDao.COLLECTION_NAME);
if (!removeRequestParameterList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.removeRequestParameter(removeRequestParameterList));
}
}
/**
* 响应头过滤器
*
* @param filterDefinitions
* @param commonFiltersDefinition
*/
private void responseHeaderFilter(List<FilterDefinition> filterDefinitions, CommonFiltersDefinition commonFiltersDefinition, Route route) {
// 添加请求头参数过滤器
List<ResponseHeader> addResponseHeaderList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.ADD.getValue())), ResponseHeader.class, IResponseHeaderDao.COLLECTION_NAME);
if (!addResponseHeaderList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.addResponseHeader(addResponseHeaderList));
}
// 设置请求头参数过滤器
List<ResponseHeader> setResponseHeaderList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.SET.getValue())), ResponseHeader.class, IResponseHeaderDao.COLLECTION_NAME);
if (!setResponseHeaderList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.setResponseHeader(setResponseHeaderList));
}
// 删除请求头参数过滤器
List<ResponseHeader> removeResponseHeaderList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.REMOVE.getValue())), ResponseHeader.class, IResponseHeaderDao.COLLECTION_NAME);
if (!removeResponseHeaderList.isEmpty()) {
filterDefinitions.add(commonFiltersDefinition.removeResponseHeader(removeResponseHeaderList));
}
}
}

View File

@ -26,4 +26,6 @@ public interface ISystemConst {
String DATE_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
String DATE_YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
String DATE_YYYY_MM_DD_T_HH_MM_SS_TIMEZONE = "yyyy-MM-dd'T'HH:mm:ss.SSS'+08:00'";
}

View File

@ -0,0 +1,22 @@
package ink.wgink.gateway.dao.route.request;
import ink.wgink.gateway.pojo.route.request.RequestHeader;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: IRequestHeaderDao
* @Description: 请求头
* @Author: WangGeng
* @Date: 2021/5/29 22:21
* @Version: 1.0
**/
@Repository
public interface IRequestHeaderDao extends ReactiveMongoRepository<RequestHeader, String> {
String COLLECTION_NAME = "route_request_header";
}

View File

@ -0,0 +1,22 @@
package ink.wgink.gateway.dao.route.request;
import ink.wgink.gateway.pojo.route.request.RequestParameter;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: IRequestParameterDao
* @Description: 请求参数
* @Author: WangGeng
* @Date: 2021/5/29 22:33
* @Version: 1.0
**/
@Repository
public interface IRequestParameterDao extends ReactiveMongoRepository<RequestParameter, String> {
String COLLECTION_NAME = "route_request_parameter";
}

View File

@ -0,0 +1,22 @@
package ink.wgink.gateway.dao.route.request;
import ink.wgink.gateway.pojo.route.request.ResponseHeader;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import org.springframework.stereotype.Repository;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: IResponseHeaderDao
* @Description: 响应头
* @Author: WangGeng
* @Date: 2021/5/29 22:21
* @Version: 1.0
**/
@Repository
public interface IResponseHeaderDao extends ReactiveMongoRepository<ResponseHeader, String> {
String COLLECTION_NAME = "route_response_header";
}

View File

@ -0,0 +1,33 @@
package ink.wgink.gateway.enums;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: FilterRequestTypeEnum
* @Description: 请求过滤器类型
* @Author: WangGeng
* @Date: 2021/5/30 16:54
* @Version: 1.0
**/
public enum FilterRequestResponseTypeEnum {
ADD("add", "添加"),
SET("set", "设置(替换)"),
REMOVE("remove", "移除");
private String value;
private String summary;
FilterRequestResponseTypeEnum(String value, String summary) {
this.value = value;
this.summary = summary;
}
public String getValue() {
return value;
}
public String getSummary() {
return summary;
}
}

View File

@ -2,13 +2,16 @@ package ink.wgink.gateway.filter.local;
import ink.wgink.gateway.consts.ISystemConst;
import ink.wgink.gateway.pojo.route.Route;
import ink.wgink.gateway.pojo.route.request.RequestHeader;
import ink.wgink.gateway.pojo.route.request.RequestParameter;
import ink.wgink.gateway.pojo.route.request.ResponseHeader;
import org.springframework.cloud.gateway.filter.FilterDefinition;
import org.springframework.cloud.gateway.filter.factory.RewriteLocationResponseHeaderGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.RewritePathGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.RewriteResponseHeaderGatewayFilterFactory;
import org.springframework.cloud.gateway.filter.factory.SetPathGatewayFilterFactory;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
@ -23,6 +26,147 @@ import java.util.Map;
**/
public class CommonFiltersDefinition {
/**
* 请求头参数过滤器
*
* @param requestHeaders
* @return
*/
public FilterDefinition addRequestHeader(List<RequestHeader> requestHeaders) {
FilterDefinition addRequestHeader = new FilterDefinition();
Map<String, String> addRequestHeaderMap = new HashMap<>(requestHeaders.size() * 2);
for (RequestHeader requestHeader : requestHeaders) {
addRequestHeaderMap.put("name", requestHeader.getName());
addRequestHeaderMap.put("value", requestHeader.getValue());
}
addRequestHeader.setArgs(addRequestHeaderMap);
addRequestHeader.setName("AddRequestHeader");
return addRequestHeader;
}
/**
* 请求头参数过滤器
*
* @param requestHeaders
* @return
*/
public FilterDefinition setRequestHeader(List<RequestHeader> requestHeaders) {
FilterDefinition setRequestHeader = new FilterDefinition();
Map<String, String> setRequestHeaderMap = new HashMap<>(requestHeaders.size() * 2);
for (RequestHeader requestHeader : requestHeaders) {
setRequestHeaderMap.put("name", requestHeader.getName());
setRequestHeaderMap.put("value", requestHeader.getValue());
}
setRequestHeader.setArgs(setRequestHeaderMap);
setRequestHeader.setName("SetRequestHeader");
return setRequestHeader;
}
/**
* 请求头参数过滤器
*
* @param requestHeaders
* @return
*/
public FilterDefinition removeRequestHeader(List<RequestHeader> requestHeaders) {
FilterDefinition removeRequestHeader = new FilterDefinition();
Map<String, String> removeRequestHeaderMap = new HashMap<>(requestHeaders.size() * 2);
for (RequestHeader requestHeader : requestHeaders) {
removeRequestHeaderMap.put("name", requestHeader.getName());
}
removeRequestHeader.setArgs(removeRequestHeaderMap);
removeRequestHeader.setName("RemoveRequestHeader");
return removeRequestHeader;
}
/**
* 请求参数过滤器
*
* @param requestParameters
* @return
*/
public FilterDefinition addRequestParameter(List<RequestParameter> requestParameters) {
FilterDefinition addRequestParameter = new FilterDefinition();
Map<String, String> addRequestParameterMap = new HashMap<>(requestParameters.size() * 2);
for (RequestParameter requestParameter : requestParameters) {
addRequestParameterMap.put("name", requestParameter.getName());
addRequestParameterMap.put("value", requestParameter.getValue());
}
addRequestParameter.setArgs(addRequestParameterMap);
addRequestParameter.setName("AddRequestParameter");
return addRequestParameter;
}
/**
* 请求参数过滤器
*
* @param requestParameters
* @return
*/
public FilterDefinition removeRequestParameter(List<RequestParameter> requestParameters) {
FilterDefinition removeRequestParameter = new FilterDefinition();
Map<String, String> removeRequestParameterMap = new HashMap<>(requestParameters.size() * 2);
for (RequestParameter requestParameter : requestParameters) {
removeRequestParameterMap.put("name", requestParameter.getName());
}
removeRequestParameter.setArgs(removeRequestParameterMap);
removeRequestParameter.setName("RemoveRequestParameter");
return removeRequestParameter;
}
/**
* 响应头参数过滤器
*
* @param responseHeaders
* @return
*/
public FilterDefinition addResponseHeader(List<ResponseHeader> responseHeaders) {
FilterDefinition addResponseHeader = new FilterDefinition();
Map<String, String> addResponseHeaderMap = new HashMap<>(responseHeaders.size() * 2);
for (ResponseHeader responseHeader : responseHeaders) {
addResponseHeaderMap.put("name", responseHeader.getName());
addResponseHeaderMap.put("value", responseHeader.getValue());
}
addResponseHeader.setArgs(addResponseHeaderMap);
addResponseHeader.setName("AddResponseHeader");
return addResponseHeader;
}
/**
* 响应头参数过滤器
*
* @param responseHeaders
* @return
*/
public FilterDefinition setResponseHeader(List<ResponseHeader> responseHeaders) {
FilterDefinition setResponseHeader = new FilterDefinition();
Map<String, String> setResponseHeaderMap = new HashMap<>(responseHeaders.size() * 2);
for (ResponseHeader responseHeader : responseHeaders) {
setResponseHeaderMap.put("name", responseHeader.getName());
setResponseHeaderMap.put("value", responseHeader.getValue());
}
setResponseHeader.setArgs(setResponseHeaderMap);
setResponseHeader.setName("SetResponseHeader");
return setResponseHeader;
}
/**
* 响应头参数过滤器
*
* @param responseHeaders
* @return
*/
public FilterDefinition removeResponseHeader(List<ResponseHeader> responseHeaders) {
FilterDefinition removeResponseHeader = new FilterDefinition();
Map<String, String> removeResponseHeaderMap = new HashMap<>(responseHeaders.size() * 2);
for (ResponseHeader responseHeader : responseHeaders) {
removeResponseHeaderMap.put("name", responseHeader.getName());
}
removeResponseHeader.setArgs(removeResponseHeaderMap);
removeResponseHeader.setName("RemoveResponseHeader");
return removeResponseHeader;
}
/**
* 重写过滤器将路径中的gw删除暂时无用
*
@ -69,4 +213,5 @@ public class CommonFiltersDefinition {
return rewriteLocationResponse;
}
}

View File

@ -7,7 +7,6 @@ import ink.wgink.gateway.exception.SearchException;
import ink.wgink.gateway.handler.BaseHandler;
import ink.wgink.gateway.pojo.result.SuccessResult;
import ink.wgink.gateway.pojo.route.Route;
import ink.wgink.gateway.pojo.routetype.RouteType;
import ink.wgink.gateway.util.RegexUtil;
import ink.wgink.gateway.util.RequestFieldCheckUtil;
import org.apache.commons.lang3.StringUtils;
@ -165,7 +164,7 @@ public class RouteHandler extends BaseHandler implements ApplicationEventPublish
String routeTypeTrim = routeType.get().trim();
route.setRouteType(routeTypeTrim);
}
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
ExampleMatcher exampleMatcher = ExampleMatcher.matchingAny()
.withMatcher("title", ExampleMatcher.GenericPropertyMatcher::contains)
.withMatcher("summary", ExampleMatcher.GenericPropertyMatcher::contains)
.withMatcher("routeType", ExampleMatcher.GenericPropertyMatcher::exact)

View File

@ -0,0 +1,99 @@
package ink.wgink.gateway.handler.route.request;
import ink.wgink.gateway.dao.route.request.IRequestHeaderDao;
import ink.wgink.gateway.enums.FilterRequestResponseTypeEnum;
import ink.wgink.gateway.exception.ParamsException;
import ink.wgink.gateway.exception.SearchException;
import ink.wgink.gateway.handler.BaseHandler;
import ink.wgink.gateway.pojo.result.SuccessResult;
import ink.wgink.gateway.pojo.route.request.RequestHeader;
import ink.wgink.gateway.util.RequestFieldCheckUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: RequestHeaderHandler
* @Description: 请求头处理
* @Author: WangGeng
* @Date: 2021/5/30 17:00
* @Version: 1.0
**/
@Service
public class RequestHeaderHandler extends BaseHandler {
private IRequestHeaderDao requestHeaderDao;
public RequestHeaderHandler(IRequestHeaderDao requestHeaderDao) {
this.requestHeaderDao = requestHeaderDao;
}
public Mono<ServerResponse> save(ServerRequest serverRequest) {
Mono<RequestHeader> requestHeaderMono = serverRequest.bodyToMono(RequestHeader.class);
return requestHeaderMono.flatMap(requestHeader -> {
RequestFieldCheckUtil.check(requestHeader);
if (!StringUtils.equals(FilterRequestResponseTypeEnum.REMOVE.getValue(), requestHeader.getType()) && StringUtils.isBlank(requestHeader.getValue())) {
return Mono.error(new ParamsException("值不能为空"));
}
setSave(requestHeader);
RequestHeader requestHeaderExample = new RequestHeader();
requestHeaderExample.setName(requestHeader.getName().trim());
ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact).withIgnoreCase("id");
Example example = Example.of(requestHeaderExample, exampleMatcher);
return requestHeaderDao.findOne(example).flatMap(
r -> Mono.error(new SearchException("参数已经存在"))
).switchIfEmpty(requestHeaderDao.save(requestHeader));
}).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Flux.just(new SuccessResult()), SuccessResult.class));
}
public Mono<ServerResponse> delete(ServerRequest serverRequest) {
String ids = serverRequest.pathVariable("ids");
List<String> idList = Arrays.asList(ids.split(","));
return requestHeaderDao.findAllById(idList).flatMap(requestHeader -> requestHeaderDao.delete(requestHeader)).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Mono.just(new SuccessResult()), SuccessResult.class));
}
public Mono<ServerResponse> list(ServerRequest serverRequest) {
String routeId = serverRequest.pathVariable("routeId");
Optional<String> keywords = serverRequest.queryParam("keywords");
Optional<String> type = serverRequest.queryParam("type");
RequestHeader requestHeaderExample = new RequestHeader();
requestHeaderExample.setRouteId(routeId);
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact)
.withIgnoreCase("id");
if (keywords.isPresent()) {
requestHeaderExample.setName(keywords.get().trim());
exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains);
}
if (type.isPresent()) {
requestHeaderExample.setType(type.get().trim());
exampleMatcher.withMatcher("type", ExampleMatcher.GenericPropertyMatcher::exact);
}
Example example = Example.of(requestHeaderExample, exampleMatcher);
return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(requestHeaderDao.findAll(example), RequestHeader.class);
}
public Mono<ServerResponse> get(ServerRequest serverRequest) {
String id = serverRequest.pathVariable("id");
return requestHeaderDao.findById(id).flatMap(
requestHeader -> ServerResponse.ok().body(Mono.just(requestHeader), RequestHeader.class)
).switchIfEmpty(ServerResponse.notFound().build());
}
}

View File

@ -0,0 +1,98 @@
package ink.wgink.gateway.handler.route.request;
import ink.wgink.gateway.dao.route.request.IRequestParameterDao;
import ink.wgink.gateway.enums.FilterRequestResponseTypeEnum;
import ink.wgink.gateway.exception.ParamsException;
import ink.wgink.gateway.exception.SearchException;
import ink.wgink.gateway.handler.BaseHandler;
import ink.wgink.gateway.pojo.result.SuccessResult;
import ink.wgink.gateway.pojo.route.request.RequestParameter;
import ink.wgink.gateway.util.RequestFieldCheckUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: RequestParameterHeader
* @Description: 请求参数
* @Author: WangGeng
* @Date: 2021/5/30 17:00
* @Version: 1.0
**/
@Service
public class RequestParameterHandler extends BaseHandler {
private IRequestParameterDao requestParameterDao;
public RequestParameterHandler(IRequestParameterDao requestParameterDao) {
this.requestParameterDao = requestParameterDao;
}
public Mono<ServerResponse> save(ServerRequest serverRequest) {
Mono<RequestParameter> requestParameterMono = serverRequest.bodyToMono(RequestParameter.class);
return requestParameterMono.flatMap(requestParameter -> {
RequestFieldCheckUtil.check(requestParameter);
if (!StringUtils.equals(FilterRequestResponseTypeEnum.REMOVE.getValue(), requestParameter.getType()) && StringUtils.isBlank(requestParameter.getValue())) {
return Mono.error(new ParamsException("值不能为空"));
}
setSave(requestParameter);
RequestParameter requestParameterExample = new RequestParameter();
requestParameterExample.setName(requestParameter.getName().trim());
ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact).withIgnoreCase("id");
Example example = Example.of(requestParameterExample, exampleMatcher);
return requestParameterDao.findOne(example).flatMap(
r -> Mono.error(new SearchException("参数已经存在"))
).switchIfEmpty(requestParameterDao.save(requestParameter));
}).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Flux.just(new SuccessResult()), SuccessResult.class));
}
public Mono<ServerResponse> delete(ServerRequest serverRequest) {
String ids = serverRequest.pathVariable("ids");
List<String> idList = Arrays.asList(ids.split(","));
return requestParameterDao.findAllById(idList).flatMap(requestParameter -> requestParameterDao.delete(requestParameter)).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Mono.just(new SuccessResult()), SuccessResult.class));
}
public Mono<ServerResponse> list(ServerRequest serverRequest) {
String routeId = serverRequest.pathVariable("routeId");
Optional<String> keywords = serverRequest.queryParam("keywords");
Optional<String> type = serverRequest.queryParam("type");
RequestParameter requestParameterExample = new RequestParameter();
requestParameterExample.setRouteId(routeId);
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact)
.withIgnoreCase("id");
if (keywords.isPresent()) {
requestParameterExample.setName(keywords.get().trim());
exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains);
}
if (type.isPresent()) {
requestParameterExample.setType(type.get().trim());
exampleMatcher.withMatcher("type", ExampleMatcher.GenericPropertyMatcher::exact);
}
Example example = Example.of(requestParameterExample, exampleMatcher);
return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(requestParameterDao.findAll(example), RequestParameter.class);
}
public Mono<ServerResponse> get(ServerRequest serverRequest) {
String id = serverRequest.pathVariable("id");
return requestParameterDao.findById(id).flatMap(
requestParameter -> ServerResponse.ok().body(Mono.just(requestParameter), RequestParameter.class)
).switchIfEmpty(ServerResponse.notFound().build());
}
}

View File

@ -0,0 +1,99 @@
package ink.wgink.gateway.handler.route.request;
import ink.wgink.gateway.dao.route.request.IResponseHeaderDao;
import ink.wgink.gateway.enums.FilterRequestResponseTypeEnum;
import ink.wgink.gateway.exception.ParamsException;
import ink.wgink.gateway.exception.SearchException;
import ink.wgink.gateway.handler.BaseHandler;
import ink.wgink.gateway.pojo.result.SuccessResult;
import ink.wgink.gateway.pojo.route.request.ResponseHeader;
import ink.wgink.gateway.util.RequestFieldCheckUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.ExampleMatcher;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: ResponseHeaderHandler
* @Description: 响应头处理
* @Author: WangGeng
* @Date: 2021/5/30 17:00
* @Version: 1.0
**/
@Service
public class ResponseHeaderHandler extends BaseHandler {
private IResponseHeaderDao responseHeaderDao;
public ResponseHeaderHandler(IResponseHeaderDao responseHeaderDao) {
this.responseHeaderDao = responseHeaderDao;
}
public Mono<ServerResponse> save(ServerRequest serverRequest) {
Mono<ResponseHeader> requestHeaderMono = serverRequest.bodyToMono(ResponseHeader.class);
return requestHeaderMono.flatMap(responseHeader -> {
RequestFieldCheckUtil.check(responseHeader);
if (!StringUtils.equals(FilterRequestResponseTypeEnum.REMOVE.getValue(), responseHeader.getType()) && StringUtils.isBlank(responseHeader.getValue())) {
return Mono.error(new ParamsException("值不能为空"));
}
setSave(responseHeader);
ResponseHeader responseHeaderExample = new ResponseHeader();
responseHeaderExample.setName(responseHeader.getName().trim());
ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact).withIgnoreCase("id");
Example example = Example.of(responseHeaderExample, exampleMatcher);
return responseHeaderDao.findOne(example).flatMap(
r -> Mono.error(new SearchException("参数已经存在"))
).switchIfEmpty(responseHeaderDao.save(responseHeader));
}).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Flux.just(new SuccessResult()), SuccessResult.class));
}
public Mono<ServerResponse> delete(ServerRequest serverRequest) {
String ids = serverRequest.pathVariable("ids");
List<String> idList = Arrays.asList(ids.split(","));
return responseHeaderDao.findAllById(idList).flatMap(requestHeader -> responseHeaderDao.delete(requestHeader)).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Mono.just(new SuccessResult()), SuccessResult.class));
}
public Mono<ServerResponse> list(ServerRequest serverRequest) {
String routeId = serverRequest.pathVariable("routeId");
Optional<String> keywords = serverRequest.queryParam("keywords");
Optional<String> type = serverRequest.queryParam("type");
ResponseHeader responseHeaderExample = new ResponseHeader();
responseHeaderExample.setRouteId(routeId);
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact)
.withIgnoreCase("id");
if (keywords.isPresent()) {
responseHeaderExample.setName(keywords.get().trim());
exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains);
}
if (type.isPresent()) {
responseHeaderExample.setType(type.get().trim());
exampleMatcher.withMatcher("type", ExampleMatcher.GenericPropertyMatcher::exact);
}
Example example = Example.of(responseHeaderExample, exampleMatcher);
return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(responseHeaderDao.findAll(example), ResponseHeader.class);
}
public Mono<ServerResponse> get(ServerRequest serverRequest) {
String id = serverRequest.pathVariable("id");
return responseHeaderDao.findById(id).flatMap(
requestHeader -> ServerResponse.ok().body(Mono.just(requestHeader), ResponseHeader.class)
).switchIfEmpty(ServerResponse.notFound().build());
}
}

View File

@ -126,10 +126,10 @@ public class RouteTypeHandler extends BaseHandler {
routeType.setTitle(keywordTrim);
routeType.setSummary(keywordTrim);
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
ExampleMatcher exampleMatcher = ExampleMatcher.matchingAny()
.withMatcher("title", ExampleMatcher.GenericPropertyMatcher::contains)
.withMatcher("summary", ExampleMatcher.GenericPropertyMatcher::contains)
.withIgnoreCase("id");
.withIgnoreCase("id", "summary");
example = Example.of(routeType, exampleMatcher);
}
return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(routeTypeDao.findAll(example), RouteType.class);

View File

@ -0,0 +1,60 @@
package ink.wgink.gateway.pojo.route.request;
import ink.wgink.gateway.annoation.CheckEmptyAnnotation;
import ink.wgink.gateway.dao.route.request.IRequestHeaderDao;
import ink.wgink.gateway.pojo.BasePOJO;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: RequestHeader
* @Description: 请求头
* @Author: WangGeng
* @Date: 2021/5/29 22:20
* @Version: 1.0
**/
@Document(collection = IRequestHeaderDao.COLLECTION_NAME)
public class RequestHeader extends BasePOJO {
@CheckEmptyAnnotation(name = "路由ID")
private String routeId;
@CheckEmptyAnnotation(name = "类型")
private String type;
@CheckEmptyAnnotation(name = "名称", noBlank = true)
private String name;
private String value;
public String getRouteId() {
return routeId == null ? "" : routeId.trim();
}
public void setRouteId(String routeId) {
this.routeId = routeId;
}
public String getName() {
return name == null ? "" : name.trim();
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type == null ? "" : type.trim();
}
public void setType(String type) {
this.type = type;
}
public String getValue() {
return value == null ? "" : value.trim();
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,60 @@
package ink.wgink.gateway.pojo.route.request;
import ink.wgink.gateway.annoation.CheckEmptyAnnotation;
import ink.wgink.gateway.dao.route.request.IRequestParameterDao;
import ink.wgink.gateway.pojo.BasePOJO;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: RequestParameter
* @Description: 请求参数
* @Author: WangGeng
* @Date: 2021/5/29 22:32
* @Version: 1.0
**/
@Document(collection = IRequestParameterDao.COLLECTION_NAME)
public class RequestParameter extends BasePOJO {
@CheckEmptyAnnotation(name = "路由ID")
private String routeId;
@CheckEmptyAnnotation(name = "类型")
private String type;
@CheckEmptyAnnotation(name = "名称", noBlank = true)
private String name;
private String value;
public String getRouteId() {
return routeId == null ? "" : routeId.trim();
}
public String getType() {
return type == null ? "" : type.trim();
}
public void setType(String type) {
this.type = type;
}
public void setRouteId(String routeId) {
this.routeId = routeId;
}
public String getName() {
return name == null ? "" : name.trim();
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value == null ? "" : value.trim();
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,60 @@
package ink.wgink.gateway.pojo.route.request;
import ink.wgink.gateway.annoation.CheckEmptyAnnotation;
import ink.wgink.gateway.dao.route.request.IResponseHeaderDao;
import ink.wgink.gateway.pojo.BasePOJO;
import org.springframework.data.mongodb.core.mapping.Document;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: ResponseHeader
* @Description: 响应头
* @Author: WangGeng
* @Date: 2021/5/29 22:20
* @Version: 1.0
**/
@Document(collection = IResponseHeaderDao.COLLECTION_NAME)
public class ResponseHeader extends BasePOJO {
@CheckEmptyAnnotation(name = "路由ID")
private String routeId;
@CheckEmptyAnnotation(name = "类型")
private String type;
@CheckEmptyAnnotation(name = "名称", noBlank = true)
private String name;
private String value;
public String getRouteId() {
return routeId == null ? "" : routeId.trim();
}
public void setRouteId(String routeId) {
this.routeId = routeId;
}
public String getName() {
return name == null ? "" : name.trim();
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type == null ? "" : type.trim();
}
public void setType(String type) {
this.type = type;
}
public String getValue() {
return value == null ? "" : value.trim();
}
public void setValue(String value) {
this.value = value;
}
}

View File

@ -0,0 +1,37 @@
package ink.wgink.gateway.router.route.request;
import ink.wgink.gateway.consts.ISystemConst;
import ink.wgink.gateway.handler.route.request.RequestHeaderHandler;
import ink.wgink.gateway.router.BaseRouter;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: RequestHeaderRouter
* @Description: 请求头路由
* @Author: WangGeng
* @Date: 2021/5/30 17:07
* @Version: 1.0
**/
@Component
public class RequestHeaderRouter extends BaseRouter {
@Bean
public RouterFunction<ServerResponse> requestHeaderFunction(RequestHeaderHandler requestHeaderHandler) {
return RouterFunctions.nest(RequestPredicates.path(ISystemConst.ADMIN_ROUTER_PREFIX + "/api/route/request-header"),
RouterFunctions
.route(RequestPredicates.POST("/save"), requestHeaderHandler::save)
.andRoute(RequestPredicates.DELETE("/delete/{ids}"), requestHeaderHandler::delete)
.andRoute(RequestPredicates.GET("list/{routeId}"), requestHeaderHandler::list)
.andRoute(RequestPredicates.GET("/get/{id}"), requestHeaderHandler::get)
);
}
}

View File

@ -0,0 +1,37 @@
package ink.wgink.gateway.router.route.request;
import ink.wgink.gateway.consts.ISystemConst;
import ink.wgink.gateway.handler.route.request.RequestParameterHandler;
import ink.wgink.gateway.router.BaseRouter;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: RequestParameterRouter
* @Description: 请求参数路由
* @Author: WangGeng
* @Date: 2021/5/30 17:08
* @Version: 1.0
**/
@Component
public class RequestParameterRouter extends BaseRouter {
@Bean
public RouterFunction<ServerResponse> requestParameterFunction(RequestParameterHandler requestParameterHandler) {
return RouterFunctions.nest(RequestPredicates.path(ISystemConst.ADMIN_ROUTER_PREFIX + "/api/route/request-parameter"),
RouterFunctions
.route(RequestPredicates.POST("/save"), requestParameterHandler::save)
.andRoute(RequestPredicates.DELETE("/delete/{ids}"), requestParameterHandler::delete)
.andRoute(RequestPredicates.GET("list/{routeId}"), requestParameterHandler::list)
.andRoute(RequestPredicates.GET("/get/{id}"), requestParameterHandler::get)
);
}
}

View File

@ -0,0 +1,37 @@
package ink.wgink.gateway.router.route.request;
import ink.wgink.gateway.consts.ISystemConst;
import ink.wgink.gateway.handler.route.request.ResponseHeaderHandler;
import ink.wgink.gateway.router.BaseRouter;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
/**
* When you feel like quitting. Think about why you started
* 当你想要放弃的时候想想当初你为何开始
*
* @ClassName: ResponseHeaderRouter
* @Description: 响应头路由
* @Author: WangGeng
* @Date: 2021/5/30 17:07
* @Version: 1.0
**/
@Component
public class ResponseHeaderRouter extends BaseRouter {
@Bean
public RouterFunction<ServerResponse> responseHeaderFunction(ResponseHeaderHandler responseHeaderHandler) {
return RouterFunctions.nest(RequestPredicates.path(ISystemConst.ADMIN_ROUTER_PREFIX + "/api/route/response-header"),
RouterFunctions
.route(RequestPredicates.POST("/save"), responseHeaderHandler::save)
.andRoute(RequestPredicates.DELETE("/delete/{ids}"), responseHeaderHandler::delete)
.andRoute(RequestPredicates.GET("list/{routeId}"), responseHeaderHandler::list)
.andRoute(RequestPredicates.GET("/get/{id}"), responseHeaderHandler::get)
);
}
}

View File

@ -48,6 +48,9 @@ public class RequestFieldCheckUtil {
if (fieldValue == null || StringUtils.isBlank(fieldValue.toString())) {
throw new ParamsException(String.format("%s不能为空或空串", checkEmptyAnnotation.name()));
}
if(checkEmptyAnnotation.noBlank() && (fieldValue.toString().contains(" ") || fieldValue.toString().contains(" "))) {
throw new ParamsException(String.format("%s不能有空格", checkEmptyAnnotation.name()));
}
checkRegular(checkEmptyAnnotation.name(), fieldValue.toString(), checkEmptyAnnotation.verifyType(), checkEmptyAnnotation.regex());
checkTypes(checkEmptyAnnotation.name(), fieldValue.toString(), checkEmptyAnnotation.types());
} else if (field.isAnnotationPresent(CheckNumberAnnotation.class)) {

View File

@ -10,7 +10,7 @@ spring:
use-insecure-trust-manager: true
data:
mongodb:
uri: mongodb://127.0.0.1:27017/gateway
uri: mongodb://192.168.0.151:27017/gateway
logging:
level:

View File

@ -11,7 +11,27 @@ spring:
data:
mongodb:
uri: mongodb://mongo:27017/gateway
kafka:
bootstrap-servers: 127.0.0.1:9092
producer:
# 写入失败时重试次数。当leader节点失效一个repli节点会替代成为leader节点此时可能出现写入失败
# 当retris为0时produce不会重复。retirs重发此时repli节点完全成为leader节点不会产生消息丢失。
retries: 0
#procedure要求leader在考虑完成请求之前收到的确认数用于控制发送记录在服务端的持久化其值可以为如下
#acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
#acks = 1 这意味着leader会将记录写入其本地日志但无需等待所有副本服务器的完全确认即可做出回应在这种情况下如果leader在确认记录后立即失败但在将数据复制到所有的副本服务器之前则记录将会丢失。
#acks = all 这意味着leader将等待完整的同步副本集以确认记录这保证了只要至少一个同步副本服务器仍然存活记录就不会丢失这是最强有力的保证这相当于acks = -1的设置。
#可以设置的值为all, -1, 0, 1
acks: 1
consumer:
group-id: WgGateway
# smallest和largest才有效如果smallest重新0开始读取如果是largest从logfile的offset读取。一般情况下我们都是设置smallest
auto-offset-reset: earliest
# 设置自动提交offset
enable-auto-commit: true
# 如果'enable.auto.commit'为true则消费者偏移自动提交给Kafka的频率以毫秒为单位默认值为5000。
auto-commit-interval: 100
max-poll-records: 5
logging:
level:
org.springframework: error

View File

@ -0,0 +1,39 @@
server:
port: 8888
spring:
cloud:
gateway:
enabled: true
httpclient:
# 支持https转发
ssl:
use-insecure-trust-manager: true
data:
mongodb:
uri: mongodb://gateway:gateway@192.168.0.103:27017/gateway
kafka:
bootstrap-servers: 192.168.0.103:9092
producer:
# 写入失败时重试次数。当leader节点失效一个repli节点会替代成为leader节点此时可能出现写入失败
# 当retris为0时produce不会重复。retirs重发此时repli节点完全成为leader节点不会产生消息丢失。
retries: 5
#procedure要求leader在考虑完成请求之前收到的确认数用于控制发送记录在服务端的持久化其值可以为如下
#acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
#acks = 1 这意味着leader会将记录写入其本地日志但无需等待所有副本服务器的完全确认即可做出回应在这种情况下如果leader在确认记录后立即失败但在将数据复制到所有的副本服务器之前则记录将会丢失。
#acks = all 这意味着leader将等待完整的同步副本集以确认记录这保证了只要至少一个同步副本服务器仍然存活记录就不会丢失这是最强有力的保证这相当于acks = -1的设置。
#可以设置的值为all, -1, 0, 1
acks: 1
consumer:
group-id: WgGateway
# smallest和largest才有效如果smallest重新0开始读取如果是largest从logfile的offset读取。一般情况下我们都是设置smallest
auto-offset-reset: earliest
# 设置自动提交offset
enable-auto-commit: true
# 如果'enable.auto.commit'为true则消费者偏移自动提交给Kafka的频率以毫秒为单位默认值为5000。
auto-commit-interval: 100
max-poll-records: 5
logging:
level:
org.springframework: error
ink.wgink: debug

View File

@ -114,7 +114,6 @@ layui.define(function(exports) {
successCallback(responseCode, data, args);
},
error: function (XMLHttpRequest) {
console.log(XMLHttpRequest)
var responseCode = XMLHttpRequest.status;
var responseData = JSON.parse(XMLHttpRequest.responseText ? XMLHttpRequest.responseText: "{}");
if (errorCallback != undefined && errorCallback != null && typeof(errorCallback) == 'function') {

View File

@ -111,12 +111,8 @@
'routeCount': function(value, old) {
$('#routeCount').animateNumbers(value);
},
'lastRequestLogArray': function(value, old) {
},
'lastRequestLogLineChat': function() {
}
'lastRequestLogArray': function(value, old) {},
'lastRequestLogLineChat': function() {}
},
methods: {
sseCountHome: function() {
@ -138,8 +134,6 @@
source.addEventListener('error', function(e) {
if (e.readyState == EventSource.CLOSED) {
console.log("连接关闭");
} else {
console.log(e);
}
}, false);
},
@ -221,8 +215,6 @@
source.addEventListener('error', function(e) {
if (e.readyState == EventSource.CLOSED) {
console.log("连接关闭");
} else {
console.log(e);
}
}, false);
},

View File

@ -174,7 +174,16 @@
}
return rowData;
}
},
{field: 'headersParams', width: 188, title: '参数设置', align: 'center', fixed: 'right',
templet: function (row) {
return '<div class="layui-btn-group">' +
'<button type="button" class="layui-btn layui-btn-xs layui-btn-normal" lay-event="requestHeaderEvent">请求头</button>' +
'<button type="button" class="layui-btn layui-btn-xs" lay-event="paramsEvent">请求参数</button>' +
'<button type="button" class="layui-btn layui-btn-xs layui-btn-warm" lay-event="responseHeaderEvent">响应头</button>' +
'</div>';
}
},
]],
data: tableData.dataArray,
page: true,
@ -299,6 +308,36 @@
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
});
table.on('tool(dataTable)', function(obj) {
var layEvent = obj.event;
var data = obj.data;
if(layEvent === 'requestHeaderEvent') {
top.dialog.open({
url: top.restAjax.path('route/route/request-header/list.html?routeId={uuid}', [data.uuid]),
title: '请求头参数设置',
width: '750px',
height: '400px',
onClose: function() {}
});
} else if(layEvent === 'responseHeaderEvent') {
top.dialog.open({
url: top.restAjax.path('route/route/response-header/list.html?routeId={uuid}', [data.uuid]),
title: '响应头参数设置',
width: '750px',
height: '400px',
onClose: function() {}
});
} else if(layEvent === 'paramsEvent') {
top.dialog.open({
url: top.restAjax.path('route/route/request-parameter/list.html?routeId={uuid}', [data.uuid]),
title: '请求参数设置',
width: '750px',
height: '400px',
onClose: function() {}
});
}
});
});
</script>
</body>

View File

@ -0,0 +1,231 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="/wg/">
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/font/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="assets/layui/css/layui.css">
<link rel="stylesheet" href="assets/layui/css/admin.css"/>
</head>
<body>
<div class="layui-anim layui-anim-fadein list-page-container">
<div class="test-table-reload-btn">
<div class="layui-inline layui-form search-item search-item-width-100">
<select id="type" name="type" >
<option value=""></option>
<option value="add">添加</option>
<option value="set">替换</option>
<option value="remove">移除</option>
</select>
</div>
<div class="layui-btn-group">
<button type="button" id="search" class="layui-btn layui-btn-sm">
<i class="fa fa-lg fa-search"></i> 搜索
</button>
</div>
</div>
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
<!-- 表头按钮组 -->
<script type="text/html" id="headerToolBar">
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-sm" lay-event="saveEvent">
<i class="fa fa-lg fa-plus"></i> 新增
</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm"
lay-event="removeEvent">
<i class="fa fa-lg fa-trash"></i> 删除
</button>
</div>
</script>
</div>
<script src="assets/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layui/modules/'
}).extend({}).use(['layer', 'table'], function () {
var $ = layui.$;
var $win = $(window);
var layer = layui.layer;
var table = layui.table;
var laydate = layui.laydate;
var routeId = top.restAjax.params(window.location.href).routeId;
var resizeTimeout = null;
var tableData = {
tableUrl: 'api/route/request-header/list/{routeId}',
dataArray: [],
currentPage: null
}
function reloadTable(currentPage) {
table.reload('dataTable', {
data: tableData.dataArray,
page: {
curr: currentPage ? currentPage : tableData.currentPage
},
height: $win.height() - 72,
});
}
function initTable() {
var params = {};
if($('#type').val()) {
params.type = $('#type').val();
}
top.restAjax.get(top.restAjax.path(tableData.tableUrl, [routeId]), params, null, function(code, data) {
tableData.dataArray = [];
for(var i = 0, item; item = data[i++];) {
tableData.dataArray.push(item);
}
if(tableData.currentPage) {
reloadTable();
return;
}
table.render({
elem: '#dataTable',
id: 'dataTable',
width: '100%',
height: $win.height() - 72,
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
toolbar: '#headerToolBar',
defaultToolbar: [],
cols: [[
{type: 'checkbox', fixed: 'left'},
{field: 'rowNum', width: 80, title: '序号', fixed: 'left', align: 'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field: 'name', width: 160, title: '名称', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'value', width: 160, title: '值', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'type', width: 80, title: '类型', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
if (rowData === 'add') {
return '<span class="layui-badge layui-bg-blue">添加</span>';
}
if(rowData === 'set') {
return '<span class="layui-badge layui-bg-cyan">替换</span>';
}
if(rowData === 'remove') {
return '<span class="layui-badge layui-bg-red">移除</span>';
}
return rowData;
}
},
{field: 'gmtCreate', width: 180, title: '添加时间', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
}
]],
data: tableData.dataArray,
page: true,
done: function(res, curr, count) {
tableData.currentPage = curr;
if (curr > 1 && res.data.length === 0) {
tableData.currentPage = curr - 1;
reloadTable(tableData.currentPage);
}
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
})
}
initTable();
// 事件 - 页面变化
$win.on('resize', function() {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(function() {
initTable();
}, 500);
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
initTable(1);
});
// 删除
function removeData(ids) {
top.dialog.msg(top.dataMessage.delete, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.delete(top.restAjax.path('api/route/request-header/delete/{ids}', [ids]), {}, null, function (code, data) {
top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000});
initTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
// 事件 - 增删改
table.on('toolbar(dataTable)', function(obj) {
var layEvent = obj.event;
var checkStatus = table.checkStatus('dataTable');
var checkDatas = checkStatus.data;
if(layEvent === 'saveEvent') {
layer.open({
type: 2,
title: false,
closeBtn: 0,
area: ['100%', '100%'],
shadeClose: true,
anim: 2,
content: top.restAjax.path('route/route/request-header/save.html?routeId={routeId}', [routeId]),
end: function() {
initTable();
}
});
} else if(layEvent === 'removeEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += ',';
}
ids += item['uuid'];
}
removeData(ids);
}
} else if(layEvent === 'levelUpEvent') {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,114 @@
<!doctype html>
<html lang="en">
<head>
<base href="/wg/">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/layui/css/layui.css">
<link rel="stylesheet" href="assets/layui/css/admin.css"/>
</head>
<body>
<div class="layui-anim layui-anim-fadein info-page-container">
<div class="layui-card">
<div class="layui-card-header">
<span class="layui-breadcrumb" lay-filter="breadcrumb" style="visibility: visible;">
<a class="close" href="javascript:void(0);">上级列表</a><span lay-separator="">/</span>
<a href="javascript:void(0);"><cite>新增内容</cite></a>
</span>
</div>
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-form-item">
<label class="layui-form-label">名称 *</label>
<div class="layui-input-block">
<input type="text" name="name" class="layui-input" lay-verify="required" placeholder="请输入名称,请求头中的键值对的键名,不能有空格">
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">类型 *</label>
<div class="layui-input-block">
<input type="radio" name="type" value="add" title="添加" checked>
<input type="radio" name="type" value="set" title="替换">
<input type="radio" name="type" value="remove" title="移除">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="value" class="layui-input" placeholder="请输入值,请求头中的键值对的值,当类型为移除时,可以为空">
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="footer-button-box layui-btn-group">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交新增</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="assets/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layui/modules/'
}).extend({}).use(['form', 'laydate', 'laytpl', 'regex'], function(){
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var regex = layui.regex;
var params = top.restAjax.params(window.location.href);
var routeId = params.routeId;
var uuid = params.uuid;
function closeBox() {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
// 初始化内容
function initData() {
}
initData();
// 提交表单
form.on('submit(submitForm)', function(formData) {
top.dialog.confirm(top.dataMessage.commit, function(index) {
top.dialog.close(index);
var loadLayerIndex;
formData.field.routeId = routeId;
top.restAjax.post(top.restAjax.path('api/route/request-header/save', []), formData.field, null, function(code, data) {
var layerIndex = top.dialog.msg(top.dataMessage.commitSuccess, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function(index) {
top.dialog.close(index);
window.location.reload();
},
btn2: function() {
closeBox();
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
});
return false;
});
$('.close').on('click', function() {
closeBox();
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,227 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="/wg/">
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/font/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="assets/layui/css/layui.css">
<link rel="stylesheet" href="assets/layui/css/admin.css"/>
</head>
<body>
<div class="layui-anim layui-anim-fadein list-page-container">
<div class="test-table-reload-btn">
<div class="layui-inline layui-form search-item search-item-width-100">
<select id="type" name="type" >
<option value=""></option>
<option value="add">添加</option>
<option value="remove">移除</option>
</select>
</div>
<div class="layui-btn-group">
<button type="button" id="search" class="layui-btn layui-btn-sm">
<i class="fa fa-lg fa-search"></i> 搜索
</button>
</div>
</div>
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
<!-- 表头按钮组 -->
<script type="text/html" id="headerToolBar">
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-sm" lay-event="saveEvent">
<i class="fa fa-lg fa-plus"></i> 新增
</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm"
lay-event="removeEvent">
<i class="fa fa-lg fa-trash"></i> 删除
</button>
</div>
</script>
</div>
<script src="assets/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layui/modules/'
}).extend({}).use(['layer', 'table'], function () {
var $ = layui.$;
var $win = $(window);
var layer = layui.layer;
var table = layui.table;
var laydate = layui.laydate;
var routeId = top.restAjax.params(window.location.href).routeId;
var resizeTimeout = null;
var tableData = {
tableUrl: 'api/route/request-parameter/list/{routeId}',
dataArray: [],
currentPage: null
}
function reloadTable(currentPage) {
table.reload('dataTable', {
data: tableData.dataArray,
page: {
curr: currentPage ? currentPage : tableData.currentPage
},
height: $win.height() - 72,
});
}
function initTable() {
var params = {};
if($('#type').val()) {
params.type = $('#type').val();
}
top.restAjax.get(top.restAjax.path(tableData.tableUrl, [routeId]), params, null, function(code, data) {
tableData.dataArray = [];
for(var i = 0, item; item = data[i++];) {
tableData.dataArray.push(item);
}
if(tableData.currentPage) {
reloadTable();
return;
}
table.render({
elem: '#dataTable',
id: 'dataTable',
width: '100%',
height: $win.height() - 72,
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
toolbar: '#headerToolBar',
defaultToolbar: [],
cols: [[
{type: 'checkbox', fixed: 'left'},
{field: 'rowNum', width: 80, title: '序号', fixed: 'left', align: 'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field: 'name', width: 160, title: '名称', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'value', width: 160, title: '值', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'type', width: 80, title: '类型', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
if (rowData === 'add') {
return '<span class="layui-badge layui-bg-blue">添加</span>';
}
if(rowData === 'remove') {
return '<span class="layui-badge layui-bg-red">移除</span>';
}
return rowData;
}
},
{field: 'gmtCreate', width: 180, title: '添加时间', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
}
]],
data: tableData.dataArray,
page: true,
done: function(res, curr, count) {
tableData.currentPage = curr;
if (curr > 1 && res.data.length === 0) {
tableData.currentPage = curr - 1;
reloadTable(tableData.currentPage);
}
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
})
}
initTable();
// 事件 - 页面变化
$win.on('resize', function() {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(function() {
initTable();
}, 500);
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
initTable(1);
});
// 删除
function removeData(ids) {
top.dialog.msg(top.dataMessage.delete, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.delete(top.restAjax.path('api/route/request-parameter/delete/{ids}', [ids]), {}, null, function (code, data) {
top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000});
initTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
// 事件 - 增删改
table.on('toolbar(dataTable)', function(obj) {
var layEvent = obj.event;
var checkStatus = table.checkStatus('dataTable');
var checkDatas = checkStatus.data;
if(layEvent === 'saveEvent') {
layer.open({
type: 2,
title: false,
closeBtn: 0,
area: ['100%', '100%'],
shadeClose: true,
anim: 2,
content: top.restAjax.path('route/route/request-parameter/save.html?routeId={routeId}', [routeId]),
end: function() {
initTable();
}
});
} else if(layEvent === 'removeEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += ',';
}
ids += item['uuid'];
}
removeData(ids);
}
} else if(layEvent === 'levelUpEvent') {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,112 @@
<!doctype html>
<html lang="en">
<head>
<base href="/wg/">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/layui/css/layui.css">
<link rel="stylesheet" href="assets/layui/css/admin.css"/>
</head>
<body>
<div class="layui-anim layui-anim-fadein info-page-container">
<div class="layui-card">
<div class="layui-card-header">
<span class="layui-breadcrumb" lay-filter="breadcrumb" style="visibility: visible;">
<a class="close" href="javascript:void(0);">上级列表</a><span lay-separator="">/</span>
<a href="javascript:void(0);"><cite>新增内容</cite></a>
</span>
</div>
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-form-item">
<label class="layui-form-label">名称 *</label>
<div class="layui-input-block">
<input type="text" name="name" class="layui-input" lay-verify="required" placeholder="请输入名称,请求参数的键值对的值,不能有空格">
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">类型 *</label>
<div class="layui-input-block">
<input type="radio" name="type" value="add" title="添加" checked>
<input type="radio" name="type" value="remove" title="移除">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="value" class="layui-input" placeholder="请输入值,请求参数的键值对的值,当类型为移除时,可以为空">
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="footer-button-box layui-btn-group">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交新增</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="assets/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layui/modules/'
}).extend({}).use(['form', 'laydate', 'laytpl', 'regex'], function(){
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var regex = layui.regex;
var params = top.restAjax.params(window.location.href);
var routeId = params.routeId;
var uuid = params.uuid;
function closeBox() {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
// 初始化内容
function initData() {
}
initData();
// 提交表单
form.on('submit(submitForm)', function(formData) {
top.dialog.confirm(top.dataMessage.commit, function(index) {
top.dialog.close(index);
var loadLayerIndex;
formData.field.routeId = routeId;
top.restAjax.post(top.restAjax.path('api/route/request-parameter/save', []), formData.field, null, function(code, data) {
var layerIndex = top.dialog.msg(top.dataMessage.commitSuccess, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function(index) {
top.dialog.close(index);
window.location.reload();
},
btn2: function() {
closeBox();
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
});
return false;
});
$('.close').on('click', function() {
closeBox();
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,231 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="/wg/">
<meta charset="UTF-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/font/font-awesome/css/font-awesome.min.css">
<link rel="stylesheet" href="assets/layui/css/layui.css">
<link rel="stylesheet" href="assets/layui/css/admin.css"/>
</head>
<body>
<div class="layui-anim layui-anim-fadein list-page-container">
<div class="test-table-reload-btn">
<div class="layui-inline layui-form search-item search-item-width-100">
<select id="type" name="type" >
<option value=""></option>
<option value="add">添加</option>
<option value="set">替换</option>
<option value="remove">移除</option>
</select>
</div>
<div class="layui-btn-group">
<button type="button" id="search" class="layui-btn layui-btn-sm">
<i class="fa fa-lg fa-search"></i> 搜索
</button>
</div>
</div>
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
<!-- 表头按钮组 -->
<script type="text/html" id="headerToolBar">
<div class="layui-btn-group">
<button type="button" class="layui-btn layui-btn-sm" lay-event="saveEvent">
<i class="fa fa-lg fa-plus"></i> 新增
</button>
<button type="button" class="layui-btn layui-btn-danger layui-btn-sm"
lay-event="removeEvent">
<i class="fa fa-lg fa-trash"></i> 删除
</button>
</div>
</script>
</div>
<script src="assets/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layui/modules/'
}).extend({}).use(['layer', 'table'], function () {
var $ = layui.$;
var $win = $(window);
var layer = layui.layer;
var table = layui.table;
var laydate = layui.laydate;
var routeId = top.restAjax.params(window.location.href).routeId;
var resizeTimeout = null;
var tableData = {
tableUrl: 'api/route/response-header/list/{routeId}',
dataArray: [],
currentPage: null
}
function reloadTable(currentPage) {
table.reload('dataTable', {
data: tableData.dataArray,
page: {
curr: currentPage ? currentPage : tableData.currentPage
},
height: $win.height() - 72,
});
}
function initTable() {
var params = {};
if($('#type').val()) {
params.type = $('#type').val();
}
top.restAjax.get(top.restAjax.path(tableData.tableUrl, [routeId]), params, null, function(code, data) {
tableData.dataArray = [];
for(var i = 0, item; item = data[i++];) {
tableData.dataArray.push(item);
}
if(tableData.currentPage) {
reloadTable();
return;
}
table.render({
elem: '#dataTable',
id: 'dataTable',
width: '100%',
height: $win.height() - 72,
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
toolbar: '#headerToolBar',
defaultToolbar: [],
cols: [[
{type: 'checkbox', fixed: 'left'},
{field: 'rowNum', width: 80, title: '序号', fixed: 'left', align: 'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field: 'name', width: 160, title: '名称', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'value', width: 160, title: '值', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'type', width: 80, title: '类型', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
if (rowData === 'add') {
return '<span class="layui-badge layui-bg-blue">添加</span>';
}
if(rowData === 'set') {
return '<span class="layui-badge layui-bg-cyan">设置</span>';
}
if(rowData === 'remove') {
return '<span class="layui-badge layui-bg-red">移除</span>';
}
return rowData;
}
},
{field: 'gmtCreate', width: 180, title: '添加时间', align: 'center', sort: true,
templet: function (row) {
var rowData = row[this.field];
if (typeof (rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
}
]],
data: tableData.dataArray,
page: true,
done: function(res, curr, count) {
tableData.currentPage = curr;
if (curr > 1 && res.data.length === 0) {
tableData.currentPage = curr - 1;
reloadTable(tableData.currentPage);
}
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
})
}
initTable();
// 事件 - 页面变化
$win.on('resize', function() {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(function() {
initTable();
}, 500);
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
initTable(1);
});
// 删除
function removeData(ids) {
top.dialog.msg(top.dataMessage.delete, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function (index) {
top.dialog.close(index);
var layIndex;
top.restAjax.delete(top.restAjax.path('api/route/response-header/delete/{ids}', [ids]), {}, null, function (code, data) {
top.dialog.msg(top.dataMessage.deleteSuccess, {time: 1000});
initTable();
}, function (code, data) {
top.dialog.msg(data.msg);
}, function () {
layIndex = top.dialog.msg(top.dataMessage.deleting, {icon: 16, time: 0, shade: 0.3});
}, function () {
top.dialog.close(layIndex);
});
}
});
}
// 事件 - 增删改
table.on('toolbar(dataTable)', function(obj) {
var layEvent = obj.event;
var checkStatus = table.checkStatus('dataTable');
var checkDatas = checkStatus.data;
if(layEvent === 'saveEvent') {
layer.open({
type: 2,
title: false,
closeBtn: 0,
area: ['100%', '100%'],
shadeClose: true,
anim: 2,
content: top.restAjax.path('route/route/response-header/save.html?routeId={routeId}', [routeId]),
end: function() {
initTable();
}
});
} else if(layEvent === 'removeEvent') {
if(checkDatas.length === 0) {
top.dialog.msg(top.dataMessage.table.selectDelete);
} else {
var ids = '';
for(var i = 0, item; item = checkDatas[i++];) {
if(i > 1) {
ids += ',';
}
ids += item['uuid'];
}
removeData(ids);
}
} else if(layEvent === 'levelUpEvent') {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,113 @@
<!doctype html>
<html lang="en">
<head>
<base href="/wg/">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/layui/css/layui.css">
<link rel="stylesheet" href="assets/layui/css/admin.css"/>
</head>
<body>
<div class="layui-anim layui-anim-fadein info-page-container">
<div class="layui-card">
<div class="layui-card-header">
<span class="layui-breadcrumb" lay-filter="breadcrumb" style="visibility: visible;">
<a class="close" href="javascript:void(0);">上级列表</a><span lay-separator="">/</span>
<a href="javascript:void(0);"><cite>新增内容</cite></a>
</span>
</div>
<div class="layui-card-body" style="padding: 15px;">
<form class="layui-form layui-form-pane" lay-filter="dataForm">
<div class="layui-form-item">
<label class="layui-form-label">名称 *</label>
<div class="layui-input-block">
<input type="text" name="name" class="layui-input" lay-verify="required" placeholder="请输入名称,响应头中的键值对的键名,不能有空格">
</div>
</div>
<div class="layui-form-item" pane>
<label class="layui-form-label">类型 *</label>
<div class="layui-input-block">
<input type="radio" name="type" value="add" title="添加" checked>
<input type="radio" name="type" value="set" title="替换">
<input type="radio" name="type" value="remove" title="移除">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label"></label>
<div class="layui-input-block">
<input type="text" name="value" class="layui-input" placeholder="请输入值,响应头中的键值对的值,当类型为移除时,可以为空">
</div>
</div>
<div class="layui-form-item layui-layout-admin">
<div class="layui-input-block">
<div class="footer-button-box layui-btn-group">
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交新增</button>
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<script src="assets/layui/layui.js"></script>
<script>
layui.config({
base: 'assets/layui/modules/'
}).extend({}).use(['form', 'laydate', 'laytpl', 'regex'], function(){
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var regex = layui.regex;
var params = top.restAjax.params(window.location.href);
var routeId = params.routeId;
var uuid = params.uuid;
function closeBox() {
parent.layer.close(parent.layer.getFrameIndex(window.name));
}
// 初始化内容
function initData() {
}
initData();
// 提交表单
form.on('submit(submitForm)', function(formData) {
top.dialog.confirm(top.dataMessage.commit, function(index) {
top.dialog.close(index);
var loadLayerIndex;
formData.field.routeId = routeId;
top.restAjax.post(top.restAjax.path('api/route/response-header/save', []), formData.field, null, function(code, data) {
var layerIndex = top.dialog.msg(top.dataMessage.commitSuccess, {
time: 0,
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
shade: 0.3,
yes: function(index) {
top.dialog.close(index);
window.location.reload();
},
btn2: function() {
closeBox();
}
});
}, function(code, data) {
top.dialog.msg(data.msg);
}, function() {
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
}, function() {
top.dialog.close(loadLayerIndex);
});
});
return false;
});
$('.close').on('click', function() {
closeBox();
});
});
</script>
</body>
</html>