Commit 22e478a4 by inrgihc

体验问题优化

parent 88c5ccbc
blank_issues_enabled: false # 不允许用户创建空白 Issue
contact_links:
- name: 遇到问题先去看文档!谢谢! # 外部网站名称
url: https://gitee.com/inrgihc/sqlrest/blob/master/README.md # 跳转的外部网站目标地址
about: 文档可以解决你百分之八九十的疑惑 # 跳转外部网站的描述说明
name: BUG反馈、需求或问题咨询
description: "请尽可能详细的描述问题,提供足够的上下文"
body:
- type: dropdown
id: version
attributes:
label: sqlrest版本
options:
- "1.0.0"
validations:
required: true
- type: dropdown
id: modify
attributes:
label: ISSUE类型
options:
- "故障"
- "需求"
- "咨询"
validations:
required: true
- type: dropdown
id: modify
attributes:
label: 是否有二次开发
options:
- "是"
- "否"
validations:
required: true
- type: textarea
id: desired-solution
attributes:
label: 问题描述
description: 详细描述问题:(1)对于BUG反馈,请提供相应截图和日志,对于有堆栈报错信息,请提供完整的堆栈信息,对于一句话反馈的BUG将会被无视而关闭;(2)对于需求,请尽量详细描述您的需求功能;
validations:
required: true
......@@ -207,29 +207,23 @@ MYSQLDB_PASSWORD=123456
### 2、部分系统截图
![000.png](docs/images/000.PNG)
![002.png](docs/images/001.PNG)
![001.png](docs/images/001.PNG)
![003.png](docs/images/002.PNG)
![002.png](docs/images/002.PNG)
![004.png](docs/images/003.PNG)
![003.png](docs/images/003.PNG)
![005.png](docs/images/004.PNG)
![004.png](docs/images/004.PNG)
![006.png](docs/images/005.PNG)
![005.png](docs/images/005.PNG)
![007.png](docs/images/006.PNG)
![006.png](docs/images/006.PNG)
![008.png](docs/images/007.PNG)
![007.png](docs/images/007.PNG)
![010.png](docs/images/008.PNG)
![008.png](docs/images/008.PNG)
![009.png](docs/images/009.PNG)
![010.png](docs/images/010.PNG)
![010.png](docs/images/011.PNG)
![010.png](docs/images/009.PNG)
## 四、项目推荐
......
......@@ -13,11 +13,11 @@ spring:
password: ${MYSQLDB_PASSWORD}
validation-query: SELECT 1
test-on-borrow: true
flyway:
locations: classpath:db/migration
baseline-on-migrate: true
table: SQLREST_SCHEMA_HISTORY
liquibase:
enabled: true
change-log: classpath:db/changelog/db.changelog-master.yaml
database-change-log-table: SQLREST_DB_CHANGE_LOG_RECORD
database-change-log-lock-table: SQLREST_DB_CHANGE_LOG_LOCK
sqlrest:
cache:
......
docs/images/001.PNG

119 KB | W: | H:

docs/images/001.PNG

55.2 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

55.2 KB | W: | H:

docs/images/002.PNG

70.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

70.4 KB | W: | H:

docs/images/003.PNG

41.7 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

41.7 KB | W: | H:

docs/images/004.PNG

38 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

38 KB | W: | H:

docs/images/005.PNG

55.8 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

55.8 KB | W: | H:

docs/images/006.PNG

68.2 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

68.2 KB | W: | H:

docs/images/007.PNG

48.1 KB | W: | H:

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

48.1 KB | W: | H:

docs/images/008.PNG

41.9 KB | W: | H:

docs/images/008.PNG
docs/images/008.PNG
docs/images/008.PNG
docs/images/008.PNG
  • 2-up
  • Swipe
  • Onion skin
docs/images/009.PNG

51.4 KB | W: | H:

docs/images/009.PNG

80.7 KB | W: | H:

docs/images/009.PNG
docs/images/009.PNG
docs/images/009.PNG
docs/images/009.PNG
  • 2-up
  • Swipe
  • Onion skin
