Commit a47b48d2 by inrgihc

优化请求参数抽取

parent 5d01d643
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
- 支持接口的token安全认证功能 - 支持接口的token安全认证功能
> 执行器支持生成token及token认证。 > 执行器支持生成token及token认证。
- 支持接口的x-www-form-urlencoded和JSON入参格式
> HTTP入参支持application/x-www-form-urlencoded及application/json等请求格式。
- 支持生成在线接口文档功能 - 支持生成在线接口文档功能
> 基于swagger-ui提供生成在线接口文档功能。 > 基于swagger-ui提供生成在线接口文档功能。
...@@ -75,8 +78,8 @@ ...@@ -75,8 +78,8 @@
- (3) SQL结果集的出参格式转换 - (3) SQL结果集的出参格式转换
> SQL查询结果集到接口出参相应的格式转换。 > SQL查询结果集到接口出参相应的格式转换。
- (4) 前端界面中拓扑结构美化 - (4) 前端界面整体美化
> 美化签到界面的拓扑结构图的展示。 > 美化界面的交互展示。
## 二、编译打包 ## 二、编译打包
...@@ -221,6 +224,12 @@ MYSQLDB_PASSWORD=123456 ...@@ -221,6 +224,12 @@ MYSQLDB_PASSWORD=123456
![009.png](docs/images/009.PNG) ![009.png](docs/images/009.PNG)
## 四、问题反馈 ![010.png](docs/images/010.PNG)
## 四、项目推荐
[dbswitch] (https://gitee.com/inrgihc/dbswitch)
## 五、问题反馈
如果您看到并使用了本工具,或您觉得本工具对您有价值,请为此项目**点个赞**,以表示对本项目的支持,多谢!如果您在使用时遇到了bug,欢迎在issue中反馈。 如果您看到并使用了本工具,或您觉得本工具对您有价值,请为此项目**点个赞**,以表示对本项目的支持,多谢!如果您在使用时遇到了bug,欢迎在issue中反馈。
...@@ -30,6 +30,9 @@ mybatis: ...@@ -30,6 +30,9 @@ mybatis:
aggressive-lazy-loading: false aggressive-lazy-loading: false
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
global-config:
banner: false
logging: logging:
config: classpath:logback-executor.xml config: classpath:logback-executor.xml
......
...@@ -63,6 +63,9 @@ mybatis: ...@@ -63,6 +63,9 @@ mybatis:
aggressive-lazy-loading: false aggressive-lazy-loading: false
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
global-config:
banner: false
logging: logging:
config: classpath:logback-gateway.xml config: classpath:logback-gateway.xml
......
...@@ -36,6 +36,9 @@ mybatis: ...@@ -36,6 +36,9 @@ mybatis:
aggressive-lazy-loading: false aggressive-lazy-loading: false
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
global-config:
banner: false
logging: logging:
config: classpath:logback-manager.xml config: classpath:logback-manager.xml
......
docs/images/001.PNG

94.5 KB | W: | H:

docs/images/001.PNG

119 KB | W: | H:

docs/images/001.PNG
docs/images/001.PNG
docs/images/001.PNG
docs/images/001.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/002.PNG

70 KB | W: | H:

docs/images/002.PNG

80.4 KB | W: | H:

docs/images/002.PNG
docs/images/002.PNG
docs/images/002.PNG
docs/images/002.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/003.PNG

63.7 KB | W: | H:

docs/images/003.PNG

88.5 KB | W: | H:

docs/images/003.PNG
docs/images/003.PNG
docs/images/003.PNG
docs/images/003.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/004.PNG

58.1 KB | W: | H:

docs/images/004.PNG

41.7 KB | W: | H:

docs/images/004.PNG
docs/images/004.PNG
docs/images/004.PNG
docs/images/004.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/005.PNG

51.9 KB | W: | H:

docs/images/005.PNG

38 KB | W: | H:

docs/images/005.PNG
docs/images/005.PNG
docs/images/005.PNG
docs/images/005.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/006.PNG

58.7 KB | W: | H:

docs/images/006.PNG

55.8 KB | W: | H:

docs/images/006.PNG
docs/images/006.PNG
docs/images/006.PNG
docs/images/006.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/007.PNG

73.1 KB | W: | H:

docs/images/007.PNG

68.2 KB | W: | H:

docs/images/007.PNG
docs/images/007.PNG
docs/images/007.PNG
docs/images/007.PNG
  • 2-up
  • Swipe
  • Onion skin
...@@ -2,6 +2,7 @@ package com.gitee.sqlrest.common.dto; ...@@ -2,6 +2,7 @@ package com.gitee.sqlrest.common.dto;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -12,7 +13,7 @@ import lombok.NoArgsConstructor; ...@@ -12,7 +13,7 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@ApiModel("按照日期的统计") @ApiModel("按照日期的统计")
public class DateCount { public class DateCount implements Serializable {
@ApiModelProperty("日期") @ApiModelProperty("日期")
private String ofDate; private String ofDate;
......
...@@ -4,6 +4,7 @@ import com.gitee.sqlrest.common.enums.ParamLocationEnum; ...@@ -4,6 +4,7 @@ import com.gitee.sqlrest.common.enums.ParamLocationEnum;
import com.gitee.sqlrest.common.enums.ParamTypeEnum; import com.gitee.sqlrest.common.enums.ParamTypeEnum;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -12,7 +13,7 @@ import lombok.NoArgsConstructor; ...@@ -12,7 +13,7 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
@ApiModel("参数信息") @ApiModel("参数信息")
public class ItemParam { public class ItemParam implements Serializable {
@ApiModelProperty("参数名") @ApiModelProperty("参数名")
private String name; private String name;
......
...@@ -2,6 +2,7 @@ package com.gitee.sqlrest.common.dto; ...@@ -2,6 +2,7 @@ package com.gitee.sqlrest.common.dto;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.util.List; import java.util.List;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -9,7 +10,7 @@ import lombok.NoArgsConstructor; ...@@ -9,7 +10,7 @@ import lombok.NoArgsConstructor;
@ApiModel(description = "分页结果") @ApiModel(description = "分页结果")
@NoArgsConstructor @NoArgsConstructor
@Data @Data
public class PageResult<E> { public class PageResult<E> implements Serializable {
@ApiModelProperty("状态码") @ApiModelProperty("状态码")
private Integer code = 0; private Integer code = 0;
......
package com.gitee.sqlrest.common.dto; package com.gitee.sqlrest.common.dto;
import java.io.Serializable;
import java.util.List; import java.util.List;
import java.util.function.Function; import java.util.function.Function;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
...@@ -12,7 +13,7 @@ import org.apache.commons.lang3.tuple.Pair; ...@@ -12,7 +13,7 @@ import org.apache.commons.lang3.tuple.Pair;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class ProductContext { public class ProductContext implements Serializable {
private int id; private int id;
private String quote; private String quote;
......
...@@ -3,13 +3,14 @@ package com.gitee.sqlrest.common.dto; ...@@ -3,13 +3,14 @@ package com.gitee.sqlrest.common.dto;
import com.gitee.sqlrest.common.exception.ResponseErrorCode; import com.gitee.sqlrest.common.exception.ResponseErrorCode;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ApiModel(description = "响应结果") @ApiModel(description = "响应结果")
@AllArgsConstructor @AllArgsConstructor
@Data @Data
public class ResultEntity<T> { public class ResultEntity<T> implements Serializable {
private static final String SUCCESS = "success"; private static final String SUCCESS = "success";
......
...@@ -6,8 +6,8 @@ import org.apache.commons.lang3.StringUtils; ...@@ -6,8 +6,8 @@ import org.apache.commons.lang3.StringUtils;
@Getter @Getter
public enum ParamTypeEnum { public enum ParamTypeEnum {
LONG("整型", "number", 0L, Long.class, (String str) -> StringUtils.isNotBlank(str) ? Long.valueOf(str) : str), LONG("整型", "number", 0L, Long.class, (String str) -> StringUtils.isNotBlank(str) ? Long.valueOf(str) : null),
DOUBLE("浮点型", "number", 0D, Double.class, (String str) -> StringUtils.isNotBlank(str) ? Double.valueOf(str) : str), DOUBLE("浮点型", "number", 0D, Double.class, (String str) -> StringUtils.isNotBlank(str) ? Double.valueOf(str) : null),
STRING("字符串", "string", "", String.class, (String str) -> str), STRING("字符串", "string", "", String.class, (String str) -> str),
DATE("日期", "string", "", String.class, (String str) -> str), DATE("日期", "string", "", String.class, (String str) -> str),
TIME("时间", "string", "", String.class, (String str) -> str), TIME("时间", "string", "", String.class, (String str) -> str),
......
package com.gitee.sqlrest.core.exec; package com.gitee.sqlrest.core.exec;
import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.io.IoUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gitee.sqlrest.common.dto.ItemParam; import com.gitee.sqlrest.common.dto.ItemParam;
import com.gitee.sqlrest.common.dto.ResultEntity; import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.common.enums.ParamLocationEnum; import com.gitee.sqlrest.common.enums.ParamLocationEnum;
...@@ -11,28 +8,29 @@ import com.gitee.sqlrest.common.enums.ParamTypeEnum; ...@@ -11,28 +8,29 @@ import com.gitee.sqlrest.common.enums.ParamTypeEnum;
import com.gitee.sqlrest.common.exception.ResponseErrorCode; import com.gitee.sqlrest.common.exception.ResponseErrorCode;
import com.gitee.sqlrest.core.driver.DriverLoadService; import com.gitee.sqlrest.core.driver.DriverLoadService;
import com.gitee.sqlrest.core.exec.engine.ApiExecutorEngineFactory; import com.gitee.sqlrest.core.exec.engine.ApiExecutorEngineFactory;
import com.gitee.sqlrest.core.exec.extractor.HttpRequestBodyExtractor;
import com.gitee.sqlrest.core.util.DataSourceUtils; import com.gitee.sqlrest.core.util.DataSourceUtils;
import com.gitee.sqlrest.persistence.dao.DataSourceDao; import com.gitee.sqlrest.persistence.dao.DataSourceDao;
import com.gitee.sqlrest.persistence.entity.ApiAssignmentEntity; import com.gitee.sqlrest.persistence.entity.ApiAssignmentEntity;
import com.gitee.sqlrest.persistence.entity.DataSourceEntity; import com.gitee.sqlrest.persistence.entity.DataSourceEntity;
import com.google.common.base.Charsets; import com.google.common.collect.Lists;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.springframework.http.MediaType;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Slf4j @Slf4j
...@@ -43,6 +41,8 @@ public class ApiExecuteService { ...@@ -43,6 +41,8 @@ public class ApiExecuteService {
private DataSourceDao dataSourceDao; private DataSourceDao dataSourceDao;
@Resource @Resource
private DriverLoadService driverLoadService; private DriverLoadService driverLoadService;
@Resource
private List<HttpRequestBodyExtractor> requestBodyExtractors;
public ResultEntity<Object> execute(ApiAssignmentEntity config, HttpServletRequest request) { public ResultEntity<Object> execute(ApiAssignmentEntity config, HttpServletRequest request) {
try { try {
...@@ -53,16 +53,16 @@ public class ApiExecuteService { ...@@ -53,16 +53,16 @@ public class ApiExecuteService {
return ResultEntity.failed(ResponseErrorCode.ERROR_RESOURCE_NOT_EXISTS, message); return ResultEntity.failed(ResponseErrorCode.ERROR_RESOURCE_NOT_EXISTS, message);
} }
List<ItemParam> invalidArgs = new ArrayList<>(); List<ItemParam> invalidArgs = new ArrayList<>();
Map<String, Object> paramValues = obtainParameterValues(request, config.getParams(), invalidArgs); Map<String, Object> paramValues = extractParameters(request, config.getParams(), invalidArgs);
if (invalidArgs.size() > 0) { if (invalidArgs.size() > 0) {
return ResultEntity.failed(ResponseErrorCode.ERROR_INVALID_ARGUMENT, convertInvalidArgs(invalidArgs)); return ResultEntity.failed(ResponseErrorCode.ERROR_INVALID_ARGUMENT, convertInvalidArgs(invalidArgs));
} }
File driverPath = driverLoadService.getVersionDriverFile(dsEntity.getType(), dsEntity.getVersion()); File driverPath = driverLoadService.getVersionDriverFile(dsEntity.getType(), dsEntity.getVersion());
HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dsEntity, driverPath.getAbsolutePath()); HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dsEntity, driverPath.getAbsolutePath());
Object result = ApiExecutorEngineFactory List<Object> results = ApiExecutorEngineFactory
.getExecutor(config.getEngine(), dataSource, dsEntity.getType()) .getExecutor(config.getEngine(), dataSource, dsEntity.getType())
.execute(config.getContextList(), paramValues, config.getNamingStrategy()); .execute(config.getContextList(), paramValues, config.getNamingStrategy());
return ResultEntity.success(result); return ResultEntity.success(results.size() > 1 ? results : results.get(0));
} catch (Throwable t) { } catch (Throwable t) {
return ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(t)); return ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(t));
} }
...@@ -74,13 +74,13 @@ public class ApiExecuteService { ...@@ -74,13 +74,13 @@ public class ApiExecuteService {
).collect(Collectors.joining(";")); ).collect(Collectors.joining(";"));
} }
private Map<String, Object> obtainParameterValues(HttpServletRequest request, List<ItemParam> params, private Map<String, Object> extractParameters(HttpServletRequest request, List<ItemParam> params,
List<ItemParam> invalidArgs) { List<ItemParam> invalidArgs) throws IOException {
if (CollectionUtils.isEmpty(params)) { if (CollectionUtils.isEmpty(params)) {
return Collections.emptyMap(); return Collections.emptyMap();
} }
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>(params.size());
Map<String, Object> bodyMap = getRequestBodyMap(request); Map<String, Object> bodyMap = getRequestBodyMap(request);
for (ItemParam param : params) { for (ItemParam param : params) {
String name = param.getName(); String name = param.getName();
...@@ -116,10 +116,25 @@ public class ApiExecuteService { ...@@ -116,10 +116,25 @@ public class ApiExecuteService {
if (required) { if (required) {
invalidArgs.add(param); invalidArgs.add(param);
} else { } else {
map.put(name, type.getConverter().apply(defaultValue)); if (!isArray) {
map.put(name, type.getConverter().apply(defaultValue));
}
} }
} else { } else {
map.put(name, paramValue); if (isArray) {
List<Object> values = (paramValue instanceof List)
? (List) paramValue
: Lists.newArrayList(paramValue);
List<Object> hv = values
.stream().map(v -> type.getConverter().apply(v.toString()))
.collect(Collectors.toList());
map.put(name, hv);
} else {
Object targetValue = (paramValue instanceof List)
? ((List) paramValue).get(0)
: paramValue;
map.put(name, type.getConverter().apply(targetValue.toString()));
}
} }
} else { } else {
if (isArray) { if (isArray) {
...@@ -149,33 +164,15 @@ public class ApiExecuteService { ...@@ -149,33 +164,15 @@ public class ApiExecuteService {
return map; return map;
} }
public Map<String, Object> getRequestBodyMap(HttpServletRequest request) { public Map<String, Object> getRequestBodyMap(HttpServletRequest request) throws IOException {
if (null == request.getContentType() || !request.getContentType().contains("application/json")) { MediaType contentType = MediaType.parseMediaType(request.getContentType());
return Collections.emptyMap(); Charset charset = (contentType != null && contentType.getCharset() != null ?
} contentType.getCharset() : StandardCharsets.UTF_8);
for (HttpRequestBodyExtractor bodyExtractor : requestBodyExtractors) {
ObjectMapper mapper = new ObjectMapper(); if (bodyExtractor.support(contentType)) {
try { return bodyExtractor.read(charset, request.getInputStream());
String jsonString = IoUtil.read(request.getInputStream(), Charsets.UTF_8);
if (StringUtils.isBlank(jsonString)) {
return Collections.emptyMap();
}
Map<String, Object> resultMap = new HashMap<>();
JsonNode rootNode = mapper.readTree(jsonString);
if (!rootNode.isContainerNode()) {
return Collections.emptyMap();
}
Iterator<Entry<String, JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> entry = fields.next();
JsonNode jsonNode = entry.getValue();
Object value = mapper.convertValue(jsonNode, Object.class);
resultMap.put(entry.getKey(), value);
} }
return resultMap;
} catch (IOException e) {
throw new RuntimeException(e);
} }
return Collections.emptyMap();
} }
} }
...@@ -7,5 +7,5 @@ import java.util.Map; ...@@ -7,5 +7,5 @@ import java.util.Map;
public interface ApiExecutorEngine { public interface ApiExecutorEngine {
Object execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy); List<Object> execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy);
} }
...@@ -87,7 +87,7 @@ public class ScriptExecutorService extends AbstractExecutorEngine { ...@@ -87,7 +87,7 @@ public class ScriptExecutorService extends AbstractExecutorEngine {
} }
@Override @Override
public Object execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy) { public List<Object> execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy) {
EnvVarModule envModule = SpringUtil.getBean(EnvVarModule.class); EnvVarModule envModule = SpringUtil.getBean(EnvVarModule.class);
DbVarModule dbModule = new DbVarModule(dataSource, productType, params, strategy); DbVarModule dbModule = new DbVarModule(dataSource, productType, params, strategy);
......
...@@ -25,7 +25,7 @@ public class SqlExecutorService extends AbstractExecutorEngine { ...@@ -25,7 +25,7 @@ public class SqlExecutorService extends AbstractExecutorEngine {
} }
@Override @Override
public Object execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy) { public List<Object> execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy) {
List<Object> dataList = new ArrayList<>(); List<Object> dataList = new ArrayList<>();
Configuration cfg = new Configuration(); Configuration cfg = new Configuration();
try (Connection connection = this.dataSource.getConnection()) { try (Connection connection = this.dataSource.getConnection()) {
...@@ -39,7 +39,7 @@ public class SqlExecutorService extends AbstractExecutorEngine { ...@@ -39,7 +39,7 @@ public class SqlExecutorService extends AbstractExecutorEngine {
dataList.add(SqlJdbcUtils.execute(productType, connection, sqlMeta, strategy, page, size)); dataList.add(SqlJdbcUtils.execute(productType, connection, sqlMeta, strategy, page, size));
} }
connection.commit(); connection.commit();
return scripts.size() > 1 ? dataList : dataList.stream().findFirst().orElse(null); return dataList;
} catch (Exception e) { } catch (Exception e) {
try { try {
connection.rollback(); connection.rollback();
......
package com.gitee.sqlrest.core.exec.extractor;
import com.google.common.collect.Lists;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletInputStream;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StreamUtils;
import org.springframework.util.StringUtils;
@Service
public class FormHttpRequestBodyExtractor implements HttpRequestBodyExtractor {
private static final String COMMA = ",";
private List<MediaType> supportedMediaTypes = Lists.newArrayList(
MediaType.APPLICATION_FORM_URLENCODED,
MediaType.MULTIPART_FORM_DATA, MediaType.MULTIPART_MIXED
);
@Override
public boolean support(MediaType mediaType) {
if (mediaType == null) {
return true;
}
for (MediaType supportedMediaType : supportedMediaTypes) {
if (supportedMediaType.getType().equalsIgnoreCase("multipart")) {
continue;
}
if (supportedMediaType.includes(mediaType)) {
return true;
}
}
return false;
}
@Override
public Map<String, Object> read(Charset charset, ServletInputStream inputStream) {
try {
String body = StreamUtils.copyToString(inputStream, charset);
String[] pairs = StringUtils.tokenizeToStringArray(body, "&");
MultiValueMap<String, String> mapValues = new LinkedMultiValueMap<>(pairs.length);
for (String pair : pairs) {
int idx = pair.indexOf('=');
if (idx == -1) {
mapValues.add(URLDecoder.decode(pair, charset.name()), null);
} else {
String name = URLDecoder.decode(pair.substring(0, idx), charset.name());
String value = pair.substring(idx + 1);
if (null != value && value.contains(COMMA)) {
for (String v : value.split(COMMA)) {
mapValues.add(name, URLDecoder.decode(v, charset.name()));
}
} else {
mapValues.add(name, value);
}
}
}
return new HashMap<>(mapValues);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
package com.gitee.sqlrest.core.exec.extractor;
import java.nio.charset.Charset;
import java.util.Map;
import javax.servlet.ServletInputStream;
import org.springframework.http.MediaType;
public interface HttpRequestBodyExtractor {
boolean support(MediaType mediaType);
Map<String, Object> read(Charset charset, ServletInputStream inputStream);
}
package com.gitee.sqlrest.core.exec.extractor;
import cn.hutool.core.io.IoUtil;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.ServletInputStream;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
@Service
public class JsonHttpRequestBodyExtractor implements HttpRequestBodyExtractor {
private List<MediaType> supportedMediaTypes = Lists.newArrayList(
MediaType.APPLICATION_JSON
);
private ObjectMapper objectMapper = new ObjectMapper();
public JsonHttpRequestBodyExtractor() {
objectMapper.configure(DeserializationFeature.USE_LONG_FOR_INTS, true);
}
@Override
public boolean support(MediaType mediaType) {
if (mediaType == null) {
return false;
}
for (MediaType supportedMediaType : supportedMediaTypes) {
if (supportedMediaType.includes(mediaType)) {
return true;
}
}
return false;
}
@Override
public Map<String, Object> read(Charset charset, ServletInputStream inputStream) {
try {
String jsonString = IoUtil.read(inputStream, charset);
if (StringUtils.isBlank(jsonString)) {
return Collections.emptyMap();
}
Map<String, Object> resultMap = new HashMap<>();
JsonNode rootNode = objectMapper.readTree(jsonString);
if (!rootNode.isContainerNode()) {
return Collections.emptyMap();
}
Iterator<Entry<String, JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> entry = fields.next();
JsonNode jsonNode = entry.getValue();
Object value = objectMapper.convertValue(jsonNode, Object.class);
resultMap.put(entry.getKey(), value);
}
return resultMap;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
...@@ -157,10 +157,10 @@ public class ApiAssignmentService { ...@@ -157,10 +157,10 @@ public class ApiAssignmentService {
ResultEntity entity; ResultEntity entity;
try { try {
HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dataSourceEntity, driverPath.getAbsolutePath()); HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dataSourceEntity, driverPath.getAbsolutePath());
Object result = ApiExecutorEngineFactory List<Object> results = ApiExecutorEngineFactory
.getExecutor(request.getEngine(), dataSource, dataSourceEntity.getType()) .getExecutor(request.getEngine(), dataSource, dataSourceEntity.getType())
.execute(scripts, params, request.getNamingStrategy()); .execute(scripts, params, request.getNamingStrategy());
entity = ResultEntity.success(result); entity = ResultEntity.success(results.size() > 1 ? results : results.get(0));
} catch (Exception e) { } catch (Exception e) {
entity = ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(e)); entity = ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(e));
} }
...@@ -186,20 +186,6 @@ public class ApiAssignmentService { ...@@ -186,20 +186,6 @@ public class ApiAssignmentService {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT,
"Request with GET/HEAD method cannot have body."); "Request with GET/HEAD method cannot have body.");
} }
} else {
if ("application/json".equals(request.getContentType())) {
if (request.getParams().stream().filter(i -> ParamLocationEnum.REQUEST_HEADER != i.getLocation())
.anyMatch(i -> ParamLocationEnum.REQUEST_BODY != i.getLocation())) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT,
"Request with 'application/json' content-type must use body parameter.");
}
} else {
if (request.getParams().stream().filter(i -> ParamLocationEnum.REQUEST_HEADER != i.getLocation())
.anyMatch(i -> ParamLocationEnum.REQUEST_FORM != i.getLocation())) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT,
"Request with '" + request.getContentType() + "' content-type must use form parameter.");
}
}
} }
} }
if (CollectionUtils.isEmpty(request.getContextList())) { if (CollectionUtils.isEmpty(request.getContextList())) {
...@@ -262,20 +248,6 @@ public class ApiAssignmentService { ...@@ -262,20 +248,6 @@ public class ApiAssignmentService {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT,
"Request with GET/HEAD method cannot have body."); "Request with GET/HEAD method cannot have body.");
} }
} else {
if ("application/json".equals(request.getContentType())) {
if (request.getParams().stream().filter(i -> ParamLocationEnum.REQUEST_HEADER != i.getLocation())
.anyMatch(i -> ParamLocationEnum.REQUEST_BODY != i.getLocation())) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT,
"Request with 'application/json' content-type must use body parameter.");
}
} else {
if (request.getParams().stream().filter(i -> ParamLocationEnum.REQUEST_HEADER != i.getLocation())
.anyMatch(i -> ParamLocationEnum.REQUEST_FORM != i.getLocation())) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT,
"Request with '" + request.getContentType() + "' content-type must use form parameter.");
}
}
} }
} }
if (null == request.getNamingStrategy()) { if (null == request.getNamingStrategy()) {
......
...@@ -30,6 +30,9 @@ mybatis: ...@@ -30,6 +30,9 @@ mybatis:
aggressive-lazy-loading: false aggressive-lazy-loading: false
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
global-config:
banner: false
logging: logging:
config: classpath:logback-executor.xml config: classpath:logback-executor.xml
......
...@@ -63,6 +63,9 @@ mybatis: ...@@ -63,6 +63,9 @@ mybatis:
aggressive-lazy-loading: false aggressive-lazy-loading: false
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
global-config:
banner: false
logging: logging:
config: classpath:logback-gateway.xml config: classpath:logback-gateway.xml
......
...@@ -39,18 +39,14 @@ ...@@ -39,18 +39,14 @@
</template> </template>
<el-table-column property="driverVersion" <el-table-column property="driverVersion"
label="驱动版本号" label="驱动版本号"
min-width="15%"></el-table-column> min-width="20%"></el-table-column>
<el-table-column property="driverClass" <el-table-column property="driverClass"
label="驱动类名" label="驱动类名"
min-width="20%"></el-table-column> min-width="30%"></el-table-column>
<el-table-column property="jarFiles" <el-table-column property="jarFiles"
:formatter="formatJarFileList" :formatter="formatJarFileList"
label="驱动JAR名称" label="驱动JAR名称"
min-width="30%"></el-table-column> min-width="40%"></el-table-column>
<el-table-column property="driverPath"
label="驱动版本路径"
min-width="50%"></el-table-column>
</el-table> </el-table>
</div> </div>
</div> </div>
...@@ -59,7 +55,7 @@ ...@@ -59,7 +55,7 @@
:visible.sync="dialogVisible" :visible.sync="dialogVisible"
width="40%" width="40%"
:before-close="handleClose"> :before-close="handleClose">
<span>请按照驱动路径所在的目录${DBSWITCH_HOME}/drivers下,在数据库类型为名称的目录下,以驱动版本号为名称创建目录并放置对应的驱动jar文件,然后重启即可生效。具体可参考https://gitee.com/inrgihc/dbswitch/tree/master/drivers下的目录结构。</span> <span>请按照驱动路径所在的目录${DBSWITCH_HOME}/drivers下,在数据库类型为名称的目录下,以驱动版本号为名称创建目录并放置对应的驱动jar文件,然后重启即可生效。具体可参考https://gitee.com/inrgihc/sqlrest/tree/master/drivers下的目录结构。</span>
<span></span> <span></span>
<span>特殊说明:驱动版本目录下的所有JAR必须无任何外部依赖,否则,也需将其依赖JAR一起放置到对应的目录下。</span> <span>特殊说明:驱动版本目录下的所有JAR必须无任何外部依赖,否则,也需将其依赖JAR一起放置到对应的目录下。</span>
<span slot="footer" <span slot="footer"
......
...@@ -36,6 +36,9 @@ mybatis: ...@@ -36,6 +36,9 @@ mybatis:
aggressive-lazy-loading: false aggressive-lazy-loading: false
map-underscore-to-camel-case: true map-underscore-to-camel-case: true
#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus:
global-config:
banner: false
logging: logging:
config: classpath:logback-manager.xml config: classpath:logback-manager.xml
......
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>SQLREST工具</title><link href=/static/css/app.7e1ab6e082220ffa6c8de7c8d41c355c.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.2d58d9aaeea67d24a4fa.js></script><script type=text/javascript src=/static/js/vendor.b8089f9fd73f8896df25.js></script><script type=text/javascript src=/static/js/app.f6411b5ec606284ab8a0.js></script></body></html> <!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>SQLREST工具</title><link href=/static/css/app.fe7f344bb1980454cbe37f37645f94e6.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.373873d38594fb61f409.js></script><script type=text/javascript src=/static/js/vendor.b8089f9fd73f8896df25.js></script><script type=text/javascript src=/static/js/app.f528b7ee91d3c4683835.js></script></body></html>
\ No newline at end of file \ No newline at end of file
webpackJsonp([5],{"8JWE":function(t,e){},EWRK:function(t,e,i){"use strict";var a={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticStyle:{display:"inline-block"}},["MYSQL"==t.type?i("i",{staticClass:"iconfont icon-my-SQL colored_db"}):"MARIADB"==t.type?i("i",{staticClass:"iconfont icon-MariaDB-chanpinicon colored_db"}):"ORACLE"==t.type?i("i",{staticClass:"iconfont icon-oracle-copy-png colored_db"}):"SQLSERVER"==t.type?i("i",{staticClass:"iconfont icon-SQLServer colored_db"}):"POSTGRESQL"==t.type?i("i",{staticClass:"iconfont icon-postgresql colored_db"}):"DB2"==t.type?i("i",{staticClass:"iconfont icon-DB2 colored_db"}):"HIVE"==t.type?i("i",{staticClass:"iconfont icon-hive colored_db"}):"CLICKHOUSE"==t.type?i("i",{staticClass:"iconfont icon-clickhouse2 colored_db"}):i("i",{staticClass:"iconfont icon-OTHER colored_db"})])},staticRenderFns:[]};var n=i("VU/8")({name:"databaseIcon",props:["type"]},a,!1,function(t){i("8JWE")},"data-v-b6f86cb4",null);e.a=n.exports},ltKY:function(t,e){},uOvO:function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a={data:function(){return{dialogVisible:!1,loading:!0,connectionTypes:[],versionDrivers:[],isActive:-1}},components:{databaseIcon:i("EWRK").a},methods:{loadConnectionTypes:function(){var t=this;this.$http({method:"GET",url:"/sqlrest/manager/api/v1/datasource/types"}).then(function(e){0===e.data.code?(t.connectionTypes=e.data.data,t.handleChooseClick("MYSQL",0)):e.data.message&&alert("初始化数据库类型信息失败:"+e.data.message)})},handleChooseClick:function(t,e){var i=this;this.isActive=e,this.$http.get("/sqlrest/manager/api/v1/datasource/"+t+"/drivers").then(function(t){0===t.data.code?i.versionDrivers=t.data.data:t.data.message&&alert("查询驱动版本信息失败,"+t.data.message)})},handleClose:function(t){this.$confirm("确认关闭?").then(function(e){t()}).catch(function(t){})},formatJarFileList:function(t,e){return t[e.property].join(";\n")}},created:function(){this.loadConnectionTypes()},beforeDestroy:function(){}},n={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[i("el-card",[i("div",{staticClass:"container"},[i("el-card",{staticClass:"box-card"},[i("div",{staticClass:"clearfix",attrs:{slot:"header",align:"center"},slot:"header"},[i("span",[i("b",[t._v("数据库类型列表")])])]),t._v(" "),i("div",{staticClass:"navsBox"},[i("ul",t._l(t.connectionTypes,function(e,a){return i("li",{key:a,class:{active:a==t.isActive},on:{click:function(i){return t.handleChooseClick(e.type,a)}}},[i("databaseIcon",{attrs:{type:e.type}}),t._v("\n ["+t._s(e.id)+"]"+t._s(e.type))],1)}),0)])]),t._v(" "),i("div",{staticClass:"contentBox"},[i("div",{staticStyle:{margin:"10px 5px"},attrs:{align:"right",width:"95%"}},[i("el-button",{attrs:{type:"primary",size:"mini",icon:"el-icon-document-add"},on:{click:function(e){t.dialogVisible=!0}}},[t._v("添加")])],1),t._v(" "),i("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:t.versionDrivers,size:"small",stripe:"",border:""}},[i("template",{slot:"empty"},[i("span",[t._v("单击左侧数据库类型来查看对应的驱动版本信息")])]),t._v(" "),i("el-table-column",{attrs:{property:"driverVersion",label:"驱动版本号","min-width":"15%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverClass",label:"驱动类名","min-width":"20%"}}),t._v(" "),i("el-table-column",{attrs:{property:"jarFiles",formatter:t.formatJarFileList,label:"驱动JAR名称","min-width":"30%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverPath",label:"驱动版本路径","min-width":"50%"}})],2)],1)],1)]),t._v(" "),i("el-dialog",{attrs:{title:"添加数据库驱动JAR说明",visible:t.dialogVisible,width:"40%","before-close":t.handleClose},on:{"update:visible":function(e){t.dialogVisible=e}}},[i("span",[t._v("请按照驱动路径所在的目录${DBSWITCH_HOME}/drivers下,在数据库类型为名称的目录下,以驱动版本号为名称创建目录并放置对应的驱动jar文件,然后重启即可生效。具体可参考https://gitee.com/inrgihc/dbswitch/tree/master/drivers下的目录结构。")]),t._v(" "),i("span"),t._v(" "),i("span",[t._v("特殊说明:驱动版本目录下的所有JAR必须无任何外部依赖,否则,也需将其依赖JAR一起放置到对应的目录下。")]),t._v(" "),i("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(e){t.dialogVisible=!1}}},[t._v("取 消")]),t._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:function(e){t.dialogVisible=!1}}},[t._v("确 定")])],1)])],1)},staticRenderFns:[]};var o=i("VU/8")(a,n,!1,function(t){i("ltKY")},"data-v-227a7fe7",null);e.default=o.exports}}); webpackJsonp([3],{"8JWE":function(t,e){},EWRK:function(t,e,i){"use strict";var a={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",{staticStyle:{display:"inline-block"}},["MYSQL"==t.type?i("i",{staticClass:"iconfont icon-my-SQL colored_db"}):"MARIADB"==t.type?i("i",{staticClass:"iconfont icon-MariaDB-chanpinicon colored_db"}):"ORACLE"==t.type?i("i",{staticClass:"iconfont icon-oracle-copy-png colored_db"}):"SQLSERVER"==t.type?i("i",{staticClass:"iconfont icon-SQLServer colored_db"}):"POSTGRESQL"==t.type?i("i",{staticClass:"iconfont icon-postgresql colored_db"}):"DB2"==t.type?i("i",{staticClass:"iconfont icon-DB2 colored_db"}):"HIVE"==t.type?i("i",{staticClass:"iconfont icon-hive colored_db"}):"CLICKHOUSE"==t.type?i("i",{staticClass:"iconfont icon-clickhouse2 colored_db"}):i("i",{staticClass:"iconfont icon-OTHER colored_db"})])},staticRenderFns:[]};var n=i("VU/8")({name:"databaseIcon",props:["type"]},a,!1,function(t){i("8JWE")},"data-v-b6f86cb4",null);e.a=n.exports},tJup:function(t,e){},uOvO:function(t,e,i){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var a={data:function(){return{dialogVisible:!1,loading:!0,connectionTypes:[],versionDrivers:[],isActive:-1}},components:{databaseIcon:i("EWRK").a},methods:{loadConnectionTypes:function(){var t=this;this.$http({method:"GET",url:"/sqlrest/manager/api/v1/datasource/types"}).then(function(e){0===e.data.code?(t.connectionTypes=e.data.data,t.handleChooseClick("MYSQL",0)):e.data.message&&alert("初始化数据库类型信息失败:"+e.data.message)})},handleChooseClick:function(t,e){var i=this;this.isActive=e,this.$http.get("/sqlrest/manager/api/v1/datasource/"+t+"/drivers").then(function(t){0===t.data.code?i.versionDrivers=t.data.data:t.data.message&&alert("查询驱动版本信息失败,"+t.data.message)})},handleClose:function(t){this.$confirm("确认关闭?").then(function(e){t()}).catch(function(t){})},formatJarFileList:function(t,e){return t[e.property].join(";\n")}},created:function(){this.loadConnectionTypes()},beforeDestroy:function(){}},n={render:function(){var t=this,e=t.$createElement,i=t._self._c||e;return i("div",[i("el-card",[i("div",{staticClass:"container"},[i("el-card",{staticClass:"box-card"},[i("div",{staticClass:"clearfix",attrs:{slot:"header",align:"center"},slot:"header"},[i("span",[i("b",[t._v("数据库类型列表")])])]),t._v(" "),i("div",{staticClass:"navsBox"},[i("ul",t._l(t.connectionTypes,function(e,a){return i("li",{key:a,class:{active:a==t.isActive},on:{click:function(i){return t.handleChooseClick(e.type,a)}}},[i("databaseIcon",{attrs:{type:e.type}}),t._v("\n ["+t._s(e.id)+"]"+t._s(e.type))],1)}),0)])]),t._v(" "),i("div",{staticClass:"contentBox"},[i("div",{staticStyle:{margin:"10px 5px"},attrs:{align:"right",width:"95%"}},[i("el-button",{attrs:{type:"primary",size:"mini",icon:"el-icon-document-add"},on:{click:function(e){t.dialogVisible=!0}}},[t._v("添加")])],1),t._v(" "),i("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:t.versionDrivers,size:"small",stripe:"",border:""}},[i("template",{slot:"empty"},[i("span",[t._v("单击左侧数据库类型来查看对应的驱动版本信息")])]),t._v(" "),i("el-table-column",{attrs:{property:"driverVersion",label:"驱动版本号","min-width":"20%"}}),t._v(" "),i("el-table-column",{attrs:{property:"driverClass",label:"驱动类名","min-width":"30%"}}),t._v(" "),i("el-table-column",{attrs:{property:"jarFiles",formatter:t.formatJarFileList,label:"驱动JAR名称","min-width":"40%"}})],2)],1)],1)]),t._v(" "),i("el-dialog",{attrs:{title:"添加数据库驱动JAR说明",visible:t.dialogVisible,width:"40%","before-close":t.handleClose},on:{"update:visible":function(e){t.dialogVisible=e}}},[i("span",[t._v("请按照驱动路径所在的目录${DBSWITCH_HOME}/drivers下,在数据库类型为名称的目录下,以驱动版本号为名称创建目录并放置对应的驱动jar文件,然后重启即可生效。具体可参考https://gitee.com/inrgihc/sqlrest/tree/master/drivers下的目录结构。")]),t._v(" "),i("span"),t._v(" "),i("span",[t._v("特殊说明:驱动版本目录下的所有JAR必须无任何外部依赖,否则,也需将其依赖JAR一起放置到对应的目录下。")]),t._v(" "),i("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(e){t.dialogVisible=!1}}},[t._v("取 消")]),t._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:function(e){t.dialogVisible=!1}}},[t._v("确 定")])],1)])],1)},staticRenderFns:[]};var o=i("VU/8")(a,n,!1,function(t){i("tJup")},"data-v-aa5ff1a8",null);e.default=o.exports}});
//# sourceMappingURL=5.f69840e8bd74f4d4e92b.js.map //# sourceMappingURL=3.ef31773dbc0e4bd73d87.js.map
\ No newline at end of file \ No newline at end of file
webpackJsonp([21],{"4/hK":function(n,e){},"6Wpa":function(n,e){},NHnr:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=t("//Fk"),r=t.n(o),i=t("7+uW"),a={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var c=t("VU/8")({name:"App"},a,!1,function(n){t("z/cX")},"data-v-c3654c36",null).exports,u=t("/ocq");i.default.use(u.a);var l=new u.a({routes:[{path:"/",name:"首页",component:function(){return t.e(2).then(t.bind(null,"4er+"))},redirect:"/dashboard",children:[{path:"/dashboard",name:"概览",icon:"el-icon-menu",component:function(){return t.e(9).then(t.bind(null,"ARoL"))}},{path:"/datasource",name:"连接配置",icon:"el-icon-coin",component:function(){return t.e(8).then(t.bind(null,"WGg6"))},children:[{path:"/datasource/driver",name:"驱动配置",icon:"el-icon-help",component:function(){return t.e(5).then(t.bind(null,"uOvO"))}},{path:"/datasource/list",name:"连接管理",icon:"el-icon-bank-card",component:function(){return Promise.all([t.e(0),t.e(4)]).then(t.bind(null,"U0nr"))}}]},{path:"/setting",name:"系统设置",icon:"el-icon-s-tools",component:function(){return t.e(6).then(t.bind(null,"VlR1"))},children:[{path:"/setting/group",name:"授权分组",icon:"el-icon-tickets",component:function(){return Promise.all([t.e(0),t.e(17)]).then(t.bind(null,"cGhg"))}},{path:"/setting/client",name:"客户应用",icon:"el-icon-pie-chart",component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"i2vO"))}},{path:"/setting/firewall",name:"访问控制",icon:"el-icon-notebook-2",component:function(){return Promise.all([t.e(0),t.e(15)]).then(t.bind(null,"n/J7"))}},{path:"/setting/topology",name:"拓扑结构",icon:"el-icon-link",component:function(){return Promise.all([t.e(0),t.e(10)]).then(t.bind(null,"aSAZ"))}}]},{path:"/interface",name:"接口管理",icon:"el-icon-paperclip",component:function(){return t.e(7).then(t.bind(null,"zsKB"))},children:[{path:"/interface/module",name:"模块管理",icon:"el-icon-folder",component:function(){return Promise.all([t.e(0),t.e(16)]).then(t.bind(null,"BOPB"))}},{path:"/interface/list",name:"接口配置",icon:"el-icon-refrigerator",component:function(){return t.e(13).then(t.bind(null,"6PtB"))}}]},{path:"/aboutme",name:"关于系统",icon:"el-icon-s-custom",component:function(){return t.e(1).then(t.bind(null,"AEfp"))}},{path:"/user/self",name:"个人中心",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(3)]).then(t.bind(null,"nqIE"))}},{path:"/interface/create",name:"创建任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(19)]).then(t.bind(null,"5fz/"))}},{path:"/interface/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"DuIM"))}},{path:"/interface/detail",name:"查看任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(11)]).then(t.bind(null,"+sv1"))}}]},{path:"/login",name:"登录",component:function(){return Promise.all([t.e(0),t.e(18)]).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),d=t.n(p).a.create();d.interceptors.request.use(function(n){return n.url=""+n.url,n});var s=d,h=t("zL8q"),m=t.n(h),f=(t("muQq"),t("6Wpa"),t("tvR6"),t("XLwt")),b=t("E5Az"),v=t.n(b);t("4/hK");i.default.use(v.a),i.default.use(s),i.default.use(m.a),i.default.prototype.$http=s,i.default.config.productionTip=!1,i.default.prototype.$echarts=f,s.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return r.a.reject(n)}),s.interceptors.response.use(function(n){return!n.data||401!==n.data.code&&403!==n.data.code&&404!==n.data.code||l.push({path:"/login"}),n},function(n){return r.a.reject(n.response)}),new i.default({el:"#app",router:l,components:{App:c},template:"<App/>"})},muQq:function(n,e){},tvR6:function(n,e){},"z/cX":function(n,e){}},["NHnr"]); webpackJsonp([21],{"4/hK":function(n,e){},"6Wpa":function(n,e){},NHnr:function(n,e,t){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o=t("//Fk"),r=t.n(o),i=t("7+uW"),a={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var c=t("VU/8")({name:"App"},a,!1,function(n){t("z/cX")},"data-v-c3654c36",null).exports,u=t("/ocq");i.default.use(u.a);var l=new u.a({routes:[{path:"/",name:"首页",component:function(){return t.e(2).then(t.bind(null,"4er+"))},redirect:"/dashboard",children:[{path:"/dashboard",name:"概览",icon:"el-icon-menu",component:function(){return t.e(9).then(t.bind(null,"ARoL"))}},{path:"/datasource",name:"连接配置",icon:"el-icon-coin",component:function(){return t.e(8).then(t.bind(null,"WGg6"))},children:[{path:"/datasource/driver",name:"驱动配置",icon:"el-icon-help",component:function(){return t.e(3).then(t.bind(null,"uOvO"))}},{path:"/datasource/list",name:"连接管理",icon:"el-icon-bank-card",component:function(){return Promise.all([t.e(0),t.e(5)]).then(t.bind(null,"U0nr"))}}]},{path:"/setting",name:"系统设置",icon:"el-icon-s-tools",component:function(){return t.e(6).then(t.bind(null,"VlR1"))},children:[{path:"/setting/group",name:"授权分组",icon:"el-icon-tickets",component:function(){return Promise.all([t.e(0),t.e(17)]).then(t.bind(null,"cGhg"))}},{path:"/setting/client",name:"客户应用",icon:"el-icon-pie-chart",component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"i2vO"))}},{path:"/setting/firewall",name:"访问控制",icon:"el-icon-notebook-2",component:function(){return Promise.all([t.e(0),t.e(15)]).then(t.bind(null,"n/J7"))}},{path:"/setting/topology",name:"拓扑结构",icon:"el-icon-link",component:function(){return Promise.all([t.e(0),t.e(10)]).then(t.bind(null,"aSAZ"))}}]},{path:"/interface",name:"接口管理",icon:"el-icon-paperclip",component:function(){return t.e(7).then(t.bind(null,"zsKB"))},children:[{path:"/interface/module",name:"模块管理",icon:"el-icon-folder",component:function(){return Promise.all([t.e(0),t.e(16)]).then(t.bind(null,"BOPB"))}},{path:"/interface/list",name:"接口配置",icon:"el-icon-refrigerator",component:function(){return t.e(13).then(t.bind(null,"6PtB"))}}]},{path:"/aboutme",name:"关于系统",icon:"el-icon-s-custom",component:function(){return t.e(1).then(t.bind(null,"AEfp"))}},{path:"/user/self",name:"个人中心",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(4)]).then(t.bind(null,"nqIE"))}},{path:"/interface/create",name:"创建任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(19)]).then(t.bind(null,"5fz/"))}},{path:"/interface/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"DuIM"))}},{path:"/interface/detail",name:"查看任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(11)]).then(t.bind(null,"+sv1"))}}]},{path:"/login",name:"登录",component:function(){return Promise.all([t.e(0),t.e(18)]).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),d=t.n(p).a.create();d.interceptors.request.use(function(n){return n.url=""+n.url,n});var s=d,h=t("zL8q"),m=t.n(h),f=(t("muQq"),t("6Wpa"),t("tvR6"),t("XLwt")),b=t("E5Az"),v=t.n(b);t("4/hK");i.default.use(v.a),i.default.use(s),i.default.use(m.a),i.default.prototype.$http=s,i.default.config.productionTip=!1,i.default.prototype.$echarts=f,s.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return r.a.reject(n)}),s.interceptors.response.use(function(n){return!n.data||401!==n.data.code&&403!==n.data.code&&404!==n.data.code||l.push({path:"/login"}),n},function(n){return r.a.reject(n.response)}),new i.default({el:"#app",router:l,components:{App:c},template:"<App/>"})},muQq:function(n,e){},tvR6:function(n,e){},"z/cX":function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.f6411b5ec606284ab8a0.js.map //# sourceMappingURL=app.f528b7ee91d3c4683835.js.map
\ No newline at end of file \ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,a){for(var f,d,i,u=0,b=[];u<r.length;u++)d=r[u],t[d]&&b.push(t[d][0]),t[d]=0;for(f in o)Object.prototype.hasOwnProperty.call(o,f)&&(e[f]=o[f]);for(n&&n(r,o,a);b.length;)b.shift()();if(a)for(u=0;u<a.length;u++)i=c(c.s=a[u]);return i};var r={},t={22:0};function c(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,c){n=t[e]=[r,c]});n[2]=r;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+e+"."+{0:"c6b968f702956d23cafc",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"8d7b8f0b413a10853aad",4:"0fbd7bc32b56153939ab",5:"f69840e8bd74f4d4e92b",6:"8f85de06573e2a5f9562",7:"7ea6008d16a44e79a428",8:"7483ee6d3a25506eb489",9:"1f165c58c9933d0da8a7",10:"cdd03027e5c73f31170c",11:"cdde61370dec5108c322",12:"57d1188c7336fe654844",13:"cdc0bd22251263ac4669",14:"42cdbd66a7803b30c641",15:"3b3f0c03ff4fed9903cc",16:"4de955682c1f7710c7ea",17:"819547b2361d544d3b8b",18:"5e7f065a8d031847e833",19:"3936346cb7e30aa279e2"}[e]+".js";var f=setTimeout(d,12e4);function d(){a.onerror=a.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=d,o.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/",c.oe=function(e){throw console.error(e),e}}([]); !function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,o,a){for(var d,f,i,u=0,s=[];u<r.length;u++)f=r[u],t[f]&&s.push(t[f][0]),t[f]=0;for(d in o)Object.prototype.hasOwnProperty.call(o,d)&&(e[d]=o[d]);for(n&&n(r,o,a);s.length;)s.shift()();if(a)for(u=0;u<a.length;u++)i=c(c.s=a[u]);return i};var r={},t={22:0};function c(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,c){n=t[e]=[r,c]});n[2]=r;var o=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+e+"."+{0:"c6b968f702956d23cafc",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"ef31773dbc0e4bd73d87",4:"f8494b8dd039413f79c8",5:"6a80c59d0b7ae08a93a1",6:"8f85de06573e2a5f9562",7:"7ea6008d16a44e79a428",8:"7483ee6d3a25506eb489",9:"1f165c58c9933d0da8a7",10:"cdd03027e5c73f31170c",11:"cdde61370dec5108c322",12:"57d1188c7336fe654844",13:"cdc0bd22251263ac4669",14:"42cdbd66a7803b30c641",15:"3b3f0c03ff4fed9903cc",16:"4de955682c1f7710c7ea",17:"819547b2361d544d3b8b",18:"5e7f065a8d031847e833",19:"3936346cb7e30aa279e2"}[e]+".js";var d=setTimeout(f,12e4);function f(){a.onerror=a.onload=null,clearTimeout(d);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=f,o.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/",c.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.2d58d9aaeea67d24a4fa.js.map //# sourceMappingURL=manifest.373873d38594fb61f409.js.map
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment