Commit 9003b935 by inrgihc

接口异常告警

parent 94227186
...@@ -30,10 +30,19 @@ body: ...@@ -30,10 +30,19 @@ body:
- "否" - "否"
validations: validations:
required: true required: true
- type: dropdown
id: modify
attributes:
label: 是否已为项目star
options:
- "是"
- "否"
validations:
required: true
- type: textarea - type: textarea
id: desired-solution id: desired-solution
attributes: attributes:
label: 问题描述 label: 问题描述(已对项目star的提问会优先处理)
description: 详细描述问题:(1)对于BUG反馈,请提供相应截图和日志,对于有堆栈报错信息,请提供完整的堆栈信息,对于一句话反馈的BUG将会被无视而关闭;(2)对于需求,请尽量详细描述您的需求功能; description: 详细描述问题:(1)对于BUG反馈,请提供相应截图和日志,对于有堆栈报错信息,请提供完整的堆栈信息,对于一句话反馈的BUG将会被无视而关闭;(2)对于需求,请尽量详细描述您的需求功能;
validations: validations:
required: true required: true
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
> HTTP入参支持application/x-www-form-urlencoded及application/json等请求格式。 > HTTP入参支持application/x-www-form-urlencoded及application/json等请求格式。
- 接口入参出参支持基本、对象及对象等多种类型 - 接口入参出参支持基本、对象及对象等多种类型
> HTTP入参出参支持整型/浮点型/时间/日期/布尔/字符串/对象及对象等多种类型 > HTTP入参出参支持整型/浮点型/时间/日期/布尔/字符串/对象等多种类型
- 支持自动生成在线接口文档功能 - 支持自动生成在线接口文档功能
> 基于swagger-ui提供自动生成在线接口文档功能。 > 基于swagger-ui提供自动生成在线接口文档功能。
...@@ -36,6 +36,9 @@ ...@@ -36,6 +36,9 @@
- 支持接口的流量控制功能 - 支持接口的流量控制功能
> 执行器基于sentinel支持接口的流量控制功能。 > 执行器基于sentinel支持接口的流量控制功能。
- 支持接口异常触发告警功能
> 执行器简单配置即可对接已有的告警平台,支持接口的异常告警功能。
### 2、支持的数据库 ### 2、支持的数据库
- 甲骨文的Oracle - 甲骨文的Oracle
...@@ -85,10 +88,7 @@ ...@@ -85,10 +88,7 @@
- (2) 接口详情功能 - (2) 接口详情功能
> 支持接口的详细定义、数据来源、访问分析等功能 > 支持接口的详细定义、数据来源、访问分析等功能
- (3) 支持接口的异常告警 - (3) 前端界面整体美化
> 对接已有的告警系统,来支持接口的异常告警。
- (4) 前端界面整体美化
> 美化界面的交互展示,尤其是“拓扑结构”页面。 > 美化界面的交互展示,尤其是“拓扑结构”页面。
## 二、编译打包 ## 二、编译打包
...@@ -256,11 +256,15 @@ sqlrest: ...@@ -256,11 +256,15 @@ sqlrest:
![010.png](docs/images/009.PNG) ![010.png](docs/images/009.PNG)
## 四、项目推荐 ## 四、贡献参与
为了能让项目得到更好的可持续的发展,sqlrest期望获得更多的代码开发爱好者参与代码贡献,具体可参考文档说明:[贡献说明指南](https://gitee.com/inrgihc/dbswitch/blob/master/CONTRIBUTE.md)
## 五、项目推荐
[数据库迁移同步工具dbswitch] (https://gitee.com/inrgihc/dbswitch) [数据库迁移同步工具dbswitch] (https://gitee.com/inrgihc/dbswitch)
## 、问题反馈 ## 、问题反馈
如果您看到并使用了本工具,或您觉得本工具对您有价值,请为此项目**点个赞**,以表示对本项目的支持,多谢!如果您在使用时遇到了bug,欢迎在issue中反馈。也可扫描下方二维码入群讨论:(加好友请注明:"SQLREST交流") 如果您看到并使用了本工具,或您觉得本工具对您有价值,请为此项目**点个赞**,以表示对本项目的支持,多谢!如果您在使用时遇到了bug,欢迎在issue中反馈。也可扫描下方二维码入群讨论:(加好友请注明:"SQLREST交流")
......
...@@ -33,6 +33,9 @@ public class ApiAssignmentBaseResponse { ...@@ -33,6 +33,9 @@ public class ApiAssignmentBaseResponse {
@ApiModelProperty("是否公开") @ApiModelProperty("是否公开")
private Boolean open; private Boolean open;
@ApiModelProperty("是否告警")
private Boolean alarm;
@ApiModelProperty("执行引擎") @ApiModelProperty("执行引擎")
private ExecuteEngineEnum engine; private ExecuteEngineEnum engine;
......
...@@ -15,7 +15,7 @@ import lombok.experimental.SuperBuilder; ...@@ -15,7 +15,7 @@ import lombok.experimental.SuperBuilder;
public class NameValueBaseResponse { public class NameValueBaseResponse {
@ApiModelProperty("枚举至") @ApiModelProperty("枚举至")
private Enum key; private String key;
@ApiModelProperty("说明") @ApiModelProperty("说明")
private String value; private String value;
......
package com.gitee.sqlrest.core.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@ApiModel("统一告警配置")
public class TestAlarmConfigRequest {
@NotBlank(message = "endpoint不能为空")
@ApiModelProperty("接口端点")
private String endpoint;
@NotBlank(message = "contentType不能为空")
@ApiModelProperty("入参格式类型")
private String contentType;
@NotBlank(message = "inputTemplate不能为空")
@ApiModelProperty("入参模板")
private String inputTemplate;
@NotEmpty(message = "dataModel不能为空")
@ApiModelProperty("示例数据")
private List<NameValueBaseResponse> dataModel;
}
package com.gitee.sqlrest.core.dto;
import com.gitee.sqlrest.common.enums.OnOffEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@ApiModel("统一告警配置")
public class UpdateAlarmConfigRequest {
@NotNull(message = "status不能为null")
@ApiModelProperty("开启状态")
private OnOffEnum status;
@NotBlank(message = "endpoint不能为空")
@ApiModelProperty("接口端点")
private String endpoint;
@NotBlank(message = "contentType不能为空")
@ApiModelProperty("入参格式类型")
private String contentType;
@NotBlank(message = "inputTemplate不能为空")
@ApiModelProperty("入参模板")
private String inputTemplate;
}
package com.gitee.sqlrest.core.executor;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.gitee.sqlrest.common.enums.OnOffEnum;
import com.gitee.sqlrest.core.dto.NameValueBaseResponse;
import com.gitee.sqlrest.core.dto.TestAlarmConfigRequest;
import com.gitee.sqlrest.core.dto.UpdateAlarmConfigRequest;
import com.gitee.sqlrest.persistence.dao.UnifyAlarmDao;
import com.gitee.sqlrest.persistence.entity.UnifyAlarmEntity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.text.StrSubstitutor;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Slf4j
@Service
public class UnifyAlarmOpsService {
@Resource
private UnifyAlarmDao unifyAlarmDao;
public UnifyAlarmEntity getUnifyAlarmConfig() {
return unifyAlarmDao.getUnifyAlarmConfig();
}
public List<NameValueBaseResponse> getExampleDataModel() {
Map<String, String> dataModel = new HashMap<>(8);
dataModel.put("path", "/api/test/create");
dataModel.put("method", "POST");
dataModel.put("contentType", "application/json");
dataModel.put("name", "test interface for create");
dataModel.put("description", "this is description!");
dataModel.put("open", "false");
dataModel.put("clientKey", "test");
dataModel.put("ipAddr", "127.0.0.1");
dataModel.put("userAgent", "sqlrest");
dataModel.put("exception", "this is test alarm message");
List<NameValueBaseResponse> lists = new ArrayList<>();
dataModel.forEach((k, v) -> lists.add(NameValueBaseResponse.builder().key(k).value(v).build()));
return lists;
}
public void updateUnifyAlarmConfig(UpdateAlarmConfigRequest request) {
unifyAlarmDao.update(
request.getStatus(),
request.getEndpoint(),
request.getContentType(),
request.getInputTemplate());
}
public void testUnifyAlarmConfig(TestAlarmConfigRequest request) {
UnifyAlarmEntity config = UnifyAlarmEntity.builder()
.status(OnOffEnum.ON)
.endpoint(request.getEndpoint())
.contentType(request.getContentType())
.inputTemplate(request.getInputTemplate())
.build();
Map<String, String> dataModel = Optional.ofNullable(request.getDataModel())
.orElseGet(ArrayList::new).stream()
.collect(
Collectors.toMap(
NameValueBaseResponse::getKey,
NameValueBaseResponse::getValue,
(a, b) -> b));
dataModel.put("accessTime", DateUtil.now());
handleAlarm(config, dataModel);
}
public void triggerAlarm(Map<String, String> dataModel) {
UnifyAlarmEntity config = unifyAlarmDao.getUnifyAlarmConfig();
if (OnOffEnum.OFF == config.getStatus()) {
return;
}
try {
handleAlarm(config, dataModel);
} catch (Exception e) {
log.error("Send alarm message failed,{}", e.getMessage(), e);
}
}
private ResponseEntity<String> handleAlarm(UnifyAlarmEntity config, Map<String, String> dataModel) {
StrSubstitutor strSubstitutor = new StrSubstitutor(escape(dataModel));
String bodyStr = strSubstitutor.replace(config.getInputTemplate());
ResponseEntity<String> ret = sentAlarm(config, bodyStr);
if (ret.getStatusCodeValue() != HttpStatus.OK.value()) {
log.warn("Error when send alarm message http status: {} ,body: {}", ret.getStatusCode(), ret.getBody());
} else {
log.info("Send alarm message http status: {} ,body: {}", ret.getStatusCode(), ret.getBody());
}
return ret;
}
private ResponseEntity<String> sentAlarm(UnifyAlarmEntity config, String bodyStr) {
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType(config.getContentType().replace(";", "") + "; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity<String> httpEntity = new HttpEntity<>(bodyStr, headers);
RestTemplate restTemplate = new RestTemplate();
return restTemplate.exchange(config.getEndpoint(), HttpMethod.POST, httpEntity, String.class);
}
private Map<String, String> escape(Map<String, String> dataModel) {
Map<String, String> newDataModel = new HashMap<>(dataModel.size());
for (Map.Entry<String, String> entry : dataModel.entrySet()) {
newDataModel.put(entry.getKey(), JSONUtil.escape(entry.getValue()));
}
return newDataModel;
}
}
...@@ -9,6 +9,7 @@ import com.gitee.sqlrest.common.exception.ResponseErrorCode; ...@@ -9,6 +9,7 @@ import com.gitee.sqlrest.common.exception.ResponseErrorCode;
import com.gitee.sqlrest.common.exception.UnAuthorizedException; import com.gitee.sqlrest.common.exception.UnAuthorizedException;
import com.gitee.sqlrest.common.exception.UnPermissionException; import com.gitee.sqlrest.common.exception.UnPermissionException;
import com.gitee.sqlrest.common.util.TokenUtils; import com.gitee.sqlrest.common.util.TokenUtils;
import com.gitee.sqlrest.core.executor.UnifyAlarmOpsService;
import com.gitee.sqlrest.core.servlet.ClientTokenService; import com.gitee.sqlrest.core.servlet.ClientTokenService;
import com.gitee.sqlrest.core.util.ServletUtils; import com.gitee.sqlrest.core.util.ServletUtils;
import com.gitee.sqlrest.persistence.dao.ApiAssignmentDao; import com.gitee.sqlrest.persistence.dao.ApiAssignmentDao;
...@@ -17,6 +18,10 @@ import com.gitee.sqlrest.persistence.entity.ApiAssignmentEntity; ...@@ -17,6 +18,10 @@ import com.gitee.sqlrest.persistence.entity.ApiAssignmentEntity;
import com.gitee.sqlrest.persistence.mapper.AccessRecordMapper; import com.gitee.sqlrest.persistence.mapper.AccessRecordMapper;
import com.google.common.base.Charsets; import com.google.common.base.Charsets;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.Filter; import javax.servlet.Filter;
...@@ -44,6 +49,8 @@ public class AuthenticationFilter implements Filter { ...@@ -44,6 +49,8 @@ public class AuthenticationFilter implements Filter {
private ClientTokenService clientTokenService; private ClientTokenService clientTokenService;
@Resource @Resource
private AccessRecordMapper accessRecordMapper; private AccessRecordMapper accessRecordMapper;
@Resource
private UnifyAlarmOpsService unifyAlarmOpsService;
@Override @Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
...@@ -111,11 +118,13 @@ public class AuthenticationFilter implements Filter { ...@@ -111,11 +118,13 @@ public class AuthenticationFilter implements Filter {
} }
chain.doFilter(request, response); chain.doFilter(request, response);
} catch (UnAuthorizedException e) { } catch (UnAuthorizedException e) {
accessRecordEntity.setException(e.getMessage());
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
accessRecordEntity.setStatus(HttpServletResponse.SC_UNAUTHORIZED); accessRecordEntity.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
ResultEntity resultEntity = ResultEntity.failed(ResponseErrorCode.ERROR_ACCESS_FORBIDDEN, e.getMessage()); ResultEntity resultEntity = ResultEntity.failed(ResponseErrorCode.ERROR_ACCESS_FORBIDDEN, e.getMessage());
response.getWriter().append(JSONUtil.toJsonStr(resultEntity)); response.getWriter().append(JSONUtil.toJsonStr(resultEntity));
} catch (UnPermissionException e) { } catch (UnPermissionException e) {
accessRecordEntity.setException(e.getMessage());
response.setStatus(HttpServletResponse.SC_FORBIDDEN); response.setStatus(HttpServletResponse.SC_FORBIDDEN);
accessRecordEntity.setStatus(HttpServletResponse.SC_FORBIDDEN); accessRecordEntity.setStatus(HttpServletResponse.SC_FORBIDDEN);
ResultEntity resultEntity = ResultEntity.failed(ResponseErrorCode.ERROR_ACCESS_FORBIDDEN, e.getMessage()); ResultEntity resultEntity = ResultEntity.failed(ResponseErrorCode.ERROR_ACCESS_FORBIDDEN, e.getMessage());
...@@ -128,9 +137,39 @@ public class AuthenticationFilter implements Filter { ...@@ -128,9 +137,39 @@ public class AuthenticationFilter implements Filter {
accessRecordEntity.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); accessRecordEntity.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.getWriter().append(JSONUtil.toJsonStr(resultEntity)); response.getWriter().append(JSONUtil.toJsonStr(resultEntity));
} finally { } finally {
final long accessTime = accessRecordEntity.getDuration();
final int httpStatus = response.getStatus();
accessRecordEntity.setDuration(System.currentTimeMillis() - accessRecordEntity.getDuration()); accessRecordEntity.setDuration(System.currentTimeMillis() - accessRecordEntity.getDuration());
CompletableFuture.runAsync(() -> accessRecordMapper.insert(accessRecordEntity)); CompletableFuture.runAsync(() -> finishRecord(apiConfigEntity, accessRecordEntity, httpStatus, accessTime));
}
}
private void finishRecord(ApiAssignmentEntity apiConfigEntity, AccessRecordEntity accessRecord, int httpStatus,
long accessTimestamp) {
accessRecordMapper.insert(accessRecord);
if (httpStatus == HttpServletResponse.SC_OK) {
return;
} }
if (!apiConfigEntity.getAlarm()) {
return;
}
SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Map<String, String> dataModel = new HashMap<>(8);
dataModel.put("path", accessRecord.getPath());
dataModel.put("method", apiConfigEntity.getMethod().name());
dataModel.put("contentType", apiConfigEntity.getContentType());
dataModel.put("name", apiConfigEntity.getName());
dataModel.put("description", apiConfigEntity.getDescription());
dataModel.put("open", apiConfigEntity.getOpen().toString());
dataModel.put("clientKey", accessRecord.getClientKey());
dataModel.put("ipAddr", accessRecord.getIpAddr());
dataModel.put("userAgent", accessRecord.getUserAgent());
dataModel.put("exception", accessRecord.getException());
dataModel.put("accessTime", sdFormatter.format(new Date(accessTimestamp)));
unifyAlarmOpsService.triggerAlarm(dataModel);
} }
@Override @Override
......
...@@ -541,6 +541,10 @@ public class ApiAssignmentService { ...@@ -541,6 +541,10 @@ public class ApiAssignmentService {
apiAssignmentDao.makeOpen(id, open); apiAssignmentDao.makeOpen(id, open);
} }
public void makeAlarm(Long id, Boolean open) {
apiAssignmentDao.makeAlarm(id, open);
}
public void deployAssignment(Long id) { public void deployAssignment(Long id) {
apiAssignmentDao.updateStatus(id, true); apiAssignmentDao.updateStatus(id, true);
} }
......
...@@ -17,6 +17,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; ...@@ -17,6 +17,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
"com.gitee.sqlrest.core.driver", "com.gitee.sqlrest.core.driver",
"com.gitee.sqlrest.core.servlet", "com.gitee.sqlrest.core.servlet",
"com.gitee.sqlrest.core.exec", "com.gitee.sqlrest.core.exec",
"com.gitee.sqlrest.core.executor",
"com.gitee.sqlrest.cache", "com.gitee.sqlrest.cache",
"com.gitee.sqlrest.executor", "com.gitee.sqlrest.executor",
} }
......
...@@ -67,6 +67,12 @@ const constantRouter = new Router({ ...@@ -67,6 +67,12 @@ const constantRouter = new Router({
component: () => import('@/views/setting/firewall') component: () => import('@/views/setting/firewall')
}, },
{ {
path: '/setting/alarm',
name: '告警配置',
icon: "el-icon-s-comment",
component: () => import('@/views/setting/alarm')
},
{
path: '/setting/topology', path: '/setting/topology',
name: '拓扑结构', name: '拓扑结构',
icon: "el-icon-link", icon: "el-icon-link",
......
...@@ -127,6 +127,17 @@ ...@@ -127,6 +127,17 @@
</el-tooltip> </el-tooltip>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="alarm"
label="告警"
min-width="8%">
<template slot-scope="scope">
<el-tooltip :content="boolFormatAlarm(scope.row)"
placement="top">
<el-switch v-model="scope.row.alarm"
@change="hanldeAlarmStateChanged(scope.row)" />
</el-tooltip>
</template>
</el-table-column>
<el-table-column prop="createTime" <el-table-column prop="createTime"
label="创建时间" label="创建时间"
min-width="18%"></el-table-column> min-width="18%"></el-table-column>
...@@ -323,6 +334,13 @@ export default { ...@@ -323,6 +334,13 @@ export default {
return "无认证"; return "无认证";
} }
}, },
boolFormatAlarm (row) {
if (row.alarm === true) {
return "告警开启";
} else {
return "告警关闭";
}
},
hanldeOpenStateChanged (row) { hanldeOpenStateChanged (row) {
var open = true; var open = true;
if (true === row.open) { if (true === row.open) {
...@@ -340,6 +358,23 @@ export default { ...@@ -340,6 +358,23 @@ export default {
} }
}); });
}, },
hanldeAlarmStateChanged (row) {
var open = true;
if (true === row.alarm) {
open = false
}
this.$http.put(
"/sqlrest/manager/api/v1/assignment/alarm/" + row.id + "?open=" + !open
).then(res => {
if (0 === res.data.code) {
this.loadData();
} else {
if (res.data.message) {
alert("操作失败:" + res.data.message);
}
}
});
},
handleSearch: function () { handleSearch: function () {
this.loadData(); this.loadData();
}, },
......
<template>
<div>
<el-card>
<el-form label-width="200px">
<el-form-item label="告警配置">
<el-switch v-model="status"
active-color="#13ce66"
active-value="ON"
inactive-value="OFF"
active-text="开启"
inactive-text="关闭">
</el-switch>
</el-form-item>
<div v-show="status=='ON'">
<el-form-item label="接口端点">
<span slot="label"
style="display:inline-block;">
接口端点
<el-tooltip effect="dark"
content="接口端点请查阅对应的告警系统所提供的消息发送接口"
placement="bottom">
<i class='el-icon-question' />
</el-tooltip>
</span>
<el-input v-model="endpoint"
placeholder="请输入接口的路径,例如:http://127.0.0.1:8000/api/v1/message/send">
</el-input>
</el-form-item>
<el-form-item label="入参格式">
<span slot="label"
style="display:inline-block;">
入参格式
<el-tooltip effect="dark"
content="接口的入参数据格式,目前只支持Content-Type为application/json"
placement="bottom">
<i class='el-icon-question' />
</el-tooltip>
</span>
<el-select v-model="contentType">
<el-option label="application/json"
value="application/json"></el-option>
</el-select>
</el-form-item>
<el-form-item label="入参模板">
<span slot="label"
style="display:inline-block;">
入参模板
<el-tooltip effect="dark"
content="入参数据格式请查阅对应的告警系统;模板支持的所有变量参数请点击“测试”按钮查看。"
placement="bottom">
<i class='el-icon-question' />
</el-tooltip>
</span>
<el-input type="textarea"
:autosize="{ minRows: 8, maxRows: 20 }"
v-model="inputTemplate"
placeholder="请输入接口的入参内容模板,变参部分请以${xxx}占位.">
</el-input>
</el-form-item>
</div>
<el-form-item>
<el-button type="primary"
v-show="status=='ON'"
@click="handleShowTest"
plain>测试</el-button>
<el-button type="primary"
@click="handleSave"
plain>保存</el-button>
</el-form-item>
</el-form>
</el-card>
<el-dialog title="测试告警配置"
:visible.sync="testFormVisible"
:showClose="false"
:before-close="handleClose">
<el-form label-width="200px">
<el-form-item v-for="item in dataModel"
:key="item.key"
v-bind="item"
:label="`\$\{${item.key}\}`">
<el-input type="text"
:key="item.key"
v-model="item.value"
:value="item.value"> </el-input>
</el-form-item>
</el-form>
<div slot="footer"
class="dialog-footer">
<el-button type="primary"
@click="handleSendTest"
plain>测试</el-button>
<el-button type="primary"
@click="testFormVisible = false"
plain>关 闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
name: "alarm",
data () {
return {
status: "ON",
endpoint: "",
contentType: "application/json",
inputTemplate: "",
testFormVisible: false,
dataModel: {},
}
},
methods: {
loadData: function () {
this.$http.get("/sqlrest/manager/api/v1/alarm/detail").then(res => {
if (0 === res.data.code) {
this.status = res.data.data.status;
this.endpoint = res.data.data.endpoint;
this.contentType = res.data.data.contentType;
this.inputTemplate = res.data.data.inputTemplate;
} else {
alert("加载数据失败:" + res.data.message);
}
}
);
},
handleShowTest () {
this.$http.get("/sqlrest/manager/api/v1/alarm/example").then(res => {
if (0 === res.data.code) {
this.dataModel = res.data.data;
this.testFormVisible = true;
} else {
alert("加载数据失败:" + res.data.message);
return;
}
}
);
},
handleClose (done) {
},
handleSendTest () {
if (this.status === 'ON' && (!this.endpoint || /^\s*$/.test(this.endpoint))) {
alert('接口端点不能为空!')
return
}
if (this.status === 'ON' && (!this.contentType || /^\s*$/.test(this.contentType))) {
alert('入参类型必须选择!')
return
}
if (this.status === 'ON' && (!this.inputTemplate || /^\s*$/.test(this.inputTemplate))) {
alert('入参模板必须输入!')
return
}
this.$http({
method: "POST",
headers: {
'Content-Type': 'application/json'
},
url: "/sqlrest/manager/api/v1/alarm/test",
data: JSON.stringify({
endpoint: this.endpoint,
contentType: this.contentType,
inputTemplate: this.inputTemplate,
dataModel: this.dataModel
})
}).then(res => {
if (0 === res.data.code) {
this.$alert("发送测试成功,请去告警系统查看发送的告警日志信息", "提示信息",
{
confirmButtonText: "确定",
type: "info"
}
);
} else {
this.$alert(res.data.message, "提示信息",
{
confirmButtonText: "确定",
type: "error"
}
);
}
});
},
handleSave () {
if (this.status === 'ON' && (!this.endpoint || /^\s*$/.test(this.endpoint))) {
alert('接口端点不能为空!')
return
}
if (this.status === 'ON' && (!this.contentType || /^\s*$/.test(this.contentType))) {
alert('入参类型必须选择!')
return
}
if (this.status === 'ON' && (!this.inputTemplate || /^\s*$/.test(this.inputTemplate))) {
alert('入参模板必须输入!')
return
}
this.$http({
method: "POST",
headers: {
'Content-Type': 'application/json'
},
url: "/sqlrest/manager/api/v1/alarm/save",
data: JSON.stringify({
status: this.status,
endpoint: this.endpoint,
contentType: this.contentType,
inputTemplate: this.inputTemplate
})
}).then(res => {
if (0 === res.data.code) {
this.$alert("告警配置保存成功", "提示信息",
{
confirmButtonText: "确定",
type: "info"
}
);
this.loadData();
} else {
alert("保存失败:" + res.data.message);
}
});
}
},
created () {
this.loadData();
}
};
</script>
<style scoped>
.el-table {
width: 100%;
height: 100%;
}
.el-card,
.el-message {
width: 100%;
height: 100%;
overflow: auto;
}
</style>
...@@ -99,7 +99,12 @@ export default { ...@@ -99,7 +99,12 @@ export default {
}) })
}).then(res => { }).then(res => {
if (0 === res.data.code) { if (0 === res.data.code) {
this.$message("保存成功"); this.$alert("访问控制保存成功", "提示信息",
{
confirmButtonText: "确定",
type: "info"
}
);
this.loadData(); this.loadData();
} else { } else {
alert("保存失败:" + res.data.message); alert("保存失败:" + res.data.message);
......
...@@ -15,6 +15,7 @@ import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; ...@@ -15,6 +15,7 @@ import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
"com.gitee.sqlrest.persistence", "com.gitee.sqlrest.persistence",
"com.gitee.sqlrest.core.driver", "com.gitee.sqlrest.core.driver",
"com.gitee.sqlrest.core.gateway", "com.gitee.sqlrest.core.gateway",
"com.gitee.sqlrest.core.executor",
"com.gitee.sqlrest.core.service", "com.gitee.sqlrest.core.service",
"com.gitee.sqlrest.core.exec", "com.gitee.sqlrest.core.exec",
"com.gitee.sqlrest.cache", "com.gitee.sqlrest.cache",
......
...@@ -4,6 +4,7 @@ import java.util.ArrayList; ...@@ -4,6 +4,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
...@@ -22,6 +23,9 @@ public class SwaggerConfiguration { ...@@ -22,6 +23,9 @@ public class SwaggerConfiguration {
private static final String API_CONTROLLER_PACKAGE = "com.gitee.sqlrest.manager.controller"; private static final String API_CONTROLLER_PACKAGE = "com.gitee.sqlrest.manager.controller";
@Value("${sqlrest.manager.swagger.enable:true}")
private boolean enable;
@Bean @Bean
public Docket managerApi() { public Docket managerApi() {
RequestParameterBuilder ticketPar = new RequestParameterBuilder(); RequestParameterBuilder ticketPar = new RequestParameterBuilder();
...@@ -34,7 +38,7 @@ public class SwaggerConfiguration { ...@@ -34,7 +38,7 @@ public class SwaggerConfiguration {
pars.add(ticketPar.build()); pars.add(ticketPar.build());
return new Docket(DocumentationType.SWAGGER_2) return new Docket(DocumentationType.SWAGGER_2)
.enable(true) .enable(enable)
.groupName("Manager的接口") .groupName("Manager的接口")
.apiInfo(new ApiInfoBuilder() .apiInfo(new ApiInfoBuilder()
.title("Manager服务API文档") .title("Manager服务API文档")
......
...@@ -53,7 +53,7 @@ public class ApiAssignmentController { ...@@ -53,7 +53,7 @@ public class ApiAssignmentController {
.map( .map(
e -> e ->
NameValueBaseResponse.builder() NameValueBaseResponse.builder()
.key(e) .key(e.name())
.value(e.getDescription()) .value(e.getDescription())
.build() .build()
).collect(Collectors.toList()) ).collect(Collectors.toList())
...@@ -68,7 +68,7 @@ public class ApiAssignmentController { ...@@ -68,7 +68,7 @@ public class ApiAssignmentController {
.map( .map(
e -> e ->
NameValueRemarkResponse.builder() NameValueRemarkResponse.builder()
.key(e) .key(e.name())
.value(e.getDefault()) .value(e.getDefault())
.remark(e.getClassName()) .remark(e.getClassName())
.build() .build()
...@@ -124,11 +124,18 @@ public class ApiAssignmentController { ...@@ -124,11 +124,18 @@ public class ApiAssignmentController {
@ApiOperation(value = "开放") @ApiOperation(value = "开放")
@PutMapping(value = "/open/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @PutMapping(value = "/open/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity deploy(@PathVariable("id") Long id, @RequestParam("open") Boolean open) { public ResultEntity makeOpen(@PathVariable("id") Long id, @RequestParam("open") Boolean open) {
apiAssignmentService.makeOpen(id, open); apiAssignmentService.makeOpen(id, open);
return ResultEntity.success(); return ResultEntity.success();
} }
@ApiOperation(value = "告警")
@PutMapping(value = "/alarm/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity makeAlarm(@PathVariable("id") Long id, @RequestParam("open") Boolean open) {
apiAssignmentService.makeAlarm(id, open);
return ResultEntity.success();
}
@ApiOperation(value = "发布") @ApiOperation(value = "发布")
@PutMapping(value = "/deploy/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @PutMapping(value = "/deploy/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity deploy(@PathVariable("id") Long id) { public ResultEntity deploy(@PathVariable("id") Long id) {
......
package com.gitee.sqlrest.manager.controller;
import com.gitee.sqlrest.common.consts.Constants;
import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.core.dto.NameValueBaseResponse;
import com.gitee.sqlrest.core.dto.TestAlarmConfigRequest;
import com.gitee.sqlrest.core.dto.UpdateAlarmConfigRequest;
import com.gitee.sqlrest.core.executor.UnifyAlarmOpsService;
import com.gitee.sqlrest.persistence.entity.UnifyAlarmEntity;
import io.swagger.annotations.Api;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = {"告警配置接口"})
@RestController
@RequestMapping(value = Constants.MANGER_API_V1 + "/alarm")
public class UnifyAlarmController {
@Resource
private UnifyAlarmOpsService unifyAlarmOpsService;
@GetMapping(value = "/detail", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity<UnifyAlarmEntity> getUnifyAlarmConfig() {
return ResultEntity.success(unifyAlarmOpsService.getUnifyAlarmConfig());
}
@GetMapping(value = "/example", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity<List<NameValueBaseResponse>> getExampleDataModel() {
return ResultEntity.success(unifyAlarmOpsService.getExampleDataModel());
}
@PostMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity testUnifyAlarmConfig(@Valid @RequestBody TestAlarmConfigRequest request) {
unifyAlarmOpsService.testUnifyAlarmConfig(request);
return ResultEntity.success();
}
@PostMapping(value = "/save", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity saveUnifyAlarmConfig(@Valid @RequestBody UpdateAlarmConfigRequest request) {
unifyAlarmOpsService.updateUnifyAlarmConfig(request);
return ResultEntity.success();
}
}
...@@ -7,3 +7,5 @@ databaseChangeLog: ...@@ -7,3 +7,5 @@ databaseChangeLog:
file: classpath:db/changelog/log-v1.1.1.yaml file: classpath:db/changelog/log-v1.1.1.yaml
- include: - include:
file: classpath:db/changelog/log-v1.1.2.yaml file: classpath:db/changelog/log-v1.1.2.yaml
- include:
file: classpath:db/changelog/log-v1.2.1.yaml
databaseChangeLog:
- changeSet:
id: 1.2.1
author: sqlrest
runOnChange: false
changes:
- sqlFile:
encoding: UTF-8
path: db/migration/V1_2_1__system-ddl.sql
create table `SQLREST_UNIFY_ALARM` (
`id` bigint(20) not null auto_increment comment '主键id',
`status` varchar(4) not null default 'OFF' comment '状态:OFF-关闭;ON-启用',
`endpoint` varchar(256) not null comment '告警系统地址',
`content_type` varchar(128) not null comment '接口入参ContentType',
`input_template` varchar(4096) not null comment '接口入参模板',
`create_time` timestamp not null default current_timestamp comment '创建时间',
`update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间',
primary key (`id`)
) engine=InnoDB character set = utf8 comment = '统一告警参数配置';
INSERT INTO `SQLREST_UNIFY_ALARM` (`id`, `status`, `endpoint`,`content_type`, `input_template`)
VALUES ('1', 'OFF', 'http://127.0.0.1:8000/api/v1/message/send', 'application/json', '{}');
ALTER TABLE `SQLREST_API_ASSIGNMENT` ADD COLUMN `alarm` tinyint(1) not null default 0 COMMENT '是否启用告警' AFTER `open`;
<!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.c8e8a852da8f5f1a381e2a81266f662e.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.1b702ecca7669457ed71.js></script><script type=text/javascript src=/static/js/vendor.6bde4750a07bb5a2f647.js></script><script type=text/javascript src=/static/js/app.eb5ff3cb290926815e5c.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.01610e7b374c7686f6c6b1753cbd4096.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.a82bca04ec2f0cc74ba9.js></script><script type=text/javascript src=/static/js/vendor.b7c8f2fc5b656bec39f0.js></script><script type=text/javascript src=/static/js/app.4d21e57063e1c194f804.js></script></body></html>
\ No newline at end of file \ 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.
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.
webpackJsonp([13],{"RL/p":function(e,a){},"n/J7":function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var s=t("mvHQ"),o=t.n(s),r={name:"firewall",data:function(){return{status:"ON",mode:"BLACK",addresses:""}},methods:{loadData:function(){var e=this;this.$http.get("/sqlrest/manager/api/v1/firewall/detail").then(function(a){0===a.data.code?(e.status=a.data.data.status,e.mode=a.data.data.mode,e.addresses=a.data.data.addresses):alert("加载数据失败:"+a.data.message)})},modeChange:function(e){console.log(e)},handleSave:function(){var e=this;"ON"!==this.status||this.addresses&&!/^\s*$/.test(this.addresses)?this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/firewall/save",data:o()({status:this.status,mode:this.mode,addresses:this.addresses})}).then(function(a){0===a.data.code?(e.$alert("访问控制保存成功","提示信息",{confirmButtonText:"确定",type:"info"}),e.loadData()):alert("保存失败:"+a.data.message)}):alert("IP列表不能为空!")}},created:function(){this.loadData()}},l={render:function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",[t("el-card",[t("el-form",{attrs:{"label-width":"200px"}},[t("el-form-item",{attrs:{label:"访问控制"}},[t("el-switch",{attrs:{"active-color":"#13ce66","active-value":"ON","inactive-value":"OFF","active-text":"开启","inactive-text":"关闭"},model:{value:e.status,callback:function(a){e.status=a},expression:"status"}})],1),e._v(" "),t("div",{directives:[{name:"show",rawName:"v-show",value:"ON"==e.status,expression:"status=='ON'"}]},[t("el-form-item",{attrs:{label:"名单"}},[t("el-radio-group",{on:{change:e.modeChange},model:{value:e.mode,callback:function(a){e.mode=a},expression:"mode"}},[t("el-radio",{attrs:{label:"BLACK"}},[e._v("黑名单")]),e._v(" "),t("el-radio",{attrs:{label:"WHITE"}},[e._v("白名单")])],1),e._v(" "),t("el-alert",{directives:[{name:"show",rawName:"v-show",value:"BLACK"==e.mode,expression:"mode == 'BLACK'"}],attrs:{title:"除了黑名单列表中的IP禁止访问API,其他IP一律允许访问",type:"warning",closable:!1}}),e._v(" "),t("el-alert",{directives:[{name:"show",rawName:"v-show",value:"WHITE"==e.mode,expression:"mode == 'WHITE'"}],attrs:{title:"只有白名单列表中的IP才允许访问API,其他IP一律禁止访问",type:"warning",closable:!1}})],1),e._v(" "),t("el-form-item",{directives:[{name:"show",rawName:"v-show",value:"BLACK"==e.mode,expression:"mode == 'BLACK'"}],attrs:{label:"黑名单IP列表"}},[t("el-input",{attrs:{type:"textarea",autosize:{minRows:8,maxRows:20},placeholder:"每行一个IP,多个IP请用换行分隔."},model:{value:e.addresses,callback:function(a){e.addresses=a},expression:"addresses"}})],1),e._v(" "),t("el-form-item",{directives:[{name:"show",rawName:"v-show",value:"WHITE"==e.mode,expression:"mode == 'WHITE'"}],attrs:{label:"白名单IP列表"}},[t("el-input",{attrs:{type:"textarea",autosize:{minRows:8,maxRows:20},placeholder:"每行一个IP,多个IP请用换行分隔."},model:{value:e.addresses,callback:function(a){e.addresses=a},expression:"addresses"}})],1)],1),e._v(" "),t("el-form-item",[t("el-button",{attrs:{type:"primary",plain:""},on:{click:e.handleSave}},[e._v("保存")])],1)],1)],1)],1)},staticRenderFns:[]};var d=t("VU/8")(r,l,!1,function(e){t("RL/p")},"data-v-ff08f9d0",null);a.default=d.exports}});
//# sourceMappingURL=13.1ba5cd611e73c235b21b.js.map
\ No newline at end of file
webpackJsonp([13],{"+sv1":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var c={data:function(){return{}},components:{common:n("u2+N").a},methods:{},created:function(){}},o={render:function(){var t=this.$createElement;return(this._self._c||t)("common",{attrs:{isOnlyShowDetail:!0}})},staticRenderFns:[]};var a=n("VU/8")(c,o,!1,function(t){n("Htdc")},"data-v-d65c96a6",null);e.default=a.exports},Htdc:function(t,e){}}); webpackJsonp([14],{"+sv1":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var c={data:function(){return{}},components:{common:n("u2+N").a},methods:{},created:function(){}},o={render:function(){var t=this.$createElement;return(this._self._c||t)("common",{attrs:{isOnlyShowDetail:!0}})},staticRenderFns:[]};var a=n("VU/8")(c,o,!1,function(t){n("Htdc")},"data-v-d65c96a6",null);e.default=a.exports},Htdc:function(t,e){}});
//# sourceMappingURL=13.4d2138ee1bee3ad573f4.js.map //# sourceMappingURL=14.d4164f216cdc1a726926.js.map
\ No newline at end of file \ No newline at end of file
{"version":3,"sources":["webpack:///src/views/interface/detail.vue","webpack:///./src/views/interface/detail.vue?d651","webpack:///./src/views/interface/detail.vue"],"names":["detail","data","components","common","methods","created","interface_detail","render","_h","this","$createElement","_self","_c","attrs","isOnlyShowDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"4GAQAA,GACAC,KADA,WAEA,UAGAC,YAAAC,iBAAA,GACAC,WAEAC,QARA,cCLeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,UAAoBK,OAAOC,kBAAA,MAEnGC,oBCCjB,IAcAC,EAdyBC,EAAQ,OAcjCC,CACElB,EACAM,GATF,EAVA,SAAAa,GACEF,EAAQ,SAaV,kBAEA,MAUeG,EAAA,QAAAJ,EAAiB","file":"static/js/13.4d2138ee1bee3ad573f4.js","sourcesContent":["<template>\r\n <common :isOnlyShowDetail=\"true\">\r\n </common>\r\n</template>\r\n\r\n<script>\r\nimport common from '@/views/interface/common'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n }\r\n },\r\n components: { common },\r\n methods: {\r\n },\r\n created () {\r\n },\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n</style>\n\n\n// WEBPACK FOOTER //\n// src/views/interface/detail.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('common',{attrs:{\"isOnlyShowDetail\":true}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-d65c96a6\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/views/interface/detail.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true,\\\"publicPath\\\":\\\"../../\\\"}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-d65c96a6\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./detail.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./detail.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./detail.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-d65c96a6\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./detail.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-d65c96a6\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/views/interface/detail.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} {"version":3,"sources":["webpack:///src/views/interface/detail.vue","webpack:///./src/views/interface/detail.vue?d651","webpack:///./src/views/interface/detail.vue"],"names":["detail","data","components","common","methods","created","interface_detail","render","_h","this","$createElement","_self","_c","attrs","isOnlyShowDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"4GAQAA,GACAC,KADA,WAEA,UAGAC,YAAAC,iBAAA,GACAC,WAEAC,QARA,cCLeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,UAAoBK,OAAOC,kBAAA,MAEnGC,oBCCjB,IAcAC,EAdyBC,EAAQ,OAcjCC,CACElB,EACAM,GATF,EAVA,SAAAa,GACEF,EAAQ,SAaV,kBAEA,MAUeG,EAAA,QAAAJ,EAAiB","file":"static/js/14.d4164f216cdc1a726926.js","sourcesContent":["<template>\r\n <common :isOnlyShowDetail=\"true\">\r\n </common>\r\n</template>\r\n\r\n<script>\r\nimport common from '@/views/interface/common'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n }\r\n },\r\n components: { common },\r\n methods: {\r\n },\r\n created () {\r\n },\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n</style>\n\n\n// WEBPACK FOOTER //\n// src/views/interface/detail.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('common',{attrs:{\"isOnlyShowDetail\":true}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-d65c96a6\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/views/interface/detail.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true,\\\"publicPath\\\":\\\"../../\\\"}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-d65c96a6\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./detail.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./detail.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./detail.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-d65c96a6\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./detail.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-d65c96a6\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/views/interface/detail.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
\ No newline at end of file \ No newline at end of file
webpackJsonp([14],{"7dhh":function(e,t){},DuIM:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o={data:function(){return{}},components:{common:n("u2+N").a},methods:{},created:function(){}},c={render:function(){var e=this.$createElement;return(this._self._c||e)("common",{attrs:{isOnlyShowDetail:!1}})},staticRenderFns:[]};var r=n("VU/8")(o,c,!1,function(e){n("7dhh")},"data-v-be8f54dc",null);t.default=r.exports}}); webpackJsonp([15],{"7dhh":function(e,t){},DuIM:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o={data:function(){return{}},components:{common:n("u2+N").a},methods:{},created:function(){}},c={render:function(){var e=this.$createElement;return(this._self._c||e)("common",{attrs:{isOnlyShowDetail:!1}})},staticRenderFns:[]};var r=n("VU/8")(o,c,!1,function(e){n("7dhh")},"data-v-be8f54dc",null);t.default=r.exports}});
//# sourceMappingURL=14.429592868e75adc95933.js.map //# sourceMappingURL=15.12be397bb64472378b04.js.map
\ No newline at end of file \ No newline at end of file
{"version":3,"sources":["webpack:///src/views/interface/update.vue","webpack:///./src/views/interface/update.vue?acfa","webpack:///./src/views/interface/update.vue"],"names":["update","data","components","common","methods","created","interface_update","render","_h","this","$createElement","_self","_c","attrs","isOnlyShowDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"iIAQAA,GACAC,KADA,WAEA,UAGAC,YAAAC,iBAAA,GACAC,WAEAC,QARA,cCLeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,UAAoBK,OAAOC,kBAAA,MAEnGC,oBCCjB,IAcAC,EAdyBC,EAAQ,OAcjCC,CACElB,EACAM,GATF,EAVA,SAAAa,GACEF,EAAQ,SAaV,kBAEA,MAUeG,EAAA,QAAAJ,EAAiB","file":"static/js/14.429592868e75adc95933.js","sourcesContent":["<template>\r\n <common :isOnlyShowDetail=\"false\">\r\n </common>\r\n</template>\r\n\r\n<script>\r\nimport common from '@/views/interface/common'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n }\r\n },\r\n components: { common },\r\n methods: {\r\n },\r\n created () {\r\n },\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n</style>\n\n\n// WEBPACK FOOTER //\n// src/views/interface/update.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('common',{attrs:{\"isOnlyShowDetail\":false}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-be8f54dc\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/views/interface/update.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true,\\\"publicPath\\\":\\\"../../\\\"}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-be8f54dc\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./update.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./update.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./update.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-be8f54dc\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./update.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-be8f54dc\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/views/interface/update.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} {"version":3,"sources":["webpack:///src/views/interface/update.vue","webpack:///./src/views/interface/update.vue?acfa","webpack:///./src/views/interface/update.vue"],"names":["update","data","components","common","methods","created","interface_update","render","_h","this","$createElement","_self","_c","attrs","isOnlyShowDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"iIAQAA,GACAC,KADA,WAEA,UAGAC,YAAAC,iBAAA,GACAC,WAEAC,QARA,cCLeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,UAAoBK,OAAOC,kBAAA,MAEnGC,oBCCjB,IAcAC,EAdyBC,EAAQ,OAcjCC,CACElB,EACAM,GATF,EAVA,SAAAa,GACEF,EAAQ,SAaV,kBAEA,MAUeG,EAAA,QAAAJ,EAAiB","file":"static/js/15.12be397bb64472378b04.js","sourcesContent":["<template>\r\n <common :isOnlyShowDetail=\"false\">\r\n </common>\r\n</template>\r\n\r\n<script>\r\nimport common from '@/views/interface/common'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n }\r\n },\r\n components: { common },\r\n methods: {\r\n },\r\n created () {\r\n },\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n</style>\n\n\n// WEBPACK FOOTER //\n// src/views/interface/update.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('common',{attrs:{\"isOnlyShowDetail\":false}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-be8f54dc\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/views/interface/update.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true,\\\"publicPath\\\":\\\"../../\\\"}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-be8f54dc\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./update.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./update.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./update.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-be8f54dc\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./update.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-be8f54dc\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/views/interface/update.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
\ No newline at end of file \ No newline at end of file
webpackJsonp([16],{KYkU:function(e,a){},"n/J7":function(e,a,t){"use strict";Object.defineProperty(a,"__esModule",{value:!0});var s=t("mvHQ"),o=t.n(s),r={name:"firewall",data:function(){return{status:"ON",mode:"BLACK",addresses:""}},methods:{loadData:function(){var e=this;this.$http.get("/sqlrest/manager/api/v1/firewall/detail").then(function(a){0===a.data.code?(e.status=a.data.data.status,e.mode=a.data.data.mode,e.addresses=a.data.data.addresses):alert("加载数据失败:"+a.data.message)})},modeChange:function(e){console.log(e)},handleSave:function(){var e=this;"ON"!==this.status||this.addresses&&!/^\s*$/.test(this.addresses)?this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/firewall/save",data:o()({status:this.status,mode:this.mode,addresses:this.addresses})}).then(function(a){0===a.data.code?(e.$message("保存成功"),e.loadData()):alert("保存失败:"+a.data.message)}):alert("IP列表不能为空!")}},created:function(){this.loadData()}},l={render:function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",[t("el-card",[t("el-form",{attrs:{"label-width":"200px"}},[t("el-form-item",{attrs:{label:"访问控制"}},[t("el-switch",{attrs:{"active-color":"#13ce66","active-value":"ON","inactive-value":"OFF","active-text":"开启","inactive-text":"关闭"},model:{value:e.status,callback:function(a){e.status=a},expression:"status"}})],1),e._v(" "),t("div",{directives:[{name:"show",rawName:"v-show",value:"ON"==e.status,expression:"status=='ON'"}]},[t("el-form-item",{attrs:{label:"名单"}},[t("el-radio-group",{on:{change:e.modeChange},model:{value:e.mode,callback:function(a){e.mode=a},expression:"mode"}},[t("el-radio",{attrs:{label:"BLACK"}},[e._v("黑名单")]),e._v(" "),t("el-radio",{attrs:{label:"WHITE"}},[e._v("白名单")])],1),e._v(" "),t("el-alert",{directives:[{name:"show",rawName:"v-show",value:"BLACK"==e.mode,expression:"mode == 'BLACK'"}],attrs:{title:"除了黑名单列表中的IP禁止访问API,其他IP一律允许访问",type:"warning",closable:!1}}),e._v(" "),t("el-alert",{directives:[{name:"show",rawName:"v-show",value:"WHITE"==e.mode,expression:"mode == 'WHITE'"}],attrs:{title:"只有白名单列表中的IP才允许访问API,其他IP一律禁止访问",type:"warning",closable:!1}})],1),e._v(" "),t("el-form-item",{directives:[{name:"show",rawName:"v-show",value:"BLACK"==e.mode,expression:"mode == 'BLACK'"}],attrs:{label:"黑名单IP列表"}},[t("el-input",{attrs:{type:"textarea",autosize:{minRows:8,maxRows:20},placeholder:"每行一个IP,多个IP请用换行分隔."},model:{value:e.addresses,callback:function(a){e.addresses=a},expression:"addresses"}})],1),e._v(" "),t("el-form-item",{directives:[{name:"show",rawName:"v-show",value:"WHITE"==e.mode,expression:"mode == 'WHITE'"}],attrs:{label:"白名单IP列表"}},[t("el-input",{attrs:{type:"textarea",autosize:{minRows:8,maxRows:20},placeholder:"每行一个IP,多个IP请用换行分隔."},model:{value:e.addresses,callback:function(a){e.addresses=a},expression:"addresses"}})],1)],1),e._v(" "),t("el-form-item",[t("el-button",{attrs:{type:"primary",plain:""},on:{click:e.handleSave}},[e._v("保存")])],1)],1)],1)],1)},staticRenderFns:[]};var d=t("VU/8")(r,l,!1,function(e){t("KYkU")},"data-v-7b9e1562",null);a.default=d.exports}});
//# sourceMappingURL=16.6d16122f45f1a1f311e2.js.map
\ No newline at end of file
webpackJsonp([17],{"6PtB":function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=a("mvHQ"),i=a.n(n),l={data:function(){return{loading:!0,currentPage:1,pageSize:10,totalCount:2,keyword:null,groupId:null,moduleId:null,publish:null,open:null,apiDocStatus:!0,groupLists:[],moduleLists:[],tableData:[]}},methods:{loadData:function(){var t=this;this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/assignment/list",data:window.JSON.stringify({groupId:this.groupId,moduleId:this.moduleId,publish:this.publish,open:this.open,searchText:this.keyword,page:this.currentPage,size:this.pageSize})}).then(function(e){0===e.data.code?(t.currentPage=e.data.pagination.page,t.pageSize=e.data.pagination.size,t.totalCount=e.data.pagination.total,t.tableData=e.data.data):alert("加载列表失败:"+e.data.message)})},loadGroupList:function(){var t=this;this.groupLists=[],this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/group/listAll",data:i()({page:1,size:2147483647,searchText:null})}).then(function(e){0===e.data.code?t.groupLists=e.data.data:alert("加载失败:"+e.data.message)})},loadModuleList:function(){var t=this;this.moduleLists=[],this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/module/listAll",data:i()({page:1,size:2147483647,searchText:null})}).then(function(e){0===e.data.code?t.moduleLists=e.data.data:alert("加载失败:"+e.data.message)})},loadApiDocOpenStatus:function(){var t=this;this.$http.get("/sqlrest/manager/api/v1/param/value/query?key=apiDocOpen").then(function(e){0===e.data.code?t.apiDocStatus=e.data.data:e.data.message&&alert("操作失败:"+e.data.message)})},searchByKeyword:function(){this.currentPage=1,this.loadData()},hanldeSwitchApiDoc:function(){var t=this;this.$http.post("/sqlrest/manager/api/v1/param/value/update?key=apiDocOpen&value="+this.apiDocStatus).then(function(e){0===e.data.code?t.loadApiDocOpenStatus():e.data.message&&alert("操作失败:"+e.data.message)})},boolFormatPublish:function(t){return!0===t.status?"是":"否"},boolFormatOpen:function(t){return!0===t.open?"Token认证":"无认证"},hanldeOpenStateChanged:function(t){var e=this,a=!0;!0===t.open&&(a=!1),this.$http.put("/sqlrest/manager/api/v1/assignment/open/"+t.id+"?open="+!a).then(function(t){0===t.data.code?e.loadData():t.data.message&&alert("操作失败:"+t.data.message)})},handleSearch:function(){this.loadData()},handleCreate:function(){this.$router.push("/interface/create")},openSwagger:function(){this.$http({method:"GET",url:"/sqlrest/manager/api/v1/node/gateway"}).then(function(t){if(0===t.data.code){if(t.data.data&&"string"==typeof t.data.data){var e=t.data.data+"/apidoc/index.html";window.open(e,"_blank")}}else t.data.message&&alert("操作失败:"+t.data.message)})},handleDetail:function(t,e){this.$router.push({path:"/interface/detail",query:{id:e.id}})},handleUpdate:function(t,e){this.$router.push({path:"/interface/update",query:{id:e.id}})},handleDelete:function(t,e){var a=this;this.$confirm("此操作将此接口ID="+e.id+"删除么, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){a.$http.delete("/sqlrest/manager/api/v1/assignment/delete/"+e.id).then(function(t){0===t.data.code?a.loadData():t.data.message&&alert("删除失败:"+t.data.message)})})},handlePublish:function(t,e){var a=this;this.$http({method:"PUT",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/assignment/deploy/"+e.id}).then(function(t){0===t.data.code?(a.$message("发布成功"),a.loadData()):t.data.message&&alert("发布失败,"+t.data.message)})},handleRetireTask:function(t,e){var a=this;this.$http({method:"PUT",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/assignment/retire/"+e.id}).then(function(t){0===t.data.code?(a.$message("下线成功"),a.loadData()):t.data.message&&alert("下线失败,"+t.data.message)})},handleSizeChange:function(t){this.loading=!0,this.pageSize=t,this.loadData()},handleCurrentChange:function(t){this.loading=!0,this.currentPage=t,this.loadData()}},created:function(){this.loadGroupList(),this.loadModuleList(),this.loadApiDocOpenStatus(),this.loadData()}},o={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[a("el-card",[a("div",{staticClass:"assignment-list-top"},[a("div",{staticClass:"left-search-input-group"},[a("div",{staticClass:"left-search-input"},[a("el-select",{staticStyle:{width:"15%"},attrs:{size:"mini",clearable:!0,placeholder:"选择授权分组"},model:{value:t.groupId,callback:function(e){t.groupId=e},expression:"groupId"}},t._l(t.groupLists,function(t,e){return a("el-option",{key:e,attrs:{label:t.name,value:t.id}})}),1),t._v(" "),a("el-select",{staticStyle:{width:"15%"},attrs:{size:"mini",clearable:!0,placeholder:"请选择模块"},model:{value:t.moduleId,callback:function(e){t.moduleId=e},expression:"moduleId"}},t._l(t.moduleLists,function(t,e){return a("el-option",{key:e,attrs:{label:t.name,value:t.id}})}),1),t._v(" "),a("el-select",{staticStyle:{width:"10%"},attrs:{size:"mini",clearable:!0,placeholder:"已上线"},model:{value:t.publish,callback:function(e){t.publish=e},expression:"publish"}},[a("el-option",{key:!0,attrs:{label:"是",value:!0}}),t._v(" "),a("el-option",{key:!1,attrs:{label:"否",value:!1}})],1),t._v(" "),a("el-select",{staticStyle:{width:"10%"},attrs:{size:"mini",clearable:!0,placeholder:"是否公开"},model:{value:t.open,callback:function(e){t.open=e},expression:"open"}},[a("el-option",{key:!0,attrs:{label:"是",value:!0}}),t._v(" "),a("el-option",{key:!1,attrs:{label:"否",value:!1}})],1),t._v(" "),a("el-input",{staticStyle:{width:"15%"},attrs:{placeholder:"名称搜索",size:"mini",clearable:!0},on:{change:t.searchByKeyword},model:{value:t.keyword,callback:function(e){t.keyword=e},expression:"keyword"}}),t._v(" "),a("el-button",{attrs:{type:"primary",size:"mini",icon:"el-icon-search"},on:{click:t.handleSearch}},[t._v("搜索")]),t._v(" "),a("el-switch",{attrs:{name:"Swagger文档开关","active-color":"#13ce66","inactive-color":"#ff4949","active-value":!0,"inactive-value":!1,"active-text":"文档开","inactive-text":"文档关"},on:{change:function(e){return t.hanldeSwitchApiDoc()}},model:{value:t.apiDocStatus,callback:function(e){t.apiDocStatus=e},expression:"apiDocStatus"}})],1)]),t._v(" "),a("el-button",{attrs:{type:"warning",size:"mini",disabled:0==t.apiDocStatus,icon:"el-icon-document-add"},on:{click:t.openSwagger}},[t._v("Swagger文档")]),t._v(" "),a("el-button",{attrs:{type:"primary",size:"mini",icon:"el-icon-document-add"},on:{click:t.handleCreate}},[t._v("添加")])],1),t._v(" "),a("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:t.tableData,size:"small",border:""}},[a("el-table-column",{attrs:{prop:"id",label:"编号","min-width":"8%"}}),t._v(" "),a("el-table-column",{attrs:{prop:"name",label:"名称","show-overflow-tooltip":"","min-width":"30%"}}),t._v(" "),a("el-table-column",{attrs:{label:"方法","min-width":"10%"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-tag",{staticClass:"name-wrapper-tag",attrs:{size:"medium"}},[t._v(t._s(e.row.method))])]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"path",label:"接口路径","show-overflow-tooltip":"","min-width":"20%"}}),t._v(" "),a("el-table-column",{attrs:{label:"引擎","min-width":"10%"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-tag",{staticClass:"name-wrapper-tag",attrs:{size:"medium"}},[t._v(t._s(e.row.engine))])]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"status",label:"已上线",formatter:t.boolFormatPublish,"show-overflow-tooltip":"","min-width":"8%"}}),t._v(" "),a("el-table-column",{attrs:{prop:"open",label:"公开","min-width":"8%"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-tooltip",{attrs:{content:t.boolFormatOpen(e.row),placement:"top"}},[a("el-switch",{on:{change:function(a){return t.hanldeOpenStateChanged(e.row)}},model:{value:e.row.open,callback:function(a){t.$set(e.row,"open",a)},expression:"scope.row.open"}})],1)]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"createTime",label:"创建时间","min-width":"18%"}}),t._v(" "),a("el-table-column",{attrs:{label:"操作","min-width":"30%"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-button-group",[!1===e.row.status?a("el-button",{attrs:{size:"small",type:"primary",icon:"el-icon-timer",round:""},on:{click:function(a){return t.handlePublish(e.$index,e.row)}}},[t._v("上线")]):t._e(),t._v(" "),!0===e.row.status?a("el-button",{attrs:{size:"small",type:"info",icon:"el-icon-delete-location",round:""},on:{click:function(a){return t.handleRetireTask(e.$index,e.row)}}},[t._v("下线")]):t._e(),t._v(" "),!0===e.row.status?a("el-button",{attrs:{size:"small",type:"success",icon:"el-icon-document",round:""},on:{click:function(a){return t.handleDetail(e.$index,e.row)}}},[t._v("详情")]):t._e(),t._v(" "),!1===e.row.status?a("el-button",{attrs:{size:"small",type:"warning",icon:"el-icon-edit",round:""},on:{click:function(a){return t.handleUpdate(e.$index,e.row)}}},[t._v("修改")]):t._e(),t._v(" "),!1===e.row.status?a("el-button",{attrs:{size:"small",type:"danger",icon:"el-icon-delete",round:""},on:{click:function(a){return t.handleDelete(e.$index,e.row)}}},[t._v("删除")]):t._e()],1)]}}])})],1),t._v(" "),a("div",{staticClass:"page",attrs:{align:"right"}},[a("el-pagination",{attrs:{"current-page":t.currentPage,"page-sizes":[5,10,20,40],"page-size":t.pageSize,layout:"total, sizes, prev, pager, next, jumper",total:t.totalCount},on:{"size-change":t.handleSizeChange,"current-change":t.handleCurrentChange}})],1)],1)],1)},staticRenderFns:[]};var s=a("VU/8")(l,o,!1,function(t){a("KlNt")},"data-v-73fb552f",null);e.default=s.exports},KlNt:function(t,e){}});
//# sourceMappingURL=17.d0f0c2f910dd10e0f688.js.map
\ No newline at end of file
webpackJsonp([20],{GbmM:function(t,e){},tq0o:function(t,e,a){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var n=a("mvHQ"),s=a.n(n),l={name:"alarm",data:function(){return{status:"ON",endpoint:"",contentType:"application/json",inputTemplate:"",testFormVisible:!1,dataModel:{}}},methods:{loadData:function(){var t=this;this.$http.get("/sqlrest/manager/api/v1/alarm/detail").then(function(e){0===e.data.code?(t.status=e.data.data.status,t.endpoint=e.data.data.endpoint,t.contentType=e.data.data.contentType,t.inputTemplate=e.data.data.inputTemplate):alert("加载数据失败:"+e.data.message)})},handleShowTest:function(){var t=this;this.$http.get("/sqlrest/manager/api/v1/alarm/example").then(function(e){0===e.data.code?(t.dataModel=e.data.data,t.testFormVisible=!0):alert("加载数据失败:"+e.data.message)})},handleClose:function(t){},handleSendTest:function(){var t=this;"ON"!==this.status||this.endpoint&&!/^\s*$/.test(this.endpoint)?"ON"!==this.status||this.contentType&&!/^\s*$/.test(this.contentType)?"ON"!==this.status||this.inputTemplate&&!/^\s*$/.test(this.inputTemplate)?this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/alarm/test",data:s()({endpoint:this.endpoint,contentType:this.contentType,inputTemplate:this.inputTemplate,dataModel:this.dataModel})}).then(function(e){0===e.data.code?t.$alert("发送测试成功,请去告警系统查看发送的告警日志信息","提示信息",{confirmButtonText:"确定",type:"info"}):t.$alert(e.data.message,"提示信息",{confirmButtonText:"确定",type:"error"})}):alert("入参模板必须输入!"):alert("入参类型必须选择!"):alert("接口端点不能为空!")},handleSave:function(){var t=this;"ON"!==this.status||this.endpoint&&!/^\s*$/.test(this.endpoint)?"ON"!==this.status||this.contentType&&!/^\s*$/.test(this.contentType)?"ON"!==this.status||this.inputTemplate&&!/^\s*$/.test(this.inputTemplate)?this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1/alarm/save",data:s()({status:this.status,endpoint:this.endpoint,contentType:this.contentType,inputTemplate:this.inputTemplate})}).then(function(e){0===e.data.code?(t.$alert("告警配置保存成功","提示信息",{confirmButtonText:"确定",type:"info"}),t.loadData()):alert("保存失败:"+e.data.message)}):alert("入参模板必须输入!"):alert("入参类型必须选择!"):alert("接口端点不能为空!")}},created:function(){this.loadData()}},i={render:function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",[a("el-card",[a("el-form",{attrs:{"label-width":"200px"}},[a("el-form-item",{attrs:{label:"告警配置"}},[a("el-switch",{attrs:{"active-color":"#13ce66","active-value":"ON","inactive-value":"OFF","active-text":"开启","inactive-text":"关闭"},model:{value:t.status,callback:function(e){t.status=e},expression:"status"}})],1),t._v(" "),a("div",{directives:[{name:"show",rawName:"v-show",value:"ON"==t.status,expression:"status=='ON'"}]},[a("el-form-item",{attrs:{label:"接口端点"}},[a("span",{staticStyle:{display:"inline-block"},attrs:{slot:"label"},slot:"label"},[t._v("\n 接口端点\n "),a("el-tooltip",{attrs:{effect:"dark",content:"接口端点请查阅对应的告警系统所提供的消息发送接口",placement:"bottom"}},[a("i",{staticClass:"el-icon-question"})])],1),t._v(" "),a("el-input",{attrs:{placeholder:"请输入接口的路径,例如:http://127.0.0.1:8000/api/v1/message/send"},model:{value:t.endpoint,callback:function(e){t.endpoint=e},expression:"endpoint"}})],1),t._v(" "),a("el-form-item",{attrs:{label:"入参格式"}},[a("span",{staticStyle:{display:"inline-block"},attrs:{slot:"label"},slot:"label"},[t._v("\n 入参格式\n "),a("el-tooltip",{attrs:{effect:"dark",content:"接口的入参数据格式,目前只支持Content-Type为application/json",placement:"bottom"}},[a("i",{staticClass:"el-icon-question"})])],1),t._v(" "),a("el-select",{model:{value:t.contentType,callback:function(e){t.contentType=e},expression:"contentType"}},[a("el-option",{attrs:{label:"application/json",value:"application/json"}})],1)],1),t._v(" "),a("el-form-item",{attrs:{label:"入参模板"}},[a("span",{staticStyle:{display:"inline-block"},attrs:{slot:"label"},slot:"label"},[t._v("\n 入参模板\n "),a("el-tooltip",{attrs:{effect:"dark",content:"入参数据格式请查阅对应的告警系统;模板支持的所有变量参数请点击“测试”按钮查看。",placement:"bottom"}},[a("i",{staticClass:"el-icon-question"})])],1),t._v(" "),a("el-input",{attrs:{type:"textarea",autosize:{minRows:8,maxRows:20},placeholder:"请输入接口的入参内容模板,变参部分请以${xxx}占位."},model:{value:t.inputTemplate,callback:function(e){t.inputTemplate=e},expression:"inputTemplate"}})],1)],1),t._v(" "),a("el-form-item",[a("el-button",{directives:[{name:"show",rawName:"v-show",value:"ON"==t.status,expression:"status=='ON'"}],attrs:{type:"primary",plain:""},on:{click:t.handleShowTest}},[t._v("测试")]),t._v(" "),a("el-button",{attrs:{type:"primary",plain:""},on:{click:t.handleSave}},[t._v("保存")])],1)],1)],1),t._v(" "),a("el-dialog",{attrs:{title:"测试告警配置",visible:t.testFormVisible,showClose:!1,"before-close":t.handleClose},on:{"update:visible":function(e){t.testFormVisible=e}}},[a("el-form",{attrs:{"label-width":"200px"}},t._l(t.dataModel,function(e){return a("el-form-item",t._b({key:e.key,attrs:{label:"${"+e.key+"}"}},"el-form-item",e,!1),[a("el-input",{key:e.key,attrs:{type:"text",value:e.value},model:{value:e.value,callback:function(a){t.$set(e,"value",a)},expression:"item.value"}})],1)}),1),t._v(" "),a("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[a("el-button",{attrs:{type:"primary",plain:""},on:{click:t.handleSendTest}},[t._v("测试")]),t._v(" "),a("el-button",{attrs:{type:"primary",plain:""},on:{click:function(e){t.testFormVisible=!1}}},[t._v("关 闭")])],1)],1)],1)},staticRenderFns:[]};var o=a("VU/8")(l,i,!1,function(t){a("GbmM")},"data-v-18b0eef3",null);e.default=o.exports}});
//# sourceMappingURL=20.f3610007860738763bf3.js.map
\ No newline at end of file
webpackJsonp([20],{"5fz/":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o={data:function(){return{}},components:{common:n("u2+N").a},methods:{},created:function(){}},r={render:function(){var t=this.$createElement;return(this._self._c||t)("common",{attrs:{isOnlyShowDetail:!1}})},staticRenderFns:[]};var a=n("VU/8")(o,r,!1,function(t){n("b2pB")},"data-v-1762f182",null);e.default=a.exports},b2pB:function(t,e){}}); webpackJsonp([21],{"5fz/":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var o={data:function(){return{}},components:{common:n("u2+N").a},methods:{},created:function(){}},r={render:function(){var t=this.$createElement;return(this._self._c||t)("common",{attrs:{isOnlyShowDetail:!1}})},staticRenderFns:[]};var a=n("VU/8")(o,r,!1,function(t){n("b2pB")},"data-v-1762f182",null);e.default=a.exports},b2pB:function(t,e){}});
//# sourceMappingURL=20.8085ffbdaee58f2c229a.js.map //# sourceMappingURL=21.77ada149b953dbbb9ca4.js.map
\ No newline at end of file \ No newline at end of file
{"version":3,"sources":["webpack:///src/views/interface/create.vue","webpack:///./src/views/interface/create.vue?ba12","webpack:///./src/views/interface/create.vue"],"names":["create","data","components","common","methods","created","interface_create","render","_h","this","$createElement","_self","_c","attrs","isOnlyShowDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"4GAQAA,GACAC,KADA,WAEA,UAGAC,YAAAC,iBAAA,GACAC,WAEAC,QARA,cCLeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,UAAoBK,OAAOC,kBAAA,MAEnGC,oBCCjB,IAcAC,EAdyBC,EAAQ,OAcjCC,CACElB,EACAM,GATF,EAVA,SAAAa,GACEF,EAAQ,SAaV,kBAEA,MAUeG,EAAA,QAAAJ,EAAiB","file":"static/js/20.8085ffbdaee58f2c229a.js","sourcesContent":["<template>\r\n <common :isOnlyShowDetail=\"false\">\r\n </common>\r\n</template>\r\n\r\n<script>\r\nimport common from '@/views/interface/common'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n }\r\n },\r\n components: { common },\r\n methods: {\r\n },\r\n created () {\r\n },\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n</style>\n\n\n// WEBPACK FOOTER //\n// src/views/interface/create.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('common',{attrs:{\"isOnlyShowDetail\":false}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1762f182\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/views/interface/create.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true,\\\"publicPath\\\":\\\"../../\\\"}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1762f182\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./create.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./create.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./create.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1762f182\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./create.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1762f182\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/views/interface/create.vue\n// module id = null\n// module chunks = "],"sourceRoot":""} {"version":3,"sources":["webpack:///src/views/interface/create.vue","webpack:///./src/views/interface/create.vue?ba12","webpack:///./src/views/interface/create.vue"],"names":["create","data","components","common","methods","created","interface_create","render","_h","this","$createElement","_self","_c","attrs","isOnlyShowDetail","staticRenderFns","Component","__webpack_require__","normalizeComponent","ssrContext","__webpack_exports__"],"mappings":"4GAQAA,GACAC,KADA,WAEA,UAGAC,YAAAC,iBAAA,GACAC,WAEAC,QARA,cCLeC,GADEC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAAkD,OAA/DD,KAAuCE,MAAAC,IAAAJ,GAAwB,UAAoBK,OAAOC,kBAAA,MAEnGC,oBCCjB,IAcAC,EAdyBC,EAAQ,OAcjCC,CACElB,EACAM,GATF,EAVA,SAAAa,GACEF,EAAQ,SAaV,kBAEA,MAUeG,EAAA,QAAAJ,EAAiB","file":"static/js/21.77ada149b953dbbb9ca4.js","sourcesContent":["<template>\r\n <common :isOnlyShowDetail=\"false\">\r\n </common>\r\n</template>\r\n\r\n<script>\r\nimport common from '@/views/interface/common'\r\n\r\nexport default {\r\n data () {\r\n return {\r\n }\r\n },\r\n components: { common },\r\n methods: {\r\n },\r\n created () {\r\n },\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n</style>\n\n\n// WEBPACK FOOTER //\n// src/views/interface/create.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('common',{attrs:{\"isOnlyShowDetail\":false}})}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-1762f182\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/views/interface/create.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true,\\\"publicPath\\\":\\\"../../\\\"}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-1762f182\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./create.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./create.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./create.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-1762f182\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./create.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-1762f182\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/views/interface/create.vue\n// module id = null\n// module chunks = "],"sourceRoot":""}
\ No newline at end of file \ No newline at end of file
webpackJsonp([24],{"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"),i=t.n(o),r=t("7+uW"),c={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var a=t("VU/8")({name:"App"},c,!1,function(n){t("z/cX")},"data-v-c3654c36",null).exports,u=t("/ocq");r.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(10).then(t.bind(null,"ARoL"))}},{path:"/datasource",name:"连接配置",icon:"el-icon-coin",component:function(){return t.e(9).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(22)]).then(t.bind(null,"cGhg"))}},{path:"/setting/client",name:"客户应用",icon:"el-icon-pie-chart",component:function(){return Promise.all([t.e(0),t.e(16)]).then(t.bind(null,"i2vO"))}},{path:"/setting/firewall",name:"访问控制",icon:"el-icon-notebook-2",component:function(){return Promise.all([t.e(0),t.e(13)]).then(t.bind(null,"n/J7"))}},{path:"/setting/alarm",name:"告警配置",icon:"el-icon-s-comment",component:function(){return Promise.all([t.e(0),t.e(20)]).then(t.bind(null,"tq0o"))}},{path:"/setting/topology",name:"拓扑结构",icon:"el-icon-link",component:function(){return Promise.all([t.e(0),t.e(11)]).then(t.bind(null,"aSAZ"))}}]},{path:"/interface",name:"接口开发",icon:"el-icon-edit-outline",component:function(){return t.e(8).then(t.bind(null,"zsKB"))},children:[{path:"/interface/module",name:"模块配置",icon:"el-icon-folder",component:function(){return Promise.all([t.e(0),t.e(17)]).then(t.bind(null,"BOPB"))}},{path:"/interface/list",name:"接口配置",icon:"el-icon-refrigerator",component:function(){return Promise.all([t.e(0),t.e(18)]).then(t.bind(null,"6PtB"))}}]},{path:"/service",name:"接口仓库",icon:"el-icon-school",component:function(){return t.e(7).then(t.bind(null,"JpB7"))},children:[{path:"/service/interface",name:"服务接口",icon:"el-icon-lightning",component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"vvPu"))}}]},{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(21)]).then(t.bind(null,"5fz/"))}},{path:"/interface/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(15)]).then(t.bind(null,"DuIM"))}},{path:"/interface/detail",name:"查看任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"+sv1"))}}]},{path:"/login",name:"登录",component:function(){return Promise.all([t.e(0),t.e(19)]).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),s=t.n(p).a.create();s.interceptors.request.use(function(n){return n.url=""+n.url,n});var d=s,m=t("zL8q"),h=t.n(m),f=(t("muQq"),t("6Wpa"),t("zuxR"),t("tvR6"),t("XLwt")),b=t("E5Az"),v=t.n(b),g=(t("4/hK"),t("R0ti")),P=t.n(g);r.default.use(v.a),r.default.use(d),r.default.use(h.a),r.default.use(P.a),r.default.prototype.$http=d,r.default.config.productionTip=!1,r.default.prototype.$echarts=f,d.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return i.a.reject(n)}),d.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 i.a.reject(n.response)}),new r.default({el:"#app",router:l,components:{App:a},template:"<App/>"})},muQq:function(n,e){},tvR6:function(n,e){},"z/cX":function(n,e){},zuxR:function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.4d21e57063e1c194f804.js.map
\ No newline at end of file
webpackJsonp([23],{"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"),i=t.n(o),r=t("7+uW"),c={render:function(){var n=this.$createElement,e=this._self._c||n;return e("div",{staticClass:"body-wrapper"},[e("router-view")],1)},staticRenderFns:[]};var a=t("VU/8")({name:"App"},c,!1,function(n){t("z/cX")},"data-v-c3654c36",null).exports,u=t("/ocq");r.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(10).then(t.bind(null,"ARoL"))}},{path:"/datasource",name:"连接配置",icon:"el-icon-coin",component:function(){return t.e(9).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(21)]).then(t.bind(null,"cGhg"))}},{path:"/setting/client",name:"客户应用",icon:"el-icon-pie-chart",component:function(){return Promise.all([t.e(0),t.e(15)]).then(t.bind(null,"i2vO"))}},{path:"/setting/firewall",name:"访问控制",icon:"el-icon-notebook-2",component:function(){return Promise.all([t.e(0),t.e(16)]).then(t.bind(null,"n/J7"))}},{path:"/setting/topology",name:"拓扑结构",icon:"el-icon-link",component:function(){return Promise.all([t.e(0),t.e(11)]).then(t.bind(null,"aSAZ"))}}]},{path:"/interface",name:"接口开发",icon:"el-icon-edit-outline",component:function(){return t.e(8).then(t.bind(null,"zsKB"))},children:[{path:"/interface/module",name:"模块配置",icon:"el-icon-folder",component:function(){return Promise.all([t.e(0),t.e(18)]).then(t.bind(null,"BOPB"))}},{path:"/interface/list",name:"接口配置",icon:"el-icon-refrigerator",component:function(){return Promise.all([t.e(0),t.e(17)]).then(t.bind(null,"6PtB"))}}]},{path:"/service",name:"接口仓库",icon:"el-icon-school",component:function(){return t.e(7).then(t.bind(null,"JpB7"))},children:[{path:"/service/interface",name:"服务接口",icon:"el-icon-lightning",component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"vvPu"))}}]},{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(20)]).then(t.bind(null,"5fz/"))}},{path:"/interface/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"DuIM"))}},{path:"/interface/detail",name:"查看任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(13)]).then(t.bind(null,"+sv1"))}}]},{path:"/login",name:"登录",component:function(){return Promise.all([t.e(0),t.e(19)]).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),s=t.n(p).a.create();s.interceptors.request.use(function(n){return n.url=""+n.url,n});var d=s,h=t("zL8q"),m=t.n(h),f=(t("muQq"),t("6Wpa"),t("zuxR"),t("tvR6"),t("XLwt")),b=t("E5Az"),v=t.n(b),g=(t("4/hK"),t("R0ti")),P=t.n(g);r.default.use(v.a),r.default.use(d),r.default.use(m.a),r.default.use(P.a),r.default.prototype.$http=d,r.default.config.productionTip=!1,r.default.prototype.$echarts=f,d.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return i.a.reject(n)}),d.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 i.a.reject(n.response)}),new r.default({el:"#app",router:l,components:{App:a},template:"<App/>"})},muQq:function(n,e){},tvR6:function(n,e){},"z/cX":function(n,e){},zuxR:function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.eb5ff3cb290926815e5c.js.map
\ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,f,o){for(var c,d,i,u=0,b=[];u<r.length;u++)d=r[u],t[d]&&b.push(t[d][0]),t[d]=0;for(c in f)Object.prototype.hasOwnProperty.call(f,c)&&(e[c]=f[c]);for(n&&n(r,f,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 f=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:"f72dbb9d754b88a9e6e3",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"530a43b5ad6055214539",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"d1391c270de5a9f111c5",9:"cbdb7fa4f5180acfbb03",10:"7eeaa94fd42d34a86b92",11:"096c0f0eaf2850056b7e",12:"cea57d271a961f0b44ad",13:"4d2138ee1bee3ad573f4",14:"429592868e75adc95933",15:"7acf5544a35df2fa2634",16:"6d16122f45f1a1f311e2",17:"d0f0c2f910dd10e0f688",18:"bb8da82a2138ed7b18a8",19:"d8b36c25e8b686c0ae5f",20:"8085ffbdaee58f2c229a",21:"d8007e7169c085e13dab"}[e]+".js";var c=setTimeout(d,12e4);function d(){o.onerror=o.onload=null,clearTimeout(c);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,f.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.1b702ecca7669457ed71.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///webpack/bootstrap a1e8cc69d97de3f32327"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","24","exports","module","l","e","installedChunkData","Promise","resolve","promise","reject","head","document","getElementsByTagName","script","createElement","type","charset","async","timeout","nc","setAttribute","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","setTimeout","onScriptComplete","onerror","onload","clearTimeout","chunk","Error","undefined","appendChild","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","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,GAAA,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,EAAA,SAAApB,GACA,IAAAqB,EAAAhB,EAAAL,GACA,OAAAqB,EACA,WAAAC,QAAA,SAAAC,GAA0CA,MAI1C,GAAAF,EACA,OAAAA,EAAA,GAIA,IAAAG,EAAA,IAAAF,QAAA,SAAAC,EAAAE,GACAJ,EAAAhB,EAAAL,IAAAuB,EAAAE,KAEAJ,EAAA,GAAAG,EAGA,IAAAE,EAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,UACAD,EAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EACAJ,EAAAK,QAAA,KAEArB,EAAAsB,IACAN,EAAAO,aAAA,QAAAvB,EAAAsB,IAEAN,EAAAQ,IAAAxB,EAAAyB,EAAA,aAAAtC,EAAA,KAAwEuC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAA8lB5D,GAAA,MACtqB,IAAAkC,EAAA2B,WAAAC,EAAA,MAEA,SAAAA,IAEAjC,EAAAkC,QAAAlC,EAAAmC,OAAA,KACAC,aAAA/B,GACA,IAAAgC,EAAA7D,EAAAL,GACA,IAAAkE,IACAA,GACAA,EAAA,OAAAC,MAAA,iBAAAnE,EAAA,aAEAK,EAAAL,QAAAoE,GAKA,OAfAvC,EAAAkC,QAAAlC,EAAAmC,OAAAF,EAaApC,EAAA2C,YAAAxC,GAEAL,GAIAX,EAAAyD,EAAA3D,EAGAE,EAAA0D,EAAAxD,EAGAF,EAAA2D,EAAA,SAAAvD,EAAAwD,EAAAC,GACA7D,EAAA8D,EAAA1D,EAAAwD,IACAlE,OAAAqE,eAAA3D,EAAAwD,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMA7D,EAAAmE,EAAA,SAAA9D,GACA,IAAAwD,EAAAxD,KAAA+D,WACA,WAA2B,OAAA/D,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAA2D,EAAAE,EAAA,IAAAA,GACAA,GAIA7D,EAAA8D,EAAA,SAAAO,EAAAC,GAAsD,OAAA5E,OAAAC,UAAAC,eAAAC,KAAAwE,EAAAC,IAGtDtE,EAAAyB,EAAA,IAGAzB,EAAAuE,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.1b702ecca7669457ed71.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\t24: 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 \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = \"text/javascript\";\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"static/js/\" + chunkId + \".\" + {\"0\":\"f72dbb9d754b88a9e6e3\",\"1\":\"b17200cccd46e216dcb3\",\"2\":\"140338f6a5528feea1a3\",\"3\":\"776d791724a8de12ff9e\",\"4\":\"f8494b8dd039413f79c8\",\"5\":\"530a43b5ad6055214539\",\"6\":\"8f85de06573e2a5f9562\",\"7\":\"061807fe4716131f26f8\",\"8\":\"d1391c270de5a9f111c5\",\"9\":\"cbdb7fa4f5180acfbb03\",\"10\":\"7eeaa94fd42d34a86b92\",\"11\":\"096c0f0eaf2850056b7e\",\"12\":\"cea57d271a961f0b44ad\",\"13\":\"4d2138ee1bee3ad573f4\",\"14\":\"429592868e75adc95933\",\"15\":\"7acf5544a35df2fa2634\",\"16\":\"6d16122f45f1a1f311e2\",\"17\":\"d0f0c2f910dd10e0f688\",\"18\":\"bb8da82a2138ed7b18a8\",\"19\":\"d8b36c25e8b686c0ae5f\",\"20\":\"8085ffbdaee58f2c229a\",\"21\":\"d8007e7169c085e13dab\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\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 a1e8cc69d97de3f32327"],"sourceRoot":""}
\ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,o){for(var f,b,d,i=0,u=[];i<r.length;i++)b=r[i],a[b]&&u.push(a[b][0]),a[b]=0;for(f in c)Object.prototype.hasOwnProperty.call(c,f)&&(e[f]=c[f]);for(n&&n(r,c,o);u.length;)u.shift()();if(o)for(i=0;i<o.length;i++)d=t(t.s=o[i]);return d};var r={},a={25:0};function t(n){if(r[n])return r[n].exports;var a=r[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.e=function(e){var n=a[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,t){n=a[e]=[r,t]});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,t.nc&&o.setAttribute("nonce",t.nc),o.src=t.p+"static/js/"+e+"."+{0:"f72dbb9d754b88a9e6e3",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"530a43b5ad6055214539",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"d1391c270de5a9f111c5",9:"cbdb7fa4f5180acfbb03",10:"7eeaa94fd42d34a86b92",11:"096c0f0eaf2850056b7e",12:"cea57d271a961f0b44ad",13:"1ba5cd611e73c235b21b",14:"d4164f216cdc1a726926",15:"12be397bb64472378b04",16:"c05bb666c09aa113a4e4",17:"b4bc5fa31e227bee8651",18:"fa99f8ce1c8d07f7bca4",19:"d8b36c25e8b686c0ae5f",20:"f3610007860738763bf3",21:"77ada149b953dbbb9ca4",22:"3ea8c57acb591bbb4ca1"}[e]+".js";var f=setTimeout(b,12e4);function b(){o.onerror=o.onload=null,clearTimeout(f);var n=a[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),a[e]=void 0)}return o.onerror=o.onload=b,c.appendChild(o),r},t.m=e,t.c=r,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/",t.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.a82bca04ec2f0cc74ba9.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///webpack/bootstrap 5fceaae615a9f60ed5b2"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","25","exports","module","l","e","installedChunkData","Promise","resolve","promise","reject","head","document","getElementsByTagName","script","createElement","type","charset","async","timeout","nc","setAttribute","src","p","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","setTimeout","onScriptComplete","onerror","onload","clearTimeout","chunk","Error","undefined","appendChild","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","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,GAAA,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,EAAA,SAAApB,GACA,IAAAqB,EAAAhB,EAAAL,GACA,OAAAqB,EACA,WAAAC,QAAA,SAAAC,GAA0CA,MAI1C,GAAAF,EACA,OAAAA,EAAA,GAIA,IAAAG,EAAA,IAAAF,QAAA,SAAAC,EAAAE,GACAJ,EAAAhB,EAAAL,IAAAuB,EAAAE,KAEAJ,EAAA,GAAAG,EAGA,IAAAE,EAAAC,SAAAC,qBAAA,WACAC,EAAAF,SAAAG,cAAA,UACAD,EAAAE,KAAA,kBACAF,EAAAG,QAAA,QACAH,EAAAI,OAAA,EACAJ,EAAAK,QAAA,KAEArB,EAAAsB,IACAN,EAAAO,aAAA,QAAAvB,EAAAsB,IAEAN,EAAAQ,IAAAxB,EAAAyB,EAAA,aAAAtC,EAAA,KAAwEuC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,EAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAA0nB7D,GAAA,MAClsB,IAAAkC,EAAA4B,WAAAC,EAAA,MAEA,SAAAA,IAEAlC,EAAAmC,QAAAnC,EAAAoC,OAAA,KACAC,aAAAhC,GACA,IAAAiC,EAAA9D,EAAAL,GACA,IAAAmE,IACAA,GACAA,EAAA,OAAAC,MAAA,iBAAApE,EAAA,aAEAK,EAAAL,QAAAqE,GAKA,OAfAxC,EAAAmC,QAAAnC,EAAAoC,OAAAF,EAaArC,EAAA4C,YAAAzC,GAEAL,GAIAX,EAAA0D,EAAA5D,EAGAE,EAAA2D,EAAAzD,EAGAF,EAAA4D,EAAA,SAAAxD,EAAAyD,EAAAC,GACA9D,EAAA+D,EAAA3D,EAAAyD,IACAnE,OAAAsE,eAAA5D,EAAAyD,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMA9D,EAAAoE,EAAA,SAAA/D,GACA,IAAAyD,EAAAzD,KAAAgE,WACA,WAA2B,OAAAhE,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAA4D,EAAAE,EAAA,IAAAA,GACAA,GAIA9D,EAAA+D,EAAA,SAAAO,EAAAC,GAAsD,OAAA7E,OAAAC,UAAAC,eAAAC,KAAAyE,EAAAC,IAGtDvE,EAAAyB,EAAA,IAGAzB,EAAAwE,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.a82bca04ec2f0cc74ba9.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\t25: 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 \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = \"text/javascript\";\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"static/js/\" + chunkId + \".\" + {\"0\":\"f72dbb9d754b88a9e6e3\",\"1\":\"b17200cccd46e216dcb3\",\"2\":\"140338f6a5528feea1a3\",\"3\":\"776d791724a8de12ff9e\",\"4\":\"f8494b8dd039413f79c8\",\"5\":\"530a43b5ad6055214539\",\"6\":\"8f85de06573e2a5f9562\",\"7\":\"061807fe4716131f26f8\",\"8\":\"d1391c270de5a9f111c5\",\"9\":\"cbdb7fa4f5180acfbb03\",\"10\":\"7eeaa94fd42d34a86b92\",\"11\":\"096c0f0eaf2850056b7e\",\"12\":\"cea57d271a961f0b44ad\",\"13\":\"1ba5cd611e73c235b21b\",\"14\":\"d4164f216cdc1a726926\",\"15\":\"12be397bb64472378b04\",\"16\":\"c05bb666c09aa113a4e4\",\"17\":\"b4bc5fa31e227bee8651\",\"18\":\"fa99f8ce1c8d07f7bca4\",\"19\":\"d8b36c25e8b686c0ae5f\",\"20\":\"f3610007860738763bf3\",\"21\":\"77ada149b953dbbb9ca4\",\"22\":\"3ea8c57acb591bbb4ca1\"}[chunkId] + \".js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\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 5fceaae615a9f60ed5b2"],"sourceRoot":""}
\ No newline at end of file
...@@ -63,6 +63,14 @@ public class ApiAssignmentDao { ...@@ -63,6 +63,14 @@ public class ApiAssignmentDao {
} }
} }
public void makeAlarm(Long id, Boolean alarm) {
ApiAssignmentEntity assignmentEntity = apiAssignmentMapper.selectById(id);
if (null != assignmentEntity && null != alarm) {
assignmentEntity.setAlarm(alarm);
apiAssignmentMapper.updateById(assignmentEntity);
}
}
public ApiAssignmentEntity getByUk(HttpMethodEnum method, String path) { public ApiAssignmentEntity getByUk(HttpMethodEnum method, String path) {
return getByUk(method, path, true); return getByUk(method, path, true);
} }
......
package com.gitee.sqlrest.persistence.dao;
import com.gitee.sqlrest.common.enums.OnOffEnum;
import com.gitee.sqlrest.persistence.entity.UnifyAlarmEntity;
import com.gitee.sqlrest.persistence.mapper.UnifyAlarmMapper;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
@Repository
public class UnifyAlarmDao {
private static final Long ID = 1L;
@Resource
private UnifyAlarmMapper unifyAlarmMapper;
public UnifyAlarmEntity getUnifyAlarmConfig() {
return unifyAlarmMapper.selectById(ID);
}
public void turnOn() {
unifyAlarmMapper.updateStatus(ID, OnOffEnum.ON);
}
public void turnOff() {
unifyAlarmMapper.updateStatus(ID, OnOffEnum.OFF);
}
public void update(OnOffEnum status, String endpoint, String contentType, String inputTemplate) {
unifyAlarmMapper.updateById(
UnifyAlarmEntity.builder()
.id(ID)
.status(status)
.endpoint(endpoint)
.contentType(contentType)
.inputTemplate(inputTemplate)
.build());
}
}
...@@ -67,6 +67,9 @@ public class ApiAssignmentEntity { ...@@ -67,6 +67,9 @@ public class ApiAssignmentEntity {
@TableField("open") @TableField("open")
private Boolean open; private Boolean open;
@TableField("alarm")
private Boolean alarm;
@TableField("content_type") @TableField("content_type")
private String contentType; private String contentType;
......
package com.gitee.sqlrest.persistence.entity;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.gitee.sqlrest.common.enums.OnOffEnum;
import java.sql.Timestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.ibatis.type.EnumTypeHandler;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "SQLREST_UNIFY_ALARM", autoResultMap = true)
public class UnifyAlarmEntity {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "status", typeHandler = EnumTypeHandler.class)
private OnOffEnum status;
@TableField(value = "endpoint")
private String endpoint;
@TableField(value = "content_type")
private String contentType;
@TableField(value = "input_template")
private String inputTemplate;
@TableField(value = "create_time", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private Timestamp createTime;
@TableField(value = "update_time", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private Timestamp updateTime;
}
package com.gitee.sqlrest.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.gitee.sqlrest.common.enums.OnOffEnum;
import com.gitee.sqlrest.persistence.entity.UnifyAlarmEntity;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
public interface UnifyAlarmMapper extends BaseMapper<UnifyAlarmEntity> {
@Update("update `SQLREST_UNIFY_ALARM` set status = #{status} where id = #{id}")
void updateStatus(@Param("id") Long id, @Param("status") OnOffEnum status);
}
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