Commit 430e0e44 authored by gaozhentao's avatar gaozhentao

新增登陆token验证功能

parent e66d2425
......@@ -50,6 +50,13 @@
</exclusions>
</dependency>
<!-- jwt -->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
<!--引入log4j2作为日志组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
......
......@@ -61,5 +61,14 @@ public class ReliabilityApi {
return manager.getAlarmLog(json);
}
@PostMapping("login")
public Map<String, Object> login(@RequestBody String json) {
return manager.login(json);
}
@PostMapping("getToken")
public Map<String, Object> getToken(@RequestBody String json) {
return manager.getToken(json);
}
}
package com.yingxin.prms.config.filter;
import com.yingxin.prms.utils.TokenUtil;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
/**
* 拦截器配置实现
*
* @author gaozhentao
* @version 1.0
* @date 2020/08/31
*/
@Component
public class TokenInterceptor implements HandlerInterceptor {
private Map<String,String> tokenList;
@Bean
public Map<String,String> getTokenList(){
tokenList = new HashMap<>();
return tokenList;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
String path = request.getServletPath();
System.out.println("path:"+path);
if(request.getMethod().equals("OPTIONS") ){
response.setStatus(HttpServletResponse.SC_OK);
return true;
}
if(path.matches("/rest/(.*)")){
response.setCharacterEncoding("utf-8");
String token = request.getHeader("token");
System.out.println("token:"+token);
System.out.println("list:"+tokenList.get("root"));
if(token != null){
for(String key : tokenList.keySet()){
if(tokenList.get(key).equals(token)){
System.out.println("1");
boolean result = TokenUtil.verify(token);
System.out.println("这里错了吗"+result);
if(result){
return true;
}
}
}
}
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
try{
JSONObject json = new JSONObject();
json.put("msg","登陆超时");
json.put("code","502");
json.put("sign","false");
response.getWriter().append(json.toString());
}catch (Exception e){
e.printStackTrace();
response.sendError(500);
return false;
}
return false;
}else{
return false;
}
}
}
package com.yingxin.prms.config.filter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ConcurrentTaskExecutor;
import org.springframework.web.servlet.config.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
/**
* 拦截器
* 跨域请求支持/token拦截
* tip:只能写在一个配置类里
* @author gaozhentao
* @version 1.0
* @date 2020/08/31
*/
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
@Autowired
private TokenInterceptor tokenInterceptor;
/**
* 配置静态访问资源
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedHeaders("*")
.allowedMethods("*")
.allowedOrigins("*");
}
@Override
public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(tokenInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/css/**")
.excludePathPatterns("/img/**")
.excludePathPatterns("/js/**")
.excludePathPatterns("/index.html")
.excludePathPatterns("/rest/rel/login");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
package com.yingxin.prms.domain;
import org.springframework.data.cassandra.core.mapping.PrimaryKey;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;
/**
* Description:
* Datetime: 2020/11/25 18:08
* Author: gaozhentao
*/
@Table(value = "admin")
public class Admin {
@PrimaryKey
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Admin{" +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
\ No newline at end of file
......@@ -70,28 +70,28 @@ public class HttpTask extends BasicTask{
boolean flag = false;
switch (hostInfo.getCluster_name()){
case "VPN方式接入服务":
flag = chenkStatusCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "token方式接入服务":
flag = checkErrorCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "日志采集服务":
flag = chenkStatusCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "核心调度服务":
flag = checkErrorCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "token核验服务":
flag = checkCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "平台业务权限配置管理服务":
flag = chenkStatusCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "权限核验服务facl":
flag = chenkStatus(responseEntity);
break;
case "账户应用管理服务":
flag = chenkStatusCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "1比1比对(图片+图片)":
flag = checkCode(responseEntity);
......@@ -103,7 +103,7 @@ public class HttpTask extends BasicTask{
flag = checkCode(responseEntity);
break;
case "1比N比对(特征)":
flag = chenkStatusCode(responseEntity);
flag = checkStatusCode(responseEntity);
break;
case "1比N比对(图片)":
flag = checkCode(responseEntity);
......@@ -111,6 +111,14 @@ public class HttpTask extends BasicTask{
case "图片生成特征值":
flag = checkCode(responseEntity);
break;
case "依图":
flag = checkCode(responseEntity);
break;
case "云从":
flag = checkCode(responseEntity);
break;
default:
flag = checkStatusCode(responseEntity);
}
if (responseEntity != null) {
insertToKairos(httpClient, hostInfo.getHost_ip(), hostInfo.getHost_port(), dur, flag);
......@@ -124,7 +132,7 @@ public class HttpTask extends BasicTask{
}
/* 针对不同服务集群 返回结果 作不同校验 */
private boolean chenkStatusCode(ResponseEntity<String> responseEntity) {
private boolean checkStatusCode(ResponseEntity<String> responseEntity) {
int statusCodeValue = responseEntity.getStatusCodeValue();
if(statusCodeValue == 200){
return true;
......
package com.yingxin.prms.service.business;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.yingxin.prms.config.filter.TokenInterceptor;
import com.yingxin.prms.domain.*;
import com.yingxin.prms.dto.*;
import com.yingxin.prms.service.asyncTask.QueryHostStatusTask;
import com.yingxin.prms.service.dao.CassandraDaoImpl;
import com.yingxin.prms.utils.TimeUtil;
import com.yingxin.prms.utils.TokenUtil;
import net.sf.json.JSONObject;
import org.kairosdb.client.HttpClient;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -28,6 +31,9 @@ public class Manager {
@Value("${ascynTaskThreadPool.clusterStatusPoolSize}")
private int THREADPOOLSIZE;
@Value("${tokeTime}")
private long tokeTime;
private final AuthModeAndHostList authModeAndHostList;
private final CassandraDaoImpl cassandraDao;
......@@ -36,6 +42,8 @@ public class Manager {
private final HttpClient httpClient;
@Autowired
private TokenInterceptor tokenInterceptor;
@Autowired
......@@ -178,6 +186,44 @@ public class Manager {
return null;
}
public Map login(String json) {
Map<String,Object>resultMap=new HashMap<>();
JSONObject jsonObject = JSONObject.fromObject(json);
String username = jsonObject.getString("username");
String password = jsonObject.getString("password");
Map<String, String> tokenList = tokenInterceptor.getTokenList();
Admin admin = cassandraDao.findByUsername(username);
String passwordNew = TimeUtil.getMD5Result(password);
if(admin!=null && admin.getPassword().equals(passwordNew)) {
String token = TokenUtil.sign(tokeTime);
System.out.println(tokeTime);
resultMap.put("flag", true);
resultMap.put("token", token);
long time = (long) (tokeTime * 0.8);
if(time>0){
resultMap.put("time", time);
}else{
resultMap.put("time", tokeTime);
}
tokenList.put(username,token);
}else{
resultMap.put("flag", false);
}
return resultMap;
}
public Map<String, Object> getToken(String json) {
Map<String, String> tokenList = tokenInterceptor.getTokenList();
JSONObject jsonObject = JSONObject.fromObject(json);
String username = jsonObject.getString("username");
Map<String,Object>resultMap=new HashMap<>();
String token = TokenUtil.sign(tokeTime);
resultMap.put("token",token);
tokenList.put(username,token);
return resultMap;
}
/*
public Map selectClusterStatus() {
List<Server_Host_Info> host_info_List = authModeAndHostList.getClusterBeMonitoredList();
......
......@@ -83,4 +83,9 @@ public class CassandraDaoImpl {
String cql="select count(*) from ctid_prof.alarm_log where state < '" +Constant.ALARM_ING+"' allow filtering";
return template.selectOne(cql,Map.class);
}
public Admin findByUsername(String username) {
String cql = "SELECT * FROM ctid_prof.admin where username = '"+username+"';";
return template.selectOne(cql,Admin.class);
}
}
......@@ -37,4 +37,8 @@ public class TimeUtil {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
public static String getMD5Result(String password){
return password.substring(12,password.length()-24);
}
}
package com.yingxin.prms.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TokenUtil {
private static final String TOKEN_SECRET="txdy"; //密钥盐
/**
* 签名生成
* @param
* @return
*/
public static String sign(long time){
String token = null;
try {
Date expiresAt = new Date(System.currentTimeMillis() + time);
token = JWT.create()
.withIssuer("prms")
.withExpiresAt(expiresAt)
// 使用了HMAC256加密算法。
.sign(Algorithm.HMAC256(TOKEN_SECRET));
} catch (Exception e){
e.printStackTrace();
}
return token;
}
/**
* 签名验证
* @param token
* @return
*/
public static boolean verify(String token){
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).withIssuer("prms").build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e){
return false;
}
}
}
......@@ -5,10 +5,14 @@ spring:
cassandra:
keyspace-name: ctid_prof
# contact-points: 192.168.189.130
contact-points: 200.102.10.11
contact-points: 192.168.189.130
# contact-points: 200.102.10.11
# contact-points: 121.22.111.251
# contact-points: 172.16.15.7
port: 9042
# port: 9002
# username:
# password:
security:
user:
name: user
......@@ -28,8 +32,9 @@ jwt:
demo:
kairosdb:
# url: "http://172.16.15.7:8080"
# url: "http://192.168.189.130:8080"
url: "http://200.102.10.11:8080"
url: "http://192.168.189.130:8080"
# url: "http://200.102.10.11:8080"
# url: "http://121.22.111.251:8080"
maxConnTotal: 50
maxConnPerRoute: 30
......@@ -43,3 +48,6 @@ alarm:
ip: "15.2.249.205"
port: 8899
systemType: 101
tokeTime: 150000
\ No newline at end of file
......@@ -8,7 +8,7 @@
<Property name="PID">????</Property>
<Property name="STD_LOG_PATTERN">%clr{%d{yyyy-MM-dd HH:mm:ss.SSS}}{faint} %clr{%5p} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n%xwEx</Property>
<!--<Property name="LOG_PATTERN">[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n</Property>-->
<Property name="LOG_PATTERN">[%d{HH:mm:ss:SSS}] [%p] - %t - %m%n</Property>
<Property name="LOG_PATTERN">[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %t - %m%n</Property>
</properties>
<appenders>
......
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>可靠性监控</title><link href=/css/app.bdbe29a4117aecac5061f5ea89d4940c.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/js/manifest.1766e3c7586055624ca0.js></script><script type=text/javascript src=/js/vendor.1a62fd43a60a688ba80d.js></script><script type=text/javascript src=/js/app.251f84d70fbb1b725f75.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>可靠性监控</title><link href=/css/app.feaf97400240cd343f15ba266fafef7f.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/js/manifest.1766e3c7586055624ca0.js></script><script type=text/javascript src=/js/vendor.1a62fd43a60a688ba80d.js></script><script type=text/javascript src=/js/app.2e6f400e976c5bf9916e.js></script></body></html>
\ No newline at end of file
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
{"version":3,"sources":["webpack:///webpack/bootstrap 0b5083cfab445fb71a86"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"js/manifest.1766e3c7586055624ca0.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0b5083cfab445fb71a86"],"sourceRoot":""}
\ No newline at end of file
{"version":3,"sources":["webpack:///webpack/bootstrap 31c2536593984a04d6be"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,IAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"js/manifest.1766e3c7586055624ca0.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 31c2536593984a04d6be"],"sourceRoot":""}
\ 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