......@@ -36,7 +36,10 @@ public class ResultEntity<T> implements Serializable {
}
public static ResultEntity failed(ResponseErrorCode code, String message) {
return new ResultEntity(code.getCode(), code.getMessage() + ":" + message, null);
return new ResultEntity(code.getCode(), code.getMessage() + "," + message, null);
}
public static ResultEntity failed(String message) {
return new ResultEntity(ResponseErrorCode.ERROR_INTERNAL_ERROR.getCode(), message, null);
}
}
......@@ -46,8 +46,10 @@ public class SqlExecutorService extends AbstractExecutorEngine {
} catch (SQLException se) {
log.warn("Failed to call jdbc Connection::rollback(): {}", se.getMessage(), se);
}
throw new RuntimeException(e);
throw e;
}
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
}
......
......@@ -53,6 +53,7 @@ import java.util.stream.Stream;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
......@@ -150,13 +151,17 @@ public class ApiAssignmentService {
String paramName = entry.getKey();
List<ParamValue> value = entry.getValue();
ParamTypeEnum type = value.get(0).getType();
if (value.get(0).getIsArray()) {
List<Object> values = value.stream().map(ParamValue::getValue)
.map(s -> type.getConverter().apply(s))
.collect(Collectors.toList());
params.put(paramName, values);
} else {
params.put(paramName, type.getConverter().apply(value.get(0).getValue()));
try {
if (value.get(0).getIsArray()) {
List<Object> values = value.stream().map(ParamValue::getValue)
.map(s -> type.getConverter().apply(s))
.collect(Collectors.toList());
params.put(paramName, values);
} else {
params.put(paramName, type.getConverter().apply(value.get(0).getValue()));
}
} catch (Exception e) {
throw new RuntimeException(String.format("[%s] value type invalid, %s", paramName, e.getMessage()));
}
}
}
......@@ -175,9 +180,13 @@ public class ApiAssignmentService {
.execute(scripts, params, request.getNamingStrategy());
Object answer = results.size() > 1 ? results : results.get(0);
Map<String, ParamTypeEnum> types = JacksonUtils.parseFieldTypes(results);
entity = ResultEntity.success(ImmutableMap.of("answer", answer, "types", types));
if (MapUtils.isNotEmpty(types)) {
entity = ResultEntity.success(ImmutableMap.of("answer", answer, "types", types));
} else {
entity = ResultEntity.failed("No result data set!");
}
} catch (Exception e) {
entity = ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(e));
entity = ResultEntity.failed(ExceptionUtil.getMessage(e));
}
response.setStatus(HttpServletResponse.SC_OK);
......
......@@ -15,6 +15,7 @@ import java.util.Collections;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
public final class JacksonUtils {
......@@ -57,16 +58,25 @@ public final class JacksonUtils {
parseFieldTypes("", (Map) obj, results);
} else if (obj instanceof Collection) {
Collection collection = (Collection) obj;
if (CollectionUtils.isEmpty(collection)) {
return results;
}
Object item = collection.stream().findFirst().get();
if (item instanceof Map) {
parseFieldTypes("", (Map) item, results);
} else if (item instanceof Collection) {
Collection subCollection = (Collection) item;
if (CollectionUtils.isEmpty(subCollection)) {
return results;
}
Object subItem = subCollection.stream().findFirst().get();
if (subItem instanceof Map) {
parseFieldTypes("", (Map) subItem, results);
} else if (subItem instanceof Collection) {
Collection thSubCollection = (Collection) subItem;
if (CollectionUtils.isEmpty(thSubCollection)) {
return results;
}
Object thSubItem = thSubCollection.stream().findFirst().get();
if (thSubItem instanceof Map) {
parseFieldTypes("", (Map) thSubItem, results);
......
......@@ -158,7 +158,7 @@
<outputDirectory>lib/common</outputDirectory>
<excludes>
<exclude>sqlrest-manager-*.jar</exclude>
<exclude>flyway-core-*.jar</exclude>
<exclude>liquibase-core-*.jar</exclude>
<exclude>spring-boot-starter-tomcat-*.jar</exclude>
<exclude>spring-boot-starter-web-*.jar</exclude>
<exclude>tomcat-embed-websocket-*.jar</exclude>
......@@ -187,7 +187,7 @@
<outputDirectory>lib/manager</outputDirectory>
<includes>
<include>sqlrest-manager-*.jar</include>
<include>flyway-core-*.jar</include>
<include>liquibase-core-*.jar</include>
<include>spring-cloud-netflix-eureka-server-*.jar</include>
<include>spring-cloud-starter-netflix-eureka-server-*.jar</include>
</includes>
......
......@@ -6,12 +6,15 @@ import com.gitee.sqlrest.core.gateway.FirewallFilterService;
import com.gitee.sqlrest.common.dto.ResultEntity;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.event.EventListener;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
......@@ -23,6 +26,17 @@ public class ClientAddressFilter implements GlobalFilter, Ordered {
@Resource
private FirewallFilterService firewallFilterService;
/*每30秒执行一次*/
@EventListener(ApplicationReadyEvent.class)
@Scheduled(cron = "${cron.firewall.expression:0/30 0 * * * ?}")
public void loadFlowRules() {
try {
firewallFilterService.refresh();
} catch (Exception e) {
log.error("load firewall rules failed:{}", e.getMessage(), e);
}
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
......
package com.gitee.sqlrest.gateway.filter;
import com.gitee.sqlrest.core.gateway.FirewallFilterService;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class FirewallRefreshService {
@Resource
private FirewallFilterService firewallFilterService;
/*每30秒执行一次*/
@EventListener(ApplicationReadyEvent.class)
@Scheduled(cron = "${cron.firewall.expression:0/30 0 * * * ?}")
public void loadFlowRules() {
try {
firewallFilterService.refresh();
} catch (Exception e) {
log.error("load firewall rules failed:{}", e.getMessage(), e);
}
}
}
......@@ -502,11 +502,20 @@ export default {
this.$http.get(
"/sqlrest/manager/api/v1/datasource/test/" + row.id
).then(res => {
//console.log(res);
if (0 === res.data.code) {
alert("测试连接成功!");
this.$alert("测试连接成功!", "提示信息",
{
confirmButtonText: "确定",
type: "success"
}
);
} else {
alert("测试连接失败," + res.data.message);
this.$alert(res.data.message, "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
}
});
},
......@@ -518,7 +527,6 @@ export default {
let driverClass = "";
if (this.databaseType.length > 0) {
for (let i = 0; i < this.databaseType.length; i++) {
//console.log(this.databaseType[i])
if (this.databaseType[i].type == this.createform.type) {
driverClass = this.databaseType[i].driver;
break;
......@@ -550,11 +558,21 @@ export default {
this.createform = {};
this.loadData();
} else {
alert("添加连接信息失败:" + res.data.message);
this.$alert(res.data.message, "添加连接信息失败",
{
confirmButtonText: "确定",
type: "error"
}
);
}
});
} else {
alert("请检查输入");
this.$alert("请检查输入", "提示信息",
{
confirmButtonText: "确定",
type: "info"
}
);
}
});
},
......@@ -596,7 +614,6 @@ export default {
let driverClass = "";
if (this.databaseType.length > 0) {
for (let i = 0; i < this.databaseType.length; i++) {
//console.log(this.databaseType[i])
if (this.databaseType[i].type == this.updateform.type) {
driverClass = this.databaseType[i].driver;
break;
......@@ -629,11 +646,21 @@ export default {
this.loadData();
this.updateform = {};
} else {
alert("修改连接信息失败:" + res.data.message);
this.$alert(res.data.message, "修改连接信息失败",
{
confirmButtonText: "确定",
type: "error"
}
);
}
});
} else {
alert("请检查输入");
this.$alert("请检查输入", "提示信息",
{
confirmButtonText: "确定",
type: "info"
}
);
}
});
},
......
......@@ -1034,17 +1034,6 @@ export default {
if (this.$refs.sqlEditors) {
this.$refs.sqlEditors.setTableHints(this.tableHints)
}
// if (this.$refs.scriptEditer) {
// let keywords = []
// for (let key in this.tableHints) {
// let value = this.tableHints[key]
// for (let item of value) {
// keywords.push({ meta: "数据表", caption: key + "." + item, value: key + "." + item, score: 1 });
// }
// }
// this.$refs.scriptEditer.setTableHints(keywords)
// }
return resolve(tableList);
} else {
this.$alert("加载失败,原因:" + res.data.message, '数据加载失败');
......@@ -1159,7 +1148,12 @@ export default {
res => {
if (0 === res.data.code) {
if (res.data.data && res.data.data.length === 0) {
alert("解析的入参为空")
this.$alert("解析的入参为空", "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
return
}
for (let item of res.data.data) {
......@@ -1179,7 +1173,12 @@ export default {
};
} else {
if (res.data.message) {
alert("操作失败失败:" + res.data.message);
this.$alert(res.data.message, "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
}
}
}
......@@ -1234,7 +1233,12 @@ export default {
)
}
if (!add) {
alert("已经存在分页参数了!")
this.$alert("已经存在分页参数了!", "提示信息",
{
confirmButtonText: "确定",
type: "info"
}
);
}
},
deleteInputParamsItem: function (index) {
......@@ -1265,12 +1269,22 @@ export default {
}
if (!this.createParam.dataSourceId) {
alert('请选择一个数据源来')
this.$alert('请选择一个数据源来', "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
return
}
if (this.checkSqlsOrScriptEmpty(sqls)) {
alert(isSql ? '请检查SQL窗口内容' : '请检查脚本内容')
this.$alert(isSql ? '请检查SQL窗口内容' : '请检查脚本内容', "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
} else {
if (this.isUpdatePage()) {
this.handleUpdateSave(sqls);
......@@ -1317,7 +1331,12 @@ export default {
this.$message("添加信息成功");
} else {
if (res.data.message) {
alert("操作失败失败:" + res.data.message);
this.$alert(res.data.message, "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
}
}
}
......@@ -1358,7 +1377,12 @@ export default {
this.$message("更新信息成功");
} else {
if (res.data.message) {
alert("操作失败失败:" + res.data.message);
this.$alert(res.data.message, "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
}
}
}
......@@ -1377,12 +1401,22 @@ export default {
}
if (!this.createParam.dataSourceId) {
alert('请选择一个数据源来')
this.$alert('请选择一个数据源来', "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
return
}
if (this.checkSqlsOrScriptEmpty(sqls)) {
alert(isSql ? '请检查SQL窗口内容' : '请检查脚本内容')
this.$alert(isSql ? '请检查SQL窗口内容' : '请检查脚本内容', "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
} else {
this.debugParams = []
this.inputParams.forEach(item => {
......@@ -1456,7 +1490,12 @@ export default {
}
} else {
if (res.data.message) {
alert("调试操作失败:" + res.data.message);
this.$alert(res.data.message, "错误信息",
{
confirmButtonText: "确定",
type: "error"
}
);
}
}
}
......
......@@ -29,8 +29,8 @@
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
</dependencies>
......
......@@ -13,11 +13,11 @@ spring:
password: ${MYSQLDB_PASSWORD}
validation-query: SELECT 1
test-on-borrow: true
flyway:
locations: classpath:db/migration
baseline-on-migrate: true
table: SQLREST_SCHEMA_HISTORY
liquibase:
enabled: true
change-log: classpath:db/changelog/db.changelog-master.yaml
database-change-log-table: SQLREST_DB_CHANGE_LOG_RECORD
database-change-log-lock-table: SQLREST_DB_CHANGE_LOG_LOCK
sqlrest:
cache:
......
databaseChangeLog:
- include:
file: classpath:db/changelog/log-v1.0.1.yaml
- include:
file: classpath:db/changelog/log-v1.0.2.yaml
databaseChangeLog:
- changeSet:
id: 1.0.1
author: sqlrest
runOnChange: false
changes:
- sqlFile:
encoding: UTF-8
path: db/migration/V1_0_1__system-ddl.sql
databaseChangeLog:
- changeSet:
id: 1.0.2
author: sqlrest
runOnChange: false
changes:
- sqlFile:
encoding: UTF-8
path: db/migration/V1_0_2__system-dml.sql
......@@ -58,7 +58,8 @@ CREATE TABLE `SQLREST_API_ASSIGNMENT`
`description` varchar(1024) default null comment '接口描述',
`method` varchar(16) not null default 'GET' comment '请求方法',
`path` varchar(255) not null default '' comment '请求路径',
`params` text comment '入参JSON列表',
`params` text null comment '入参JSON列表',
`outputs` text null comment '出参JSON列表',
`status` tinyint(1) not null default 0 comment '是否发布',
`open` tinyint(1) not null default 0 comment '是否公开',
`engine` varchar(16) not null default 'SQL' comment '执行引擎',
......
ALTER TABLE `SQLREST_API_ASSIGNMENT` ADD COLUMN `outputs` text NULL COMMENT '出参JSON列表' AFTER `params`;
<!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.77c1c554a49f8b100e668b153defb860.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.420bcca8a647a82f0a6d.js></script><script type=text/javascript src=/static/js/vendor.6bde4750a07bb5a2f647.js></script><script type=text/javascript src=/static/js/app.5b13ca32f61140a99ff5.js></script></body></html>
\ No newline at end of file
<!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.d72e48888783ec7888daa8507773340a.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.b20a86b3cf44ea708af0.js></script><script type=text/javascript src=/static/js/vendor.6bde4750a07bb5a2f647.js></script><script type=text/javascript src=/static/js/app.5b13ca32f61140a99ff5.js></script></body></html>
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,o){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 c)Object.prototype.hasOwnProperty.call(c,f)&&(e[f]=c[f]);for(n&&n(r,c,o);b.length;)b.shift()();if(o)for(u=0;u<o.length;u++)i=a(a.s=o[u]);return i};var r={},t={24:0};function a(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,a),t.l=!0,t.exports}a.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,a){n=t[e]=[r,a]});n[2]=r;var c=document.getElementsByTagName("head")[0],o=document.createElement("script");o.type="text/javascript",o.charset="utf-8",o.async=!0,o.timeout=12e4,a.nc&&o.setAttribute("nonce",a.nc),o.src=a.p+"static/js/"+e+"."+{0:"3ab7090c6c9be8b6bb66",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"6a80c59d0b7ae08a93a1",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"d1391c270de5a9f111c5",9:"cbdb7fa4f5180acfbb03",10:"7eeaa94fd42d34a86b92",11:"096c0f0eaf2850056b7e",12:"85287d948c440f963d32",13:"4d2138ee1bee3ad573f4",14:"429592868e75adc95933",15:"3b3f0c03ff4fed9903cc",16:"9616cfe0a4f7517b0841",17:"b4bc5fa31e227bee8651",18:"5e7f065a8d031847e833",19:"3936346cb7e30aa279e2",20:"5ef9c751035ee9a08f94",21:"d8007e7169c085e13dab"}[e]+".js";var f=setTimeout(d,12e4);function d(){o.onerror=o.onload=null,clearTimeout(f);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return o.onerror=o.onload=d,c.appendChild(o),r},a.m=e,a.c=r,a.d=function(e,n,r){a.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},a.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(n,"a",n),n},a.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},a.p="/",a.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.420bcca8a647a82f0a6d.js.map
\ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,f){for(var a,d,i,u=0,b=[];u<r.length;u++)d=r[u],t[d]&&b.push(t[d][0]),t[d]=0;for(a in c)Object.prototype.hasOwnProperty.call(c,a)&&(e[a]=c[a]);for(n&&n(r,c,f);b.length;)b.shift()();if(f)for(u=0;u<f.length;u++)i=o(o.s=f[u]);return i};var r={},t={24:0};function o(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,o),t.l=!0,t.exports}o.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,o){n=t[e]=[r,o]});n[2]=r;var c=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.timeout=12e4,o.nc&&f.setAttribute("nonce",o.nc),f.src=o.p+"static/js/"+e+"."+{0:"4146c25475a3e18df991",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"8fcbb35b45285576e78f",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"d1391c270de5a9f111c5",9:"cbdb7fa4f5180acfbb03",10:"7eeaa94fd42d34a86b92",11:"096c0f0eaf2850056b7e",12:"85287d948c440f963d32",13:"4d2138ee1bee3ad573f4",14:"429592868e75adc95933",15:"3b3f0c03ff4fed9903cc",16:"9616cfe0a4f7517b0841",17:"b4bc5fa31e227bee8651",18:"5e7f065a8d031847e833",19:"3936346cb7e30aa279e2",20:"5ef9c751035ee9a08f94",21:"d8007e7169c085e13dab"}[e]+".js";var a=setTimeout(d,12e4);function d(){f.onerror=f.onload=null,clearTimeout(a);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return f.onerror=f.onload=d,c.appendChild(f),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="/",o.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.b20a86b3cf44ea708af0.js.map
\ 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