diff --git a/pom.xml b/pom.xml index 78c4226..e13b769 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.boot spring-boot-starter-parent - 2.4.2 + 2.5.0 ink.wgink @@ -30,6 +30,7 @@ org.springframework.cloud spring-cloud-starter-gateway + 3.0.3 org.springframework.boot diff --git a/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java b/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java index 9a072b6..298dd56 100644 --- a/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java +++ b/src/main/java/ink/wgink/gateway/component/MongoRouteDefinitionRepository.java @@ -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 filterDefinitions, CommonFiltersDefinition commonFiltersDefinition, Route route) { + // 添加请求头参数过滤器 + List 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 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 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 filterDefinitions, CommonFiltersDefinition commonFiltersDefinition, Route route) { + // 添加请求参数过滤器 + List 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 removeRequestParameterList = mongoTemplate.find(new Query().addCriteria(Criteria.where("routeId").is(route.getUuid()).and("type").is(FilterRequestResponseTypeEnum.REMOVE.getValue())), RequestParameter.class, IRequestParameterDao.COLLECTION_NAME); + if (!addRequestParameterList.isEmpty()) { + filterDefinitions.add(commonFiltersDefinition.removeRequestParameter(removeRequestParameterList)); + } + } + + /** + * 响应头过滤器 + * + * @param filterDefinitions + * @param commonFiltersDefinition + */ + private void responseHeaderFilter(List filterDefinitions, CommonFiltersDefinition commonFiltersDefinition, Route route) { + // 添加请求头参数过滤器 + List 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 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 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)); + } + } + } diff --git a/src/main/java/ink/wgink/gateway/dao/route/request/IRequestHeaderDao.java b/src/main/java/ink/wgink/gateway/dao/route/request/IRequestHeaderDao.java index a3c85eb..0ce4248 100644 --- a/src/main/java/ink/wgink/gateway/dao/route/request/IRequestHeaderDao.java +++ b/src/main/java/ink/wgink/gateway/dao/route/request/IRequestHeaderDao.java @@ -17,6 +17,6 @@ import org.springframework.stereotype.Repository; @Repository public interface IRequestHeaderDao extends ReactiveMongoRepository { - String COLLECTION_NAME = "sys_request_header"; + String COLLECTION_NAME = "route_request_header"; } diff --git a/src/main/java/ink/wgink/gateway/dao/route/request/IRequestParameterDao.java b/src/main/java/ink/wgink/gateway/dao/route/request/IRequestParameterDao.java index 79008b8..6fff99e 100644 --- a/src/main/java/ink/wgink/gateway/dao/route/request/IRequestParameterDao.java +++ b/src/main/java/ink/wgink/gateway/dao/route/request/IRequestParameterDao.java @@ -1,6 +1,5 @@ package ink.wgink.gateway.dao.route.request; -import ink.wgink.gateway.pojo.route.request.RequestHeader; import ink.wgink.gateway.pojo.route.request.RequestParameter; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.stereotype.Repository; @@ -18,6 +17,6 @@ import org.springframework.stereotype.Repository; @Repository public interface IRequestParameterDao extends ReactiveMongoRepository { - String COLLECTION_NAME = "sys_request_parameter"; + String COLLECTION_NAME = "route_request_parameter"; } diff --git a/src/main/java/ink/wgink/gateway/dao/route/request/IResponseHeaderDao.java b/src/main/java/ink/wgink/gateway/dao/route/request/IResponseHeaderDao.java new file mode 100644 index 0000000..aa26a84 --- /dev/null +++ b/src/main/java/ink/wgink/gateway/dao/route/request/IResponseHeaderDao.java @@ -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 { + + String COLLECTION_NAME = "route_response_header"; + +} diff --git a/src/main/java/ink/wgink/gateway/enums/FilterRequestTypeEnum.java b/src/main/java/ink/wgink/gateway/enums/FilterRequestResponseTypeEnum.java similarity index 76% rename from src/main/java/ink/wgink/gateway/enums/FilterRequestTypeEnum.java rename to src/main/java/ink/wgink/gateway/enums/FilterRequestResponseTypeEnum.java index 3b61f82..189add5 100644 --- a/src/main/java/ink/wgink/gateway/enums/FilterRequestTypeEnum.java +++ b/src/main/java/ink/wgink/gateway/enums/FilterRequestResponseTypeEnum.java @@ -10,14 +10,15 @@ package ink.wgink.gateway.enums; * @Date: 2021/5/30 16:54 * @Version: 1.0 **/ -public enum FilterRequestTypeEnum { +public enum FilterRequestResponseTypeEnum { ADD("add", "添加"), - SET("set", "设置"); + SET("set", "设置(替换)"), + REMOVE("remove", "移除"); private String value; private String summary; - FilterRequestTypeEnum(String value, String summary) { + FilterRequestResponseTypeEnum(String value, String summary) { this.value = value; this.summary = summary; } diff --git a/src/main/java/ink/wgink/gateway/filter/local/CommonFiltersDefinition.java b/src/main/java/ink/wgink/gateway/filter/local/CommonFiltersDefinition.java index 5a6dabf..7711a02 100644 --- a/src/main/java/ink/wgink/gateway/filter/local/CommonFiltersDefinition.java +++ b/src/main/java/ink/wgink/gateway/filter/local/CommonFiltersDefinition.java @@ -4,6 +4,7 @@ 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; @@ -28,7 +29,6 @@ public class CommonFiltersDefinition { /** * 请求头参数过滤器 * - * @param route * @param requestHeaders * @return */ @@ -44,6 +44,41 @@ public class CommonFiltersDefinition { return addRequestHeader; } + /** + * 请求头参数过滤器 + * + * @param requestHeaders + * @return + */ + public FilterDefinition setRequestHeader(List requestHeaders) { + FilterDefinition setRequestHeader = new FilterDefinition(); + Map 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 requestHeaders) { + FilterDefinition removeRequestHeader = new FilterDefinition(); + Map removeRequestHeaderMap = new HashMap<>(requestHeaders.size() * 2); + for (RequestHeader requestHeader : requestHeaders) { + removeRequestHeaderMap.put("name", requestHeader.getName()); + } + removeRequestHeader.setArgs(removeRequestHeaderMap); + removeRequestHeader.setName("RemoveRequestHeader"); + return removeRequestHeader; + } + /** * 请求参数过滤器 * @@ -62,6 +97,76 @@ public class CommonFiltersDefinition { return addRequestParameter; } + /** + * 请求参数过滤器 + * + * @param requestParameters + * @return + */ + public FilterDefinition removeRequestParameter(List requestParameters) { + FilterDefinition removeRequestParameter = new FilterDefinition(); + Map 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 responseHeaders) { + FilterDefinition addResponseHeader = new FilterDefinition(); + Map 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 responseHeaders) { + FilterDefinition setResponseHeader = new FilterDefinition(); + Map 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 responseHeaders) { + FilterDefinition removeResponseHeader = new FilterDefinition(); + Map removeResponseHeaderMap = new HashMap<>(responseHeaders.size() * 2); + for (ResponseHeader responseHeader : responseHeaders) { + removeResponseHeaderMap.put("name", responseHeader.getName()); + } + removeResponseHeader.setArgs(removeResponseHeaderMap); + removeResponseHeader.setName("RemoveResponseHeader"); + return removeResponseHeader; + } + /** * 重写过滤器,将路径中的gw删除,暂时无用 * diff --git a/src/main/java/ink/wgink/gateway/handler/route/request/RequestHeaderHandler.java b/src/main/java/ink/wgink/gateway/handler/route/request/RequestHeaderHandler.java index 91144fd..d7889a2 100644 --- a/src/main/java/ink/wgink/gateway/handler/route/request/RequestHeaderHandler.java +++ b/src/main/java/ink/wgink/gateway/handler/route/request/RequestHeaderHandler.java @@ -1,12 +1,12 @@ 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.pojo.route.request.RequestParameter; -import ink.wgink.gateway.pojo.routetype.RouteType; import ink.wgink.gateway.util.RequestFieldCheckUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Example; @@ -45,14 +45,17 @@ public class RequestHeaderHandler extends BaseHandler { Mono 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); - RouteType routeTypeExample = new RouteType(); - routeTypeExample.setTitle(requestHeader.getName().trim()); + RequestHeader requestHeaderExample = new RequestHeader(); + requestHeaderExample.setName(requestHeader.getName().trim()); ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact).withIgnoreCase("id"); - Example example = Example.of(routeTypeExample, exampleMatcher); + Example example = Example.of(requestHeaderExample, exampleMatcher); return requestHeaderDao.findOne(example).flatMap( - r -> Mono.error(new SearchException("Header已经存在")) + r -> Mono.error(new SearchException("参数已经存在")) ).switchIfEmpty(requestHeaderDao.save(requestHeader)); }).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Flux.just(new SuccessResult()), SuccessResult.class)); } @@ -63,67 +66,26 @@ public class RequestHeaderHandler extends BaseHandler { 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 update(ServerRequest serverRequest) { - String id = serverRequest.pathVariable("id"); - Mono requestHeaderMono = serverRequest.bodyToMono(RequestHeader.class); - - // 查询ID是否存在 - return requestHeaderDao.findById(id).flatMap(requestHeader -> { - setUpdate(requestHeader); - return requestHeaderMono.flatMap(rh -> { - RequestFieldCheckUtil.check(rh); - requestHeader.setRouteId(rh.getRouteId()); - requestHeader.setType(rh.getType()); - requestHeader.setName(rh.getName()); - requestHeader.setValue(rh.getValue()); - - RequestHeader requestHeaderExample = new RequestHeader(); - requestHeaderExample.setRouteId(rh.getRouteId()); - requestHeaderExample.setName(rh.getName()); - ExampleMatcher exampleMatcher = ExampleMatcher.matching() - .withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact) - .withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact) - .withIgnoreCase("id"); - Example example = Example.of(requestHeaderExample, exampleMatcher); - // 查询Name是否存在 - return requestHeaderDao.findOne(example).flatMap(erh -> { - RequestHeader existRouteHeader = (RequestHeader) erh; - // 如果已经存在 - if (!StringUtils.equals(existRouteHeader.getUuid(), id)) { - return Mono.error(new SearchException("参数已经存在")); - } - return requestHeaderDao.save(requestHeader); - }).switchIfEmpty(requestHeaderDao.save(requestHeader)); - }); - }).switchIfEmpty(ServerResponse.notFound().build()).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Mono.just(new SuccessResult()), SuccessResult.class)); - } - public Mono list(ServerRequest serverRequest) { String routeId = serverRequest.pathVariable("routeId"); Optional keywords = serverRequest.queryParam("keywords"); Optional type = serverRequest.queryParam("type"); - RequestParameter requestParameter = new RequestParameter(); - requestParameter.setRouteId(routeId); + RequestHeader requestHeaderExample = new RequestHeader(); + requestHeaderExample.setRouteId(routeId); ExampleMatcher exampleMatcher = ExampleMatcher.matching() .withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact) .withIgnoreCase("id"); - if (keywords.isPresent() || type.isPresent()) { - String keywordTrim = keywords.get().trim(); - String typeTrim = type.get().trim(); - - if (StringUtils.isNotBlank(keywordTrim)) { - requestParameter.setName(keywordTrim); - exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains); - } - - if (StringUtils.isNotBlank(typeTrim)) { - requestParameter.setType(typeTrim); - exampleMatcher.withMatcher("type", ExampleMatcher.GenericPropertyMatcher::exact); - } + if (keywords.isPresent()) { + requestHeaderExample.setName(keywords.get().trim()); + exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains); } - Example example = Example.of(requestParameter, exampleMatcher); + 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); } diff --git a/src/main/java/ink/wgink/gateway/handler/route/request/RequestParameterHandler.java b/src/main/java/ink/wgink/gateway/handler/route/request/RequestParameterHandler.java index 2b29b10..2ac91bd 100644 --- a/src/main/java/ink/wgink/gateway/handler/route/request/RequestParameterHandler.java +++ b/src/main/java/ink/wgink/gateway/handler/route/request/RequestParameterHandler.java @@ -1,12 +1,12 @@ 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.RequestHeader; import ink.wgink.gateway.pojo.route.request.RequestParameter; -import ink.wgink.gateway.pojo.routetype.RouteType; import ink.wgink.gateway.util.RequestFieldCheckUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Example; @@ -45,14 +45,17 @@ public class RequestParameterHandler extends BaseHandler { Mono 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); - RouteType routeTypeExample = new RouteType(); - routeTypeExample.setTitle(requestParameter.getName().trim()); + RequestParameter requestParameterExample = new RequestParameter(); + requestParameterExample.setName(requestParameter.getName().trim()); ExampleMatcher exampleMatcher = ExampleMatcher.matching().withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact).withIgnoreCase("id"); - Example example = Example.of(routeTypeExample, exampleMatcher); + Example example = Example.of(requestParameterExample, exampleMatcher); return requestParameterDao.findOne(example).flatMap( - r -> Mono.error(new SearchException("Parameter已经存在")) + r -> Mono.error(new SearchException("参数已经存在")) ).switchIfEmpty(requestParameterDao.save(requestParameter)); }).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Flux.just(new SuccessResult()), SuccessResult.class)); } @@ -63,66 +66,25 @@ public class RequestParameterHandler extends BaseHandler { 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 update(ServerRequest serverRequest) { - String id = serverRequest.pathVariable("id"); - Mono requestParameterMono = serverRequest.bodyToMono(RequestParameter.class); - - // 查询ID是否存在 - return requestParameterDao.findById(id).flatMap(requestParameter -> { - setUpdate(requestParameter); - return requestParameterMono.flatMap(rp -> { - RequestFieldCheckUtil.check(rp); - requestParameter.setRouteId(rp.getRouteId()); - requestParameter.setType(rp.getType()); - requestParameter.setName(rp.getName()); - requestParameter.setValue(rp.getValue()); - - RequestHeader requestHeaderExample = new RequestHeader(); - requestHeaderExample.setRouteId(rp.getRouteId()); - requestHeaderExample.setName(rp.getName()); - ExampleMatcher exampleMatcher = ExampleMatcher.matching() - .withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact) - .withMatcher("name", ExampleMatcher.GenericPropertyMatcher::exact) - .withIgnoreCase("id"); - Example example = Example.of(requestHeaderExample, exampleMatcher); - // 查询Name是否存在 - return requestParameterDao.findOne(example).flatMap(erp -> { - RequestParameter existRouteParameter = (RequestParameter) erp; - // 如果已经存在 - if (!StringUtils.equals(existRouteParameter.getUuid(), id)) { - return Mono.error(new SearchException("参数已经存在")); - } - return requestParameterDao.save(requestParameter); - }).switchIfEmpty(requestParameterDao.save(requestParameter)); - }); - }).switchIfEmpty(ServerResponse.notFound().build()).then(ServerResponse.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(Mono.just(new SuccessResult()), SuccessResult.class)); - } - public Mono list(ServerRequest serverRequest) { String routeId = serverRequest.pathVariable("routeId"); Optional keywords = serverRequest.queryParam("keywords"); Optional type = serverRequest.queryParam("type"); - RequestParameter requestParameter = new RequestParameter(); - requestParameter.setRouteId(routeId); + RequestParameter requestParameterExample = new RequestParameter(); + requestParameterExample.setRouteId(routeId); ExampleMatcher exampleMatcher = ExampleMatcher.matching() .withMatcher("routeId", ExampleMatcher.GenericPropertyMatcher::exact) .withIgnoreCase("id"); - if (keywords.isPresent() || type.isPresent()) { - String keywordTrim = keywords.get().trim(); - String typeTrim = type.get().trim(); - - if (StringUtils.isNotBlank(keywordTrim)) { - requestParameter.setName(keywordTrim); - exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains); - } - - if (StringUtils.isNotBlank(typeTrim)) { - requestParameter.setType(typeTrim); - exampleMatcher.withMatcher("type", ExampleMatcher.GenericPropertyMatcher::exact); - } + if (keywords.isPresent()) { + requestParameterExample.setName(keywords.get().trim()); + exampleMatcher.withMatcher("name", ExampleMatcher.GenericPropertyMatcher::contains); } - Example example = Example.of(requestParameter, exampleMatcher); + 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); } diff --git a/src/main/java/ink/wgink/gateway/handler/route/request/ResponseHeaderHandler.java b/src/main/java/ink/wgink/gateway/handler/route/request/ResponseHeaderHandler.java new file mode 100644 index 0000000..965132e --- /dev/null +++ b/src/main/java/ink/wgink/gateway/handler/route/request/ResponseHeaderHandler.java @@ -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 save(ServerRequest serverRequest) { + Mono 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 delete(ServerRequest serverRequest) { + String ids = serverRequest.pathVariable("ids"); + List 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 list(ServerRequest serverRequest) { + String routeId = serverRequest.pathVariable("routeId"); + Optional keywords = serverRequest.queryParam("keywords"); + Optional 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 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()); + } + +} diff --git a/src/main/java/ink/wgink/gateway/pojo/route/request/RequestHeader.java b/src/main/java/ink/wgink/gateway/pojo/route/request/RequestHeader.java index d8958f9..74262d7 100644 --- a/src/main/java/ink/wgink/gateway/pojo/route/request/RequestHeader.java +++ b/src/main/java/ink/wgink/gateway/pojo/route/request/RequestHeader.java @@ -1,7 +1,6 @@ package ink.wgink.gateway.pojo.route.request; import ink.wgink.gateway.annoation.CheckEmptyAnnotation; -import ink.wgink.gateway.annoation.CheckNumberAnnotation; import ink.wgink.gateway.dao.route.request.IRequestHeaderDao; import ink.wgink.gateway.pojo.BasePOJO; import org.springframework.data.mongodb.core.mapping.Document; @@ -21,11 +20,10 @@ public class RequestHeader extends BasePOJO { @CheckEmptyAnnotation(name = "路由ID") private String routeId; - @CheckNumberAnnotation(name = "类型") + @CheckEmptyAnnotation(name = "类型") private String type; @CheckEmptyAnnotation(name = "名称") private String name; - @CheckEmptyAnnotation(name = "值") private String value; public String getRouteId() { diff --git a/src/main/java/ink/wgink/gateway/pojo/route/request/RequestParameter.java b/src/main/java/ink/wgink/gateway/pojo/route/request/RequestParameter.java index f456030..4a1ea48 100644 --- a/src/main/java/ink/wgink/gateway/pojo/route/request/RequestParameter.java +++ b/src/main/java/ink/wgink/gateway/pojo/route/request/RequestParameter.java @@ -24,7 +24,6 @@ public class RequestParameter extends BasePOJO { private String type; @CheckEmptyAnnotation(name = "名称") private String name; - @CheckEmptyAnnotation(name = "值") private String value; public String getRouteId() { diff --git a/src/main/java/ink/wgink/gateway/pojo/route/request/ResponseHeader.java b/src/main/java/ink/wgink/gateway/pojo/route/request/ResponseHeader.java new file mode 100644 index 0000000..5a13c7e --- /dev/null +++ b/src/main/java/ink/wgink/gateway/pojo/route/request/ResponseHeader.java @@ -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 = "名称") + 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; + } +} diff --git a/src/main/java/ink/wgink/gateway/router/route/request/RequestHeaderRouter.java b/src/main/java/ink/wgink/gateway/router/route/request/RequestHeaderRouter.java index d88b1bf..3b8750c 100644 --- a/src/main/java/ink/wgink/gateway/router/route/request/RequestHeaderRouter.java +++ b/src/main/java/ink/wgink/gateway/router/route/request/RequestHeaderRouter.java @@ -25,12 +25,11 @@ public class RequestHeaderRouter extends BaseRouter { @Bean public RouterFunction requestHeaderFunction(RequestHeaderHandler requestHeaderHandler) { - return RouterFunctions.nest(RequestPredicates.path(ISystemConst.ADMIN_ROUTER_PREFIX + "/api/request-header"), + 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.PUT("/update/{id}"), requestHeaderHandler::update) - .andRoute(RequestPredicates.GET("list"), requestHeaderHandler::list) + .andRoute(RequestPredicates.GET("list/{routeId}"), requestHeaderHandler::list) .andRoute(RequestPredicates.GET("/get/{id}"), requestHeaderHandler::get) ); } diff --git a/src/main/java/ink/wgink/gateway/router/route/request/RequestParameterRouter.java b/src/main/java/ink/wgink/gateway/router/route/request/RequestParameterRouter.java index 9d4bbfb..182e180 100644 --- a/src/main/java/ink/wgink/gateway/router/route/request/RequestParameterRouter.java +++ b/src/main/java/ink/wgink/gateway/router/route/request/RequestParameterRouter.java @@ -25,13 +25,12 @@ public class RequestParameterRouter extends BaseRouter { @Bean public RouterFunction requestParameterFunction(RequestParameterHandler requestParameterHandler) { - return RouterFunctions.nest(RequestPredicates.path(ISystemConst.ADMIN_ROUTER_PREFIX + "/api/request-parameter"), + 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.PUT("/update/{id}"), requestParameterHandler::update) - .andRoute(RequestPredicates.GET("list"), requestParameterHandler::list) - .andRoute(RequestPredicates.GET("/get{id}"), requestParameterHandler::get) + .andRoute(RequestPredicates.GET("list/{routeId}"), requestParameterHandler::list) + .andRoute(RequestPredicates.GET("/get/{id}"), requestParameterHandler::get) ); } diff --git a/src/main/java/ink/wgink/gateway/router/route/request/ResponseHeaderRouter.java b/src/main/java/ink/wgink/gateway/router/route/request/ResponseHeaderRouter.java new file mode 100644 index 0000000..72850cd --- /dev/null +++ b/src/main/java/ink/wgink/gateway/router/route/request/ResponseHeaderRouter.java @@ -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 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) + ); + } + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 3900694..0ca39e3 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -14,5 +14,5 @@ spring: logging: level: - org.springframework: error + org.springframework: debug ink.wgink: debug \ No newline at end of file diff --git a/src/main/resources/static/wg/assets/layui/modules/restajax.js b/src/main/resources/static/wg/assets/layui/modules/restajax.js index a42e4d9..70b445c 100644 --- a/src/main/resources/static/wg/assets/layui/modules/restajax.js +++ b/src/main/resources/static/wg/assets/layui/modules/restajax.js @@ -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') { diff --git a/src/main/resources/static/wg/home.html b/src/main/resources/static/wg/home.html index 077a531..57cb1ce 100644 --- a/src/main/resources/static/wg/home.html +++ b/src/main/resources/static/wg/home.html @@ -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); }, diff --git a/src/main/resources/static/wg/route/route/list.html b/src/main/resources/static/wg/route/route/list.html index e14f9df..f1b7277 100644 --- a/src/main/resources/static/wg/route/route/list.html +++ b/src/main/resources/static/wg/route/route/list.html @@ -174,7 +174,16 @@ } return rowData; } - } + }, + {field: 'headersParams', width: 188, title: '参数设置', align: 'center', fixed: 'right', + templet: function (row) { + return '
' + + '' + + '' + + '' + + '
'; + } + }, ]], 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() {} + }); + } + }); }); diff --git a/src/main/resources/static/wg/route/route/request-header/list.html b/src/main/resources/static/wg/route/route/request-header/list.html new file mode 100644 index 0000000..43d01b1 --- /dev/null +++ b/src/main/resources/static/wg/route/route/request-header/list.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+ + +
+ + + + \ No newline at end of file diff --git a/src/main/resources/static/wg/route/route/request-header/save.html b/src/main/resources/static/wg/route/route/request-header/save.html new file mode 100644 index 0000000..6641f64 --- /dev/null +++ b/src/main/resources/static/wg/route/route/request-header/save.html @@ -0,0 +1,114 @@ + + + + + + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/static/wg/route/route/request-parameter/list.html b/src/main/resources/static/wg/route/route/request-parameter/list.html new file mode 100644 index 0000000..cd76b17 --- /dev/null +++ b/src/main/resources/static/wg/route/route/request-parameter/list.html @@ -0,0 +1,227 @@ + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+ + +
+ + + + \ No newline at end of file diff --git a/src/main/resources/static/wg/route/route/request-parameter/save.html b/src/main/resources/static/wg/route/route/request-parameter/save.html new file mode 100644 index 0000000..5500bff --- /dev/null +++ b/src/main/resources/static/wg/route/route/request-parameter/save.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/static/wg/route/route/response-header/list.html b/src/main/resources/static/wg/route/route/response-header/list.html new file mode 100644 index 0000000..ddf4fb4 --- /dev/null +++ b/src/main/resources/static/wg/route/route/response-header/list.html @@ -0,0 +1,231 @@ + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+ + +
+ + + + \ No newline at end of file diff --git a/src/main/resources/static/wg/route/route/response-header/save.html b/src/main/resources/static/wg/route/route/response-header/save.html new file mode 100644 index 0000000..46c767e --- /dev/null +++ b/src/main/resources/static/wg/route/route/response-header/save.html @@ -0,0 +1,113 @@ + + + + + + + + + + + + +
+
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
+ + + + \ No newline at end of file