Commit 396ffd9b by inrgihc

大模型MCP服务端

parent c2258558
...@@ -9,6 +9,7 @@ body: ...@@ -9,6 +9,7 @@ body:
- "1.0.0" - "1.0.0"
- "1.1.0" - "1.1.0"
- "1.2.0" - "1.2.0"
- "1.3.0"
validations: validations:
required: true required: true
- type: dropdown - type: dropdown
......
...@@ -39,6 +39,9 @@ ...@@ -39,6 +39,9 @@
- 支持接口异常触发告警功能 - 支持接口异常触发告警功能
> 简单配置即可对接已有的告警平台,支持接口异常时的告警功能。 > 简单配置即可对接已有的告警平台,支持接口异常时的告警功能。
- 支持作为大模型MCP服务断快速创建tool
> 基于已有接口,简单配置即可快速创建MCP的tool,为大模型提供MCP服务端工具。
### 2、支持的数据库 ### 2、支持的数据库
- 甲骨文的Oracle - 甲骨文的Oracle
...@@ -70,6 +73,7 @@ ...@@ -70,6 +73,7 @@
``` ```
└── sqlrest └── sqlrest
├── sqlrest-common // sqlrest通用定义模块 ├── sqlrest-common // sqlrest通用定义模块
├── sqlrest-mcp // sqlrest的MCP协议模块
├── sqlrest-template // sqlrest的SQL内容模板模块 ├── sqlrest-template // sqlrest的SQL内容模板模块
├── sqlrest-cache // sqlrest执行器缓存模块 ├── sqlrest-cache // sqlrest执行器缓存模块
├── sqlrest-persistence // sqlrest的数据库持久化模块 ├── sqlrest-persistence // sqlrest的数据库持久化模块
...@@ -237,23 +241,27 @@ sqlrest: ...@@ -237,23 +241,27 @@ sqlrest:
### 2、部分系统截图 ### 2、部分系统截图
![002.png](docs/images/001.PNG) ![001.png](docs/images/001.PNG)
![002.png](docs/images/002.PNG)
![003.png](docs/images/003.PNG)
![003.png](docs/images/002.PNG) ![004.png](docs/images/004.PNG)
![004.png](docs/images/003.PNG) ![005.png](docs/images/005.PNG)
![005.png](docs/images/004.PNG) ![006.png](docs/images/006.PNG)
![006.png](docs/images/005.PNG) ![007.png](docs/images/007.PNG)
![007.png](docs/images/006.PNG) ![008.png](docs/images/008.PNG)
![008.png](docs/images/007.PNG) ![009.png](docs/images/009.PNG)
![010.png](docs/images/008.PNG) ![010.png](docs/images/010.PNG)
![010.png](docs/images/009.PNG) ![011.png](docs/images/011.PNG)
## 四、贡献参与 ## 四、贡献参与
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
<modules> <modules>
<module>sqlrest-common</module> <module>sqlrest-common</module>
<module>sqlrest-mcp</module>
<module>sqlrest-template</module> <module>sqlrest-template</module>
<module>sqlrest-persistence</module> <module>sqlrest-persistence</module>
<module>sqlrest-core</module> <module>sqlrest-core</module>
...@@ -54,6 +55,12 @@ ...@@ -54,6 +55,12 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.4.3</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId> <groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2023.0.1.0</version> <version>2023.0.1.0</version>
......
...@@ -21,6 +21,8 @@ public abstract class Constants { ...@@ -21,6 +21,8 @@ public abstract class Constants {
public static final String GATEWAY_APPLICATION_NAME = "sqlrest-gateway"; public static final String GATEWAY_APPLICATION_NAME = "sqlrest-gateway";
public static final String MANAGER_APPLICATION_NAME = "sqlrest-manager";
public static final String CACHE_KEY_TOKEN_CLIENT = "token_client"; public static final String CACHE_KEY_TOKEN_CLIENT = "token_client";
public static final Long CLIENT_TOKEN_DURATION_SECONDS = 7200L; public static final Long CLIENT_TOKEN_DURATION_SECONDS = 7200L;
...@@ -43,6 +45,11 @@ public abstract class Constants { ...@@ -43,6 +45,11 @@ public abstract class Constants {
public static final String SYS_PARAM_KEY_SWAGGER_INFO_DESCRIPTION = "apiDocInfoDescription"; public static final String SYS_PARAM_KEY_SWAGGER_INFO_DESCRIPTION = "apiDocInfoDescription";
public static final String DEFAULT_SSE_TOKEN_PRAM_NAME = "token";
public static final String DEFAULT_SSE_ENDPOINT = "/mcp/sse";
public static final String MESSAGE_ENDPOINT = "/mcp/message";
public static final String MCP_SERVER_NAME = "sqlrest-mcp-server";
public static final String getResourceName(String method, String path) { public static final String getResourceName(String method, String path) {
return String.format("/%s/%s[%s]", Constants.API_PATH_PREFIX, path, method); return String.format("/%s/%s[%s]", Constants.API_PATH_PREFIX, path, method);
} }
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.core.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.sql.Timestamp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("MCP工具详情")
public class McpToolResponse {
@ApiModelProperty("ID编号")
private Long id;
@ApiModelProperty("工具名称")
private String name;
@ApiModelProperty("工具描述")
private String description;
@ApiModelProperty("接口模块ID")
private Long moduleId;
@ApiModelProperty("接口模块名称")
private String moduleName;
@ApiModelProperty("接口ID")
private Long apiId;
@ApiModelProperty("接口名称")
private String apiName;
@ApiModelProperty("接口Method")
private String apiMethod;
@ApiModelProperty("接口Path")
private String apiPath;
@ApiModelProperty("创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Timestamp createTime;
@ApiModelProperty("更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Timestamp updateTime;
}
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.core.dto;
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("MCP工具配置")
public class McpToolSaveRequest {
@ApiModelProperty("ID编号(保存接口使用)")
private Long id;
@NotNull(message = "apiId不能为null")
@ApiModelProperty("API的ID")
private Long apiId;
@NotBlank(message = "name不能为空")
@ApiModelProperty("工具名称")
private String name;
@NotBlank(message = "description不能为空")
@ApiModelProperty("工具描述")
private String description;
}
...@@ -85,6 +85,15 @@ public class ApiExecuteService { ...@@ -85,6 +85,15 @@ public class ApiExecuteService {
if (invalidArgs.size() > 0) { if (invalidArgs.size() > 0) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, convertInvalidArgs(invalidArgs)); throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, convertInvalidArgs(invalidArgs));
} }
return execute(config, paramValues);
} catch (CommonException e) {
return ResultEntity.failed(e.getCode(), e.getMessage());
} catch (Throwable t) {
return ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(t));
}
}
public ResultEntity<Object> execute(ApiAssignmentEntity config, Map<String, Object> paramValues) {
if (config.getCacheKeyType().isUseCache()) { if (config.getCacheKeyType().isUseCache()) {
String key = getCacheKeyValue(config, paramValues); String key = getCacheKeyValue(config, paramValues);
DistributedCache cache = getDistributedCache(); DistributedCache cache = getDistributedCache();
...@@ -100,11 +109,6 @@ public class ApiExecuteService { ...@@ -100,11 +109,6 @@ public class ApiExecuteService {
} else { } else {
return doExecute(getDataSourceEntity(config), config, paramValues); return doExecute(getDataSourceEntity(config), config, paramValues);
} }
} catch (CommonException e) {
return ResultEntity.failed(e.getCode(), e.getMessage());
} catch (Throwable t) {
return ResultEntity.failed(ResponseErrorCode.ERROR_INTERNAL_ERROR, ExceptionUtil.getMessage(t));
}
} }
private DataSourceEntity getDataSourceEntity(ApiAssignmentEntity config) { private DataSourceEntity getDataSourceEntity(ApiAssignmentEntity config) {
......
...@@ -169,6 +169,8 @@ ...@@ -169,6 +169,8 @@
<exclude>spring-webmvc-*.jar</exclude> <exclude>spring-webmvc-*.jar</exclude>
<exclude>spring-cloud-netflix-eureka-server-*.jar</exclude> <exclude>spring-cloud-netflix-eureka-server-*.jar</exclude>
<exclude>spring-cloud-starter-netflix-eureka-server-*.jar</exclude> <exclude>spring-cloud-starter-netflix-eureka-server-*.jar</exclude>
<exclude>httpclient5-*.jar</exclude>
<exclude>httpcore5-*.jar</exclude>
</excludes> </excludes>
<includes> <includes>
<include>*.jar</include> <include>*.jar</include>
...@@ -183,6 +185,8 @@ ...@@ -183,6 +185,8 @@
<include>tomcat-embed-websocket-*.jar</include> <include>tomcat-embed-websocket-*.jar</include>
<include>tomcat-embed-core-*.jar</include> <include>tomcat-embed-core-*.jar</include>
<include>spring-webmvc-*.jar</include> <include>spring-webmvc-*.jar</include>
<include>httpclient5-*.jar</include>
<include>httpcore5-*.jar</include>
</includes> </includes>
</fileSet> </fileSet>
<fileSet> <fileSet>
......
...@@ -69,7 +69,7 @@ const constantRouter = new Router({ ...@@ -69,7 +69,7 @@ const constantRouter = new Router({
{ {
path: '/setting/alarm', path: '/setting/alarm',
name: '告警配置', name: '告警配置',
icon: "el-icon-s-comment", icon: "el-icon-message-solid",
component: () => import('@/views/setting/alarm') component: () => import('@/views/setting/alarm')
}, },
{ {
...@@ -115,6 +115,26 @@ const constantRouter = new Router({ ...@@ -115,6 +115,26 @@ const constantRouter = new Router({
] ]
}, },
{ {
path: '/mcp',
name: 'MCP服务',
icon: "el-icon-s-promotion",
component: () => import('@/views/mcp/index'),
children: [
{
path: '/mcp/client',
name: '令牌配置',
icon: "el-icon-s-platform",
component: () => import('@/views/mcp/client'),
},
{
path: '/mcp/tool',
name: '工具配置',
icon: "el-icon-setting",
component: () => import('@/views/mcp/tool'),
}
]
},
{
path: '/aboutme', path: '/aboutme',
name: '关于系统', name: '关于系统',
icon: "el-icon-s-custom", icon: "el-icon-s-custom",
......
...@@ -301,14 +301,12 @@ ...@@ -301,14 +301,12 @@
</el-form-item> </el-form-item>
<el-form-item label="账号名称" <el-form-item label="账号名称"
label-width="120px" label-width="120px"
prop="username"
style="width:85%"> style="width:85%">
<el-input v-model="updateform.username" <el-input v-model="updateform.username"
auto-complete="off"></el-input> auto-complete="off"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="连接密码" <el-form-item label="连接密码"
label-width="120px" label-width="120px"
prop="password"
style="width:85%"> style="width:85%">
<el-input type="password" <el-input type="password"
v-model="updateform.password" v-model="updateform.password"
...@@ -405,20 +403,6 @@ export default { ...@@ -405,20 +403,6 @@ export default {
message: "Jdbc URL必须提供", message: "Jdbc URL必须提供",
trigger: "blur" trigger: "blur"
} }
],
username: [
{
required: true,
message: "连接账号名必须提供",
trigger: "blur"
}
],
password: [
{
required: true,
message: "连接密码必须提供",
trigger: "blur"
}
] ]
}, },
dialogFormVisible: false, dialogFormVisible: false,
......
<template>
<div class="log-index-viewer">
<router-view></router-view>
</div>
</template>
<script>
</script>
<style scoped>
</style>
\ No newline at end of file
...@@ -434,7 +434,6 @@ export default { ...@@ -434,7 +434,6 @@ export default {
}) })
}, },
handleCopyText: function () { handleCopyText: function () {
secretTextInput
var d = document.getElementById("secretTextInput") var d = document.getElementById("secretTextInput")
d.select() //选中 d.select() //选中
document.execCommand("copy") document.execCommand("copy")
......
...@@ -19,6 +19,12 @@ ...@@ -19,6 +19,12 @@
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.gitee.sqlrest</groupId>
<artifactId>sqlrest-mcp-springmvc</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
......
...@@ -36,6 +36,7 @@ public class AuthenticationConfiguration implements WebMvcConfigurer { ...@@ -36,6 +36,7 @@ public class AuthenticationConfiguration implements WebMvcConfigurer {
.excludePathPatterns(Arrays.asList( .excludePathPatterns(Arrays.asList(
"/user/login", "/user/login",
"/api/**", "/api/**",
"/mcp/**",
"/js/**", "/js/**",
"/css/**", "/css/**",
"/fonts/**", "/fonts/**",
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.config;
import cn.hutool.extra.spring.SpringUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gitee.sqlrest.common.consts.Constants;
import com.gitee.sqlrest.common.util.PomVersionUtils;
import com.gitee.sqlrest.persistence.dao.McpClientDao;
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.McpSyncServer;
import io.modelcontextprotocol.server.transport.WebMvcSseServerAuthChecker;
import io.modelcontextprotocol.server.transport.WebMvcSseServerTransportProvider;
import io.modelcontextprotocol.spec.McpSchema.LoggingLevel;
import io.modelcontextprotocol.spec.McpSchema.LoggingMessageNotification;
import io.modelcontextprotocol.spec.McpSchema.ServerCapabilities;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;
@Configuration
@EnableWebMvc
public class McpServerConfiguration {
@Bean
public WebMvcSseServerAuthChecker serverAuthChecker() {
return new WebMvcSseServerAuthChecker() {
@Override
public String getTokenParamName() {
return Constants.DEFAULT_SSE_TOKEN_PRAM_NAME;
}
@Override
public boolean checkTokenValid(String token) {
McpClientDao clientDao = SpringUtil.getBean(McpClientDao.class);
return clientDao.existsAccessToken(token);
}
};
}
@Bean
public WebMvcSseServerTransportProvider webMvcSseServerTransportProvider(WebMvcSseServerAuthChecker checker) {
return new WebMvcSseServerTransportProvider(new ObjectMapper(), checker, Constants.MESSAGE_ENDPOINT,
Constants.DEFAULT_SSE_ENDPOINT);
}
@Bean
public RouterFunction<ServerResponse> routerFunction(WebMvcSseServerTransportProvider transportProvider) {
return transportProvider.getRouterFunction();
}
@Bean
public McpSyncServer mcpSyncServer(WebMvcSseServerTransportProvider transportProvider) {
McpSyncServer syncServer = McpServer.sync(transportProvider)
.serverInfo(Constants.MCP_SERVER_NAME, PomVersionUtils.getProjectVersion())
.capabilities(
ServerCapabilities.builder()
.resources(true, true)
.tools(true)
.prompts(true)
.logging()
.build())
.build();
syncServer.loggingNotification(
LoggingMessageNotification.builder()
.level(LoggingLevel.INFO)
.logger("custom-logger")
.data("Server initialized")
.build());
return syncServer;
}
}
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.controller;
import com.gitee.sqlrest.common.consts.Constants;
import com.gitee.sqlrest.common.dto.PageResult;
import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.core.dto.EntitySearchRequest;
import com.gitee.sqlrest.manager.service.McpManageService;
import com.gitee.sqlrest.persistence.entity.McpClientEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = {"MCP令牌管理接口"})
@RestController
@RequestMapping(value = Constants.MANGER_API_V1 + "/mcp/client")
public class McpClientController {
@Resource
private McpManageService mcpManageService;
@ApiOperation(value = "获取MCP服务地址")
@GetMapping(value = "/endpoint", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity<String> getMcpSseEndpoint() {
return ResultEntity.success(mcpManageService.getMcpSseEndpoint());
}
@ApiOperation(value = "添加令牌")
@PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity create(@Valid @NotBlank(message = "name不能为空") @RequestParam("name") String name) {
mcpManageService.createClient(name);
return ResultEntity.success();
}
@ApiOperation(value = "更新令牌")
@PostMapping(value = "/update/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity update(@PathVariable("id") Long id,
@Valid @NotBlank(message = "name不能为空") @RequestParam("name") String name) {
mcpManageService.updateClient(id, name);
return ResultEntity.success();
}
@ApiOperation(value = "删除令牌")
@DeleteMapping(value = "/delete/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity delete(@PathVariable("id") Long id) {
mcpManageService.deleteClient(id);
return ResultEntity.success();
}
@ApiOperation(value = "令牌列表")
@PostMapping(value = "/listAll", produces = MediaType.APPLICATION_JSON_VALUE)
public PageResult<McpClientEntity> listAll(@RequestBody EntitySearchRequest request) {
return mcpManageService.listClientAll(request);
}
}
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.controller;
import com.gitee.sqlrest.common.consts.Constants;
import com.gitee.sqlrest.common.dto.PageResult;
import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.core.dto.EntitySearchRequest;
import com.gitee.sqlrest.core.dto.McpToolResponse;
import com.gitee.sqlrest.core.dto.McpToolSaveRequest;
import com.gitee.sqlrest.manager.service.McpManageService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import javax.validation.Valid;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
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 = {"MCP工具管理接口"})
@RestController
@RequestMapping(value = Constants.MANGER_API_V1 + "/mcp/tool")
public class McpToolController {
@Resource
private McpManageService mcpManageService;
@ApiOperation(value = "添加MCP工具")
@PostMapping(value = "/create", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity create(@Valid @RequestBody McpToolSaveRequest request) {
mcpManageService.createTool(request);
return ResultEntity.success();
}
@ApiOperation(value = "更新MCP工具")
@PostMapping(value = "/update", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity update(@Valid @RequestBody McpToolSaveRequest request) {
mcpManageService.updateTool(request);
return ResultEntity.success();
}
@ApiOperation(value = "删除MCP工具")
@DeleteMapping(value = "/delete/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResultEntity delete(@PathVariable("id") Long id) {
mcpManageService.deleteTool(id);
return ResultEntity.success();
}
@ApiOperation(value = "MCP工具列表")
@PostMapping(value = "/listAll", produces = MediaType.APPLICATION_JSON_VALUE)
public PageResult<McpToolResponse> listAll(@RequestBody EntitySearchRequest request) {
return mcpManageService.listToolAll(request);
}
}
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.service;
import cn.hutool.extra.spring.SpringUtil;
import com.gitee.sqlrest.common.consts.Constants;
import com.gitee.sqlrest.common.dto.PageResult;
import com.gitee.sqlrest.common.exception.CommonException;
import com.gitee.sqlrest.common.exception.ResponseErrorCode;
import com.gitee.sqlrest.common.util.TokenUtils;
import com.gitee.sqlrest.core.dto.EntitySearchRequest;
import com.gitee.sqlrest.core.dto.McpToolResponse;
import com.gitee.sqlrest.core.dto.McpToolSaveRequest;
import com.gitee.sqlrest.persistence.dao.ApiAssignmentDao;
import com.gitee.sqlrest.persistence.dao.ApiModuleDao;
import com.gitee.sqlrest.persistence.dao.McpClientDao;
import com.gitee.sqlrest.persistence.dao.McpToolDao;
import com.gitee.sqlrest.persistence.entity.ApiAssignmentEntity;
import com.gitee.sqlrest.persistence.entity.ApiModuleEntity;
import com.gitee.sqlrest.persistence.entity.McpClientEntity;
import com.gitee.sqlrest.persistence.entity.McpToolEntity;
import com.gitee.sqlrest.persistence.util.PageUtils;
import io.modelcontextprotocol.server.McpServerFeatures;
import io.modelcontextprotocol.server.McpSyncServer;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.context.event.EventListener;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
public class McpManageService {
@Resource
private McpClientDao mcpClientDao;
@Resource
private McpToolDao mcpToolDao;
@Resource
private ApiModuleDao apiModuleDao;
@Resource
private ApiAssignmentDao apiAssignmentDao;
@Resource
private McpSyncServer mcpSyncServer;
@EventListener(ApplicationReadyEvent.class)
public void loadMcpTools() {
try {
List<McpToolEntity> lists = mcpToolDao.listAll(null);
lists.forEach(this::addMcpTool);
log.info("Finish load total count [{}] mcp tools to memory.", lists.size());
} catch (Exception e) {
log.error("Failed load mcp tools to memory: {}", e.getMessage(), e);
throw e;
}
}
public String getMcpSseEndpoint() {
DiscoveryClient discoveryClient = SpringUtil.getBean(DiscoveryClient.class);
List<ServiceInstance> instances = discoveryClient.getInstances(Constants.MANAGER_APPLICATION_NAME);
ServiceInstance instance = instances.stream().findAny().orElse(null);
return String.format("http://%s:%d%s?%s=", instance.getHost(), instance.getPort(),
Constants.DEFAULT_SSE_ENDPOINT, Constants.DEFAULT_SSE_TOKEN_PRAM_NAME);
}
public void createClient(String name) {
try {
mcpClientDao.insert(
McpClientEntity.builder()
.name(name)
.token(TokenUtils.generateValue())
.build()
);
} catch (DuplicateKeyException e) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_ALREADY_EXISTS, "client name already exists");
}
}
public void updateClient(Long id, String newName) {
McpClientEntity clientEntity = mcpClientDao.getById(id);
clientEntity.setName(newName);
try {
mcpClientDao.updateById(clientEntity);
} catch (DuplicateKeyException e) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_ALREADY_EXISTS, "module name already exists");
}
}
public void deleteClient(Long id) {
mcpClientDao.deleteById(id);
}
public PageResult<McpClientEntity> listClientAll(EntitySearchRequest request) {
return PageUtils.getPage(
() -> mcpClientDao.listAll(request.getSearchText()),
request.getPage(),
request.getSize()
);
}
@Transactional(rollbackFor = Exception.class)
public void createTool(McpToolSaveRequest request) {
if (null == request.getApiId()) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, "apiId");
}
if (null == apiAssignmentDao.getById(request.getApiId(), false)) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_ALREADY_EXISTS,
"apiId not exists,id=" + request.getApiId());
}
McpToolEntity toolEntity = McpToolEntity.builder()
.name(request.getName())
.description(request.getDescription())
.apiId(request.getApiId())
.build();
try {
mcpToolDao.insert(toolEntity);
addMcpTool(toolEntity);
} catch (DuplicateKeyException e) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_ALREADY_EXISTS, "tool name already exists");
}
}
@Transactional(rollbackFor = Exception.class)
public void updateTool(McpToolSaveRequest request) {
if (null == request.getId()) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, "id");
}
if (null == request.getApiId()) {
throw new CommonException(ResponseErrorCode.ERROR_INVALID_ARGUMENT, "apiId");
}
McpToolEntity exists = mcpToolDao.getById(request.getId());
if (null == exists) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_NOT_EXISTS, "id=" + request.getId());
}
if (null == apiAssignmentDao.getById(request.getApiId(), false)) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_ALREADY_EXISTS,
"apiId=" + request.getApiId());
}
McpToolEntity newToolEntity = McpToolEntity.builder()
.id(request.getId())
.name(request.getName())
.description(request.getDescription())
.apiId(request.getApiId())
.build();
try {
mcpToolDao.updateById(newToolEntity);
updateMcpTool(exists.getName(), newToolEntity);
} catch (DuplicateKeyException e) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_ALREADY_EXISTS, "tool name already exists");
}
}
@Transactional(rollbackFor = Exception.class)
public void deleteTool(Long id) {
McpToolEntity toolEntity = mcpToolDao.getById(id);
if (null == toolEntity) {
throw new CommonException(ResponseErrorCode.ERROR_RESOURCE_NOT_EXISTS, "id=" + id);
}
mcpToolDao.deleteById(id);
deleteMcpTool(toolEntity.getName());
}
public PageResult<McpToolResponse> listToolAll(EntitySearchRequest request) {
PageResult<McpToolEntity> pageResult = PageUtils.getPage(
() -> mcpToolDao.listAll(request.getSearchText()),
request.getPage(),
request.getSize());
List<McpToolResponse> responseList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(pageResult.getData())) {
List<Long> apiIdList = pageResult.getData().stream().map(McpToolEntity::getApiId)
.collect(Collectors.toList());
Map<Long, ApiAssignmentEntity> apiConfigIdMap = apiAssignmentDao.getByIds(apiIdList)
.stream().collect(Collectors.toMap(ApiAssignmentEntity::getId, Function.identity()));
Map<Long, String> apiModuleIdNameMap = apiModuleDao.listAll(null)
.stream().collect(Collectors.toMap(ApiModuleEntity::getId, ApiModuleEntity::getName));
for (McpToolEntity toolEntity : pageResult.getData()) {
ApiAssignmentEntity config = apiConfigIdMap.get(toolEntity.getApiId());
McpToolResponse response = McpToolResponse.builder()
.id(toolEntity.getId())
.name(toolEntity.getName())
.description(toolEntity.getDescription())
.moduleId(config.getModuleId())
.moduleName(apiModuleIdNameMap.get(config.getModuleId()))
.apiId(toolEntity.getApiId())
.apiName(config.getName())
.apiMethod(config.getMethod().name())
.apiPath(config.getPath())
.createTime(toolEntity.getCreateTime())
.updateTime(toolEntity.getUpdateTime())
.build();
responseList.add(response);
}
}
PageResult<McpToolResponse> answer = new PageResult<>();
answer.setPagination(pageResult.getPagination());
answer.setData(responseList);
return answer;
}
private void addMcpTool(McpToolEntity toolEntity) {
ApiAssignmentEntity config = apiAssignmentDao.getById(toolEntity.getApiId(), true);
McpToolCallHandler toolCallHandler = new McpToolCallHandler(
toolEntity.getName(),
toolEntity.getDescription(),
config);
mcpSyncServer.addTool(
new McpServerFeatures.SyncToolSpecification(
toolCallHandler.getMcpToolSchema(),
toolCallHandler::executeTool
)
);
}
private void updateMcpTool(String oldToolName, McpToolEntity toolEntity) {
mcpSyncServer.removeTool(oldToolName);
addMcpTool(toolEntity);
}
private void deleteMcpTool(String toolName) {
mcpSyncServer.removeTool(toolName);
}
}
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package com.gitee.sqlrest.manager.service;
import cn.hutool.extra.spring.SpringUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.gitee.sqlrest.common.dto.BaseParam;
import com.gitee.sqlrest.common.dto.ItemParam;
import com.gitee.sqlrest.common.dto.ResultEntity;
import com.gitee.sqlrest.core.exec.ApiExecuteService;
import com.gitee.sqlrest.core.util.JacksonUtils;
import com.gitee.sqlrest.persistence.entity.ApiAssignmentEntity;
import com.google.common.collect.Lists;
import io.modelcontextprotocol.server.McpSyncServerExchange;
import io.modelcontextprotocol.spec.McpSchema;
import io.modelcontextprotocol.spec.McpSchema.CallToolResult;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
/**
* https://mcp-docs.cn/docs/concepts/tools
*/
public class McpToolCallHandler {
private static final ObjectMapper objectMapper = new ObjectMapper();
private static final String FN_TYPE = "type";
private static final String FN_ID = "id";
private static final String FN_DESCRIPTION = "description";
private static final String FN_PROPERTIES = "properties";
private static final String FN_ITEMS = "items";
private static final String FV_ID = "urn:jsonschema:Operation";
private static final String FV_OBJECT = "object";
private static final String FV_ARRAY = "array";
private final String toolName;
private final String toolDescription;
private final ApiAssignmentEntity config;
private final ApiExecuteService apiExecuteService;
public McpToolCallHandler(String toolName, String toolDescription,
ApiAssignmentEntity config) {
this.toolName = toolName;
this.toolDescription = toolDescription;
this.config = config;
this.apiExecuteService = SpringUtil.getBean(ApiExecuteService.class);
}
public McpSchema.Tool getMcpToolSchema() {
List<ItemParam> params = config.getParams();
ObjectNode rootNode = objectMapper.createObjectNode();
rootNode.put(FN_TYPE, FV_OBJECT);
rootNode.put(FN_ID, FV_ID);
ObjectNode propertiesNode = objectMapper.createObjectNode();
for (ItemParam param : params) {
ObjectNode node = objectMapper.createObjectNode();
if (param.getIsArray()) {
ObjectNode items = objectMapper.createObjectNode();
items.put(FN_TYPE, param.getType().getJsType());
node.put(FN_TYPE, FV_ARRAY);
node.put(FN_DESCRIPTION, param.getRemark());
node.set(FN_ITEMS, items);
} else {
node.put(FN_TYPE, param.getType().getJsType());
node.put(FN_DESCRIPTION, param.getRemark());
if (CollectionUtils.isNotEmpty(param.getChildren())) {
ObjectNode properties = objectMapper.createObjectNode();
for (BaseParam subParam : param.getChildren()) {
ObjectNode item = objectMapper.createObjectNode();
item.put(FN_TYPE, subParam.getType().getJsType());
item.put(FN_DESCRIPTION, subParam.getRemark());
properties.set(subParam.getName(), item);
}
node.set(FN_PROPERTIES, properties);
}
}
propertiesNode.set(param.getName(), node);
}
rootNode.set(FN_PROPERTIES, propertiesNode);
try {
String schema = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(rootNode);
return new McpSchema.Tool(toolName, toolDescription, schema);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
public CallToolResult executeTool(McpSyncServerExchange exchange, Map<String, Object> arguments) {
ResultEntity<Object> resultEntity = apiExecuteService.execute(config, arguments);
if (0 == resultEntity.getCode()) {
String json = JacksonUtils.toJsonStr(resultEntity.getData(), config.getResponseFormat());
McpSchema.TextContent content = new McpSchema.TextContent("获取JSON格式的数据为:\n " + json);
return new McpSchema.CallToolResult(Lists.newArrayList(content), false);
} else {
String message = resultEntity.getMessage();
McpSchema.TextContent content = new McpSchema.TextContent("获取数据异常:\n " + message);
return new McpSchema.CallToolResult(Lists.newArrayList(content), true);
}
}
}
...@@ -9,3 +9,5 @@ databaseChangeLog: ...@@ -9,3 +9,5 @@ databaseChangeLog:
file: classpath:db/changelog/log-v1.1.2.yaml file: classpath:db/changelog/log-v1.1.2.yaml
- include: - include:
file: classpath:db/changelog/log-v1.2.1.yaml file: classpath:db/changelog/log-v1.2.1.yaml
- include:
file: classpath:db/changelog/log-v1.2.2.yaml
\ No newline at end of file
databaseChangeLog:
- changeSet:
id: 1.2.2
author: sqlrest
runOnChange: false
changes:
- sqlFile:
encoding: UTF-8
path: db/migration/V1_2_2__system-ddl.sql
create table `SQLREST_MCP_CLIENT` (
`id` bigint(20) not null auto_increment comment '主键id',
`name` varchar(256) not null comment '客户端名称',
`token` varchar(64) not null comment '连接TOKEN',
`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`),
unique key `name` (`name`),
KEY `idx_token` (`token`) USING BTREE
) engine=InnoDB character set = utf8 comment = 'MCP连接客户端表';
create table `SQLREST_MCP_TOOL` (
`id` bigint(20) not null auto_increment comment '主键id',
`name` varchar(256) not null comment '工具名',
`description` varchar(1024) not null comment '工具描述',
`api_id` bigint(20) unsigned not null comment 'API接口ID',
`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`),
unique key `name` (`name`),
FOREIGN KEY (`api_id`) REFERENCES `SQLREST_API_ASSIGNMENT` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) engine=InnoDB character set = utf8 comment = 'MCP工具配置';
<!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> <!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.a8c22f6b9b014005bd869232cbdaa4b4.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.d9be689ba09af216a8ce.js></script><script type=text/javascript src=/static/js/vendor.a6ebeac16c85a178c5e7.js></script><script type=text/javascript src=/static/js/app.e892e4af016c82ce3f40.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([10],{Mwlz:function(e,t){},Nlos:function(e,t,n){"use strict";var r={render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"log-index-viewer"},[t("router-view")],1)},staticRenderFns:[]};t.a=r},WGg6:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("i/v/"),i=n.n(r);for(var a in r)"default"!==a&&function(e){n.d(t,e,function(){return r[e]})}(a);var u=n("Nlos");var o=function(e){n("Mwlz")},s=n("VU/8")(i.a,u.a,!1,o,"data-v-25710140",null);t.default=s.exports},"i/v/":function(e,t){}});
//# sourceMappingURL=10.0591dbe3e75f89e4c00e.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///./src/views/datasource/index.vue?1382","webpack:///./src/views/datasource/index.vue"],"names":["esExports","render","_h","this","$createElement","_c","_self","staticClass","staticRenderFns","__webpack_exports__","Object","defineProperty","value","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue___default","n","__WEBPACK_IMPORT_KEY__","key","d","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_25710140_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_index_vue__","__vue_styles__","ssrContext","Component","normalizeComponent","a"],"mappings":"0EAAA,IAEAA,GAAiBC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,qBAA+BF,EAAA,oBAExHG,oBACFC,EAAA,uCCHfC,OAAAC,eAAAF,EAAA,cAAAG,OAAA,QAAAC,EAAAC,EAAA,QAAAC,EAAAD,EAAAE,EAAAH,GAAA,QAAAI,KAAAJ,EAAA,YAAAI,GAAA,SAAAC,GAAAJ,EAAAK,EAAAV,EAAAS,EAAA,kBAAAL,EAAAK,KAAA,CAAAD,GAAA,IAAAG,EAAAN,EAAA,QAGA,IASAO,EAZA,SAAAC,GACER,EAAQ,SAgBVS,EAdyBT,EAAQ,OAcjCU,CACET,EAAAU,EACAL,EAAA,GATF,EAWAC,EAPA,kBAEA,MAUeZ,EAAA,QAAAc,EAAiB","file":"static/js/10.0591dbe3e75f89e4c00e.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"log-index-viewer\"},[_c('router-view')],1)}\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-25710140\",\"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/datasource/index.vue\n// module id = Nlos\n// module chunks = 10","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-25710140\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./index.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!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-25710140\\\",\\\"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!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-25710140\"\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/datasource/index.vue\n// module id = WGg6\n// module chunks = 10"],"sourceRoot":""}
\ No newline at end of file
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}}); webpackJsonp([14],{"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 //# sourceMappingURL=14.b74db4e8e5c2f13b4c43.js.map
\ No newline at end of file \ No newline at end of file
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){}}); webpackJsonp([15],{"+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=14.d4164f216cdc1a726926.js.map //# sourceMappingURL=15.d80f5cf2fd51d72b22ea.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/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":""} {"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/15.d80f5cf2fd51d72b22ea.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([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}}); webpackJsonp([16],{"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=15.12be397bb64472378b04.js.map //# sourceMappingURL=16.2ca69ffb53da98b61da4.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/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":""} {"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/16.2ca69ffb53da98b61da4.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([17],{"+79G":function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=a("mvHQ"),o=a.n(n),l=a("mw3O"),i=a.n(l),r={name:"group",components:{},data:function(){return{loading:!0,lists:[],tableData:[],currentPageNum:1,currentPageSize:10,totalItemCount:0,searchText:"",ShowTokenDialog:!1,clientTokenValue:"",serverSseUrlAddress:"",createform:{name:""},updateform:{id:0,name:""},rules:{name:[{required:!0,message:"名称不能为空",trigger:"blur"}]},createFormVisible:!1,updateFormVisible:!1}},methods:{loadData:function(){var e=this;this.$http({method:"POST",headers:{"Content-Type":"application/json"},url:"/sqlrest/manager/api/v1//mcp/client/listAll",data:o()({page:this.currentPageNum,size:this.currentPageSize,searchText:this.searchText})}).then(function(t){0===t.data.code?(e.totalItemCount=t.data.pagination.total,e.tableData=t.data.data):alert("加载数据失败:"+t.data.message)})},loadManagerAddress:function(e){var t=this;this.$http({method:"GET",url:"/sqlrest/manager/api/v1/mcp/client/endpoint"}).then(function(a){t.serverSseUrlAddress="",0===a.data.code?a.data.data&&"string"==typeof a.data.data&&(t.serverSseUrlAddress=a.data.data+e):a.data.message&&alert("加载数据失败:"+a.data.message)})},handleClose:function(e){},handleDelete:function(e,t){var a=this;this.$confirm("此操作将此令牌ID="+t.id+"删除么, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(function(){a.$http.delete("/sqlrest/manager/api/v1/mcp/client/delete/"+t.id).then(function(e){0===e.data.code?a.loadData():alert("删除失败:"+e.data.message)})})},addGroup:function(){this.createFormVisible=!0,this.createform={}},handleCreate:function(){var e=this;this.$refs.createform.validate(function(t){t?e.$http({method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},url:"/sqlrest/manager/api/v1/mcp/client/create",data:i.a.stringify({name:e.createform.name})}).then(function(t){0===t.data.code?(e.createFormVisible=!1,e.$message("添加成功"),e.createform={},e.loadData()):alert("添加失败:"+t.data.message)}):alert("请检查输入")})},handleShowToken:function(e,t){this.loadManagerAddress(t.token),this.clientTokenValue=t.token,this.ShowTokenDialog=!0},handleCopyTokenText:function(){document.getElementById("tokenTextInput").select(),document.execCommand("copy"),this.$message.success("复制令牌成功")},handleCopyAddressText:function(){document.getElementById("addressTextInput").select(),document.execCommand("copy"),this.$message.success("复制URL成功")},handleUpdate:function(e,t){this.updateform=JSON.parse(o()(t)),this.updateFormVisible=!0},handleSave:function(){var e=this;this.$refs.updateform.validate(function(t){t?e.$http({method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},url:"/sqlrest/manager/api/v1/mcp/client/update/"+e.updateform.id,data:i.a.stringify({name:e.updateform.name})}).then(function(t){0===t.data.code?(e.updateFormVisible=!1,e.$message("修改成功"),e.loadData(),e.updateform={}):alert("修改失败:"+t.data.message)}):alert("请检查输入")})},handleSizeChange:function(e){this.currentPageSize=e,this.loadData()},handleCurrentChange:function(e){this.currentPageNum=e,this.loadData()},searchByKeyword:function(){this.currentPage=1,this.loadData()}},mounted:function(){this.loadData()}},s={render:function(){var e=this,t=e.$createElement,a=e._self._c||t;return a("div",[a("el-card",[a("div",{staticClass:"group-list-top"},[a("div",{staticClass:"left-search-input-group"},[a("div",{staticClass:"left-search-input"},[a("el-input",{staticStyle:{width:"300px"},attrs:{placeholder:"名称搜索",size:"mini",clearable:!0},on:{change:e.searchByKeyword},model:{value:e.searchText,callback:function(t){e.searchText=t},expression:"searchText"}})],1)]),e._v(" "),a("div",{staticClass:"right-add-button-group"},[a("el-button",{attrs:{type:"primary",size:"mini",icon:"el-icon-document-add"},on:{click:e.addGroup}},[e._v("添加")])],1)]),e._v(" "),a("el-table",{attrs:{"header-cell-style":{background:"#eef1f6",color:"#606266"},data:e.tableData,size:"small",border:""}},[a("el-table-column",{attrs:{prop:"id",label:"编号","min-width":"5%"}}),e._v(" "),a("el-table-column",{attrs:{prop:"name",label:"名称","show-overflow-tooltip":"","min-width":"20%"}}),e._v(" "),a("el-table-column",{attrs:{prop:"createTime",label:"创建时间","min-width":"20%"}}),e._v(" "),a("el-table-column",{attrs:{prop:"updateTime",label:"更新时间","show-overflow-tooltip":"","min-width":"20%"}}),e._v(" "),a("el-table-column",{attrs:{label:"操作","min-width":"35%"},scopedSlots:e._u([{key:"default",fn:function(t){return[a("el-button-group",[a("el-button",{attrs:{size:"small",type:"danger",icon:"el-icon-document",round:""},on:{click:function(a){return e.handleShowToken(t.$index,t.row)}}},[e._v("查看")]),e._v(" "),a("el-button",{attrs:{size:"small",type:"warning",icon:"el-icon-edit",round:""},on:{click:function(a){return e.handleUpdate(t.$index,t.row)}}},[e._v("编辑")]),e._v(" "),a("el-button",{attrs:{size:"small",type:"success",icon:"el-icon-delete",round:""},on:{click:function(a){return e.handleDelete(t.$index,t.row)}}},[e._v("删除")])],1)]}}])})],1),e._v(" "),a("div",{staticClass:"page",attrs:{align:"right"}},[a("el-pagination",{attrs:{"current-page":e.currentPageNum,"page-sizes":[5,10,20,40],"page-size":e.currentPageSize,layout:"total, sizes, prev, pager, next, jumper",total:e.totalItemCount},on:{"size-change":e.handleSizeChange,"current-change":e.handleCurrentChange}})],1),e._v(" "),a("el-dialog",{attrs:{title:"查看",visible:e.ShowTokenDialog},on:{"update:visible":function(t){e.ShowTokenDialog=t}}},[a("el-form",{attrs:{size:"mini","status-icon":""}},[a("el-form-item",{staticStyle:{width:"100%"},attrs:{label:"MCP令牌","label-width":"100px"}},[a("el-input",{staticStyle:{width:"60%"},attrs:{type:"input",spellcheck:!1,id:"tokenTextInput"},model:{value:e.clientTokenValue,callback:function(t){e.clientTokenValue=t},expression:"clientTokenValue"}}),e._v(" "),a("el-button",{on:{click:e.handleCopyTokenText}},[e._v("点击复制")])],1),e._v(" "),a("el-form-item",{staticStyle:{width:"100%"},attrs:{label:"MCP地址","label-width":"100px"}},[a("el-input",{staticStyle:{width:"80%"},attrs:{type:"input",spellcheck:!1,id:"addressTextInput"},model:{value:e.serverSseUrlAddress,callback:function(t){e.serverSseUrlAddress=t},expression:"serverSseUrlAddress"}}),e._v(" "),a("el-button",{staticStyle:{width:"10%"},on:{click:e.handleCopyAddressText}},[e._v("点击复制")])],1)],1),e._v(" "),a("span",{attrs:{slot:"footer"},slot:"footer"},[a("el-button",{on:{click:function(t){e.ShowTokenDialog=!1}}},[e._v("取消")])],1)],1),e._v(" "),a("el-dialog",{attrs:{title:"添加信息",visible:e.createFormVisible,showClose:!1,"before-close":e.handleClose},on:{"update:visible":function(t){e.createFormVisible=t}}},[a("el-form",{ref:"createform",attrs:{model:e.createform,size:"mini","status-icon":"",rules:e.rules}},[a("el-form-item",{staticStyle:{width:"85%"},attrs:{label:"令牌名称","label-width":"120px",required:!0,prop:"name"}},[a("el-input",{attrs:{"auto-complete":"off"},model:{value:e.createform.name,callback:function(t){e.$set(e.createform,"name",t)},expression:"createform.name"}})],1)],1),e._v(" "),a("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[a("el-button",{on:{click:function(t){e.createFormVisible=!1}}},[e._v("取 消")]),e._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:e.handleCreate}},[e._v("确 定")])],1)],1),e._v(" "),a("el-dialog",{attrs:{title:"修改信息",visible:e.updateFormVisible,showClose:!1,"before-close":e.handleClose},on:{"update:visible":function(t){e.updateFormVisible=t}}},[a("el-form",{ref:"updateform",attrs:{model:e.updateform,size:"mini","status-icon":"",rules:e.rules}},[a("el-form-item",{staticStyle:{width:"85%"},attrs:{label:"令牌名称","label-width":"120px",required:!0,prop:"name"}},[a("el-input",{attrs:{"auto-complete":"off"},model:{value:e.updateform.name,callback:function(t){e.$set(e.updateform,"name",t)},expression:"updateform.name"}})],1)],1),e._v(" "),a("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[a("el-button",{on:{click:function(t){e.updateFormVisible=!1}}},[e._v("取 消")]),e._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:e.handleSave}},[e._v("确 定")])],1)],1)],1)],1)},staticRenderFns:[]};var d=a("VU/8")(r,s,!1,function(e){a("bw2B")},"data-v-7a43d070",null);t.default=d.exports},bw2B:function(e,t){}});
//# sourceMappingURL=17.64a6906a4b77392d43c7.js.map
\ No newline at end of file
webpackJsonp([19],{"T+/8":function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});r("mw3O");var a={data:function(){return{logining:!1,ruleForm2:{username:"",password:""},rules2:{username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},checked:!1}},created:function(){var e=this;document.onkeydown=function(t){13==window.event.keyCode&&e.handleSubmit(t)}},methods:{handleSubmit:function(){var e=this;this.$refs.ruleForm2.validate(function(t){t&&e.$http({method:"POST",url:"/user/login",data:{username:e.ruleForm2.username,password:e.ruleForm2.password}}).then(function(t){0===t.data.code?(e.logining=!0,window.sessionStorage.setItem("token",t.data.data.accessToken),window.sessionStorage.setItem("username",e.ruleForm2.username),window.sessionStorage.setItem("realname",t.data.data.realName),e.$router.push({path:"/dashboard"})):(e.logining=!1,e.$message(t.data.message))})})}}},s={render:function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"login-container"},[r("el-form",{ref:"ruleForm2",staticClass:"demo-ruleForm login-page",attrs:{model:e.ruleForm2,rules:e.rules2,"status-icon":"","label-position":"left","label-width":"0px"}},[r("h3",{staticClass:"title",attrs:{align:"center"}},[e._v("系统登录")]),e._v(" "),r("el-form-item",{attrs:{prop:"username"}},[r("el-input",{attrs:{type:"text","auto-complete":"off",placeholder:"用户名"},model:{value:e.ruleForm2.username,callback:function(t){e.$set(e.ruleForm2,"username",t)},expression:"ruleForm2.username"}})],1),e._v(" "),r("el-form-item",{attrs:{prop:"password"}},[r("el-input",{attrs:{type:"password","auto-complete":"off",placeholder:"密码"},model:{value:e.ruleForm2.password,callback:function(t){e.$set(e.ruleForm2,"password",t)},expression:"ruleForm2.password"}})],1),e._v(" "),r("el-form-item",{staticStyle:{width:"100%"}},[r("el-button",{staticStyle:{width:"100%"},attrs:{type:"primary",loading:e.logining},on:{click:e.handleSubmit,keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.handleSubmit(t)}}},[e._v("登录")])],1)],1)],1)},staticRenderFns:[]};var o=r("VU/8")(a,s,!1,function(e){r("VdEY")},"data-v-1b5aac28",null);t.default=o.exports},VdEY:function(e,t){}}); webpackJsonp([21],{"T+/8":function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});r("mw3O");var a={data:function(){return{logining:!1,ruleForm2:{username:"",password:""},rules2:{username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]},checked:!1}},created:function(){var e=this;document.onkeydown=function(t){13==window.event.keyCode&&e.handleSubmit(t)}},methods:{handleSubmit:function(){var e=this;this.$refs.ruleForm2.validate(function(t){t&&e.$http({method:"POST",url:"/user/login",data:{username:e.ruleForm2.username,password:e.ruleForm2.password}}).then(function(t){0===t.data.code?(e.logining=!0,window.sessionStorage.setItem("token",t.data.data.accessToken),window.sessionStorage.setItem("username",e.ruleForm2.username),window.sessionStorage.setItem("realname",t.data.data.realName),e.$router.push({path:"/dashboard"})):(e.logining=!1,e.$message(t.data.message))})})}}},s={render:function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("div",{staticClass:"login-container"},[r("el-form",{ref:"ruleForm2",staticClass:"demo-ruleForm login-page",attrs:{model:e.ruleForm2,rules:e.rules2,"status-icon":"","label-position":"left","label-width":"0px"}},[r("h3",{staticClass:"title",attrs:{align:"center"}},[e._v("系统登录")]),e._v(" "),r("el-form-item",{attrs:{prop:"username"}},[r("el-input",{attrs:{type:"text","auto-complete":"off",placeholder:"用户名"},model:{value:e.ruleForm2.username,callback:function(t){e.$set(e.ruleForm2,"username",t)},expression:"ruleForm2.username"}})],1),e._v(" "),r("el-form-item",{attrs:{prop:"password"}},[r("el-input",{attrs:{type:"password","auto-complete":"off",placeholder:"密码"},model:{value:e.ruleForm2.password,callback:function(t){e.$set(e.ruleForm2,"password",t)},expression:"ruleForm2.password"}})],1),e._v(" "),r("el-form-item",{staticStyle:{width:"100%"}},[r("el-button",{staticStyle:{width:"100%"},attrs:{type:"primary",loading:e.logining},on:{click:e.handleSubmit,keyup:function(t){return!t.type.indexOf("key")&&e._k(t.keyCode,"enter",13,t.key,"Enter")?null:e.handleSubmit(t)}}},[e._v("登录")])],1)],1)],1)},staticRenderFns:[]};var o=r("VU/8")(a,s,!1,function(e){r("VdEY")},"data-v-1b5aac28",null);t.default=o.exports},VdEY:function(e,t){}});
//# sourceMappingURL=19.d8b36c25e8b686c0ae5f.js.map //# sourceMappingURL=21.5952cc009e9eb6c25dfc.js.map
\ No newline at end of file \ No newline at end of file
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){}}); webpackJsonp([23],{"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=21.77ada149b953dbbb9ca4.js.map //# sourceMappingURL=23.93251b045354cc966a59.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/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":""} {"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/23.93251b045354cc966a59.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([8],{"3ZKH":function(e,t,n){"use strict";var r={render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"log-index-viewer"},[t("router-view")],1)},staticRenderFns:[]};t.a=r},"5HU5":function(e,t){},BVcr:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("5HU5"),i=n.n(r);for(var a in r)"default"!==a&&function(e){n.d(t,e,function(){return r[e]})}(a);var u=n("3ZKH");var c=function(e){n("Gl9b")},o=n("VU/8")(i.a,u.a,!1,c,"data-v-038f9891",null);t.default=o.exports},Gl9b:function(e,t){}});
//# sourceMappingURL=8.c4a2e9952c298efc080c.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///./src/views/mcp/index.vue?1af4","webpack:///./src/views/mcp/index.vue"],"names":["esExports","render","_h","this","$createElement","_c","_self","staticClass","staticRenderFns","__webpack_exports__","Object","defineProperty","value","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue___default","n","__WEBPACK_IMPORT_KEY__","key","d","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_038f9891_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_index_vue__","__vue_styles__","ssrContext","Component","normalizeComponent","a"],"mappings":"sDAAA,IAEAA,GAAiBC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,qBAA+BF,EAAA,oBAExHG,oBACFC,EAAA,8DCHfC,OAAAC,eAAAF,EAAA,cAAAG,OAAA,QAAAC,EAAAC,EAAA,QAAAC,EAAAD,EAAAE,EAAAH,GAAA,QAAAI,KAAAJ,EAAA,YAAAI,GAAA,SAAAC,GAAAJ,EAAAK,EAAAV,EAAAS,EAAA,kBAAAL,EAAAK,KAAA,CAAAD,GAAA,IAAAG,EAAAN,EAAA,QAGA,IASAO,EAZA,SAAAC,GACER,EAAQ,SAgBVS,EAdyBT,EAAQ,OAcjCU,CACET,EAAAU,EACAL,EAAA,GATF,EAWAC,EAPA,kBAEA,MAUeZ,EAAA,QAAAc,EAAiB","file":"static/js/8.c4a2e9952c298efc080c.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"log-index-viewer\"},[_c('router-view')],1)}\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-038f9891\",\"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/mcp/index.vue\n// module id = 3ZKH\n// module chunks = 8","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-038f9891\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./index.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!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-038f9891\\\",\\\"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!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-038f9891\"\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/mcp/index.vue\n// module id = BVcr\n// module chunks = 8"],"sourceRoot":""}
\ No newline at end of file
webpackJsonp([8],{"8JQO":function(e,t){},GWg1:function(e,t,n){"use strict";var r={render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"log-index-viewer"},[t("router-view")],1)},staticRenderFns:[]};t.a=r},Gc2c:function(e,t){},zsKB:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("Gc2c"),c=n.n(r);for(var i in r)"default"!==i&&function(e){n.d(t,e,function(){return r[e]})}(i);var a=n("GWg1");var u=function(e){n("8JQO")},s=n("VU/8")(c.a,a.a,!1,u,"data-v-ef277c20",null);t.default=s.exports}}); webpackJsonp([9],{"8JQO":function(e,t){},GWg1:function(e,t,n){"use strict";var r={render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"log-index-viewer"},[t("router-view")],1)},staticRenderFns:[]};t.a=r},Gc2c:function(e,t){},zsKB:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("Gc2c"),c=n.n(r);for(var i in r)"default"!==i&&function(e){n.d(t,e,function(){return r[e]})}(i);var a=n("GWg1");var u=function(e){n("8JQO")},s=n("VU/8")(c.a,a.a,!1,u,"data-v-ef277c20",null);t.default=s.exports}});
//# sourceMappingURL=8.d1391c270de5a9f111c5.js.map //# sourceMappingURL=9.313072ac394fc9349d2f.js.map
\ No newline at end of file \ No newline at end of file
{"version":3,"sources":["webpack:///./src/views/interface/index.vue?cf83","webpack:///./src/views/interface/index.vue"],"names":["esExports","render","_h","this","$createElement","_c","_self","staticClass","staticRenderFns","__webpack_exports__","Object","defineProperty","value","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue___default","n","__WEBPACK_IMPORT_KEY__","key","d","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ef277c20_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_index_vue__","__vue_styles__","ssrContext","Component","normalizeComponent","a"],"mappings":"2EAAA,IAEAA,GAAiBC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,qBAA+BF,EAAA,oBAExHG,oBACFC,EAAA,4DCHfC,OAAAC,eAAAF,EAAA,cAAAG,OAAA,QAAAC,EAAAC,EAAA,QAAAC,EAAAD,EAAAE,EAAAH,GAAA,QAAAI,KAAAJ,EAAA,YAAAI,GAAA,SAAAC,GAAAJ,EAAAK,EAAAV,EAAAS,EAAA,kBAAAL,EAAAK,KAAA,CAAAD,GAAA,IAAAG,EAAAN,EAAA,QAGA,IASAO,EAZA,SAAAC,GACER,EAAQ,SAgBVS,EAdyBT,EAAQ,OAcjCU,CACET,EAAAU,EACAL,EAAA,GATF,EAWAC,EAPA,kBAEA,MAUeZ,EAAA,QAAAc,EAAiB","file":"static/js/8.d1391c270de5a9f111c5.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"log-index-viewer\"},[_c('router-view')],1)}\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-ef277c20\",\"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/index.vue\n// module id = GWg1\n// module chunks = 8","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-ef277c20\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./index.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!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ef277c20\\\",\\\"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!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ef277c20\"\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/index.vue\n// module id = zsKB\n// module chunks = 8"],"sourceRoot":""} {"version":3,"sources":["webpack:///./src/views/interface/index.vue?cf83","webpack:///./src/views/interface/index.vue"],"names":["esExports","render","_h","this","$createElement","_c","_self","staticClass","staticRenderFns","__webpack_exports__","Object","defineProperty","value","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue___default","n","__WEBPACK_IMPORT_KEY__","key","d","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_ef277c20_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_index_vue__","__vue_styles__","ssrContext","Component","normalizeComponent","a"],"mappings":"2EAAA,IAEAA,GAAiBC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,qBAA+BF,EAAA,oBAExHG,oBACFC,EAAA,4DCHfC,OAAAC,eAAAF,EAAA,cAAAG,OAAA,QAAAC,EAAAC,EAAA,QAAAC,EAAAD,EAAAE,EAAAH,GAAA,QAAAI,KAAAJ,EAAA,YAAAI,GAAA,SAAAC,GAAAJ,EAAAK,EAAAV,EAAAS,EAAA,kBAAAL,EAAAK,KAAA,CAAAD,GAAA,IAAAG,EAAAN,EAAA,QAGA,IASAO,EAZA,SAAAC,GACER,EAAQ,SAgBVS,EAdyBT,EAAQ,OAcjCU,CACET,EAAAU,EACAL,EAAA,GATF,EAWAC,EAPA,kBAEA,MAUeZ,EAAA,QAAAc,EAAiB","file":"static/js/9.313072ac394fc9349d2f.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"log-index-viewer\"},[_c('router-view')],1)}\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-ef277c20\",\"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/index.vue\n// module id = GWg1\n// module chunks = 9","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-ef277c20\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./index.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!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-ef277c20\\\",\\\"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!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-ef277c20\"\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/index.vue\n// module id = zsKB\n// module chunks = 9"],"sourceRoot":""}
\ No newline at end of file \ No newline at end of file
webpackJsonp([9],{Mwlz:function(e,t){},Nlos:function(e,t,n){"use strict";var r={render:function(){var e=this.$createElement,t=this._self._c||e;return t("div",{staticClass:"log-index-viewer"},[t("router-view")],1)},staticRenderFns:[]};t.a=r},WGg6:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n("i/v/"),i=n.n(r);for(var a in r)"default"!==a&&function(e){n.d(t,e,function(){return r[e]})}(a);var u=n("Nlos");var o=function(e){n("Mwlz")},s=n("VU/8")(i.a,u.a,!1,o,"data-v-25710140",null);t.default=s.exports},"i/v/":function(e,t){}});
//# sourceMappingURL=9.cbdb7fa4f5180acfbb03.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///./src/views/datasource/index.vue?1382","webpack:///./src/views/datasource/index.vue"],"names":["esExports","render","_h","this","$createElement","_c","_self","staticClass","staticRenderFns","__webpack_exports__","Object","defineProperty","value","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue__","__webpack_require__","__WEBPACK_IMPORTED_MODULE_0__babel_loader_node_modules_vue_loader_lib_selector_type_script_index_0_index_vue___default","n","__WEBPACK_IMPORT_KEY__","key","d","__WEBPACK_IMPORTED_MODULE_1__node_modules_vue_loader_lib_template_compiler_index_id_data_v_25710140_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_index_vue__","__vue_styles__","ssrContext","Component","normalizeComponent","a"],"mappings":"yEAAA,IAEAA,GAAiBC,OAFjB,WAA0B,IAAaC,EAAbC,KAAaC,eAA0BC,EAAvCF,KAAuCG,MAAAD,IAAAH,EAAwB,OAAAG,EAAA,OAAiBE,YAAA,qBAA+BF,EAAA,oBAExHG,oBACFC,EAAA,uCCHfC,OAAAC,eAAAF,EAAA,cAAAG,OAAA,QAAAC,EAAAC,EAAA,QAAAC,EAAAD,EAAAE,EAAAH,GAAA,QAAAI,KAAAJ,EAAA,YAAAI,GAAA,SAAAC,GAAAJ,EAAAK,EAAAV,EAAAS,EAAA,kBAAAL,EAAAK,KAAA,CAAAD,GAAA,IAAAG,EAAAN,EAAA,QAGA,IASAO,EAZA,SAAAC,GACER,EAAQ,SAgBVS,EAdyBT,EAAQ,OAcjCU,CACET,EAAAU,EACAL,EAAA,GATF,EAWAC,EAPA,kBAEA,MAUeZ,EAAA,QAAAc,EAAiB","file":"static/js/9.cbdb7fa4f5180acfbb03.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"log-index-viewer\"},[_c('router-view')],1)}\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-25710140\",\"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/datasource/index.vue\n// module id = Nlos\n// module chunks = 9","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-25710140\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./index.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!./index.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./index.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-25710140\\\",\\\"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!./index.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-25710140\"\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/datasource/index.vue\n// module id = WGg6\n// module chunks = 9"],"sourceRoot":""}
\ 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([27],{"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 l=t("VU/8")({name:"App"},c,!1,function(n){t("z/cX")},"data-v-c3654c36",null).exports,a=t("/ocq");r.default.use(a.a);var u=new a.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(11).then(t.bind(null,"ARoL"))}},{path:"/datasource",name:"连接配置",icon:"el-icon-coin",component:function(){return t.e(10).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(25)]).then(t.bind(null,"cGhg"))}},{path:"/setting/client",name:"客户应用",icon:"el-icon-pie-chart",component:function(){return Promise.all([t.e(0),t.e(20)]).then(t.bind(null,"i2vO"))}},{path:"/setting/firewall",name:"访问控制",icon:"el-icon-notebook-2",component:function(){return Promise.all([t.e(0),t.e(14)]).then(t.bind(null,"n/J7"))}},{path:"/setting/alarm",name:"告警配置",icon:"el-icon-message-solid",component:function(){return Promise.all([t.e(0),t.e(22)]).then(t.bind(null,"tq0o"))}},{path:"/setting/topology",name:"拓扑结构",icon:"el-icon-link",component:function(){return Promise.all([t.e(0),t.e(12)]).then(t.bind(null,"aSAZ"))}}]},{path:"/interface",name:"接口开发",icon:"el-icon-edit-outline",component:function(){return t.e(9).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(19)]).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(13)]).then(t.bind(null,"vvPu"))}}]},{path:"/mcp",name:"MCP服务",icon:"el-icon-s-promotion",component:function(){return t.e(8).then(t.bind(null,"BVcr"))},children:[{path:"/mcp/client",name:"令牌配置",icon:"el-icon-s-platform",component:function(){return Promise.all([t.e(0),t.e(17)]).then(t.bind(null,"+79G"))}},{path:"/mcp/tool",name:"工具配置",icon:"el-icon-setting",component:function(){return Promise.all([t.e(0),t.e(24)]).then(t.bind(null,"kmMP"))}}]},{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(23)]).then(t.bind(null,"5fz/"))}},{path:"/interface/update",name:"修改任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(16)]).then(t.bind(null,"DuIM"))}},{path:"/interface/detail",name:"查看任务",hidden:!0,component:function(){return Promise.all([t.e(0),t.e(15)]).then(t.bind(null,"+sv1"))}}]},{path:"/login",name:"登录",component:function(){return Promise.all([t.e(0),t.e(21)]).then(t.bind(null,"T+/8"))}}]}),p=t("mtWM"),m=t.n(p).a.create();m.interceptors.request.use(function(n){return n.url=""+n.url,n});var s=m,d=t("zL8q"),h=t.n(d),f=(t("muQq"),t("6Wpa"),t("zuxR"),t("tvR6"),t("XLwt")),b=t("E5Az"),P=t.n(b),g=(t("4/hK"),t("R0ti")),v=t.n(g);r.default.use(P.a),r.default.use(s),r.default.use(h.a),r.default.use(v.a),r.default.prototype.$http=s,r.default.config.productionTip=!1,r.default.prototype.$echarts=f,s.interceptors.request.use(function(n){var e=sessionStorage.getItem("token");return e&&(n.headers.Authorization="Bearer "+e),n},function(n){return i.a.reject(n)}),s.interceptors.response.use(function(n){return!n.data||401!==n.data.code&&403!==n.data.code&&404!==n.data.code||u.push({path:"/login"}),n},function(n){return i.a.reject(n.response)}),new r.default({el:"#app",router:u,components:{App:l},template:"<App/>"})},muQq:function(n,e){},tvR6:function(n,e){},"z/cX":function(n,e){},zuxR:function(n,e){}},["NHnr"]);
//# sourceMappingURL=app.e892e4af016c82ce3f40.js.map
\ 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
!function(e){var c=window.webpackJsonp;window.webpackJsonp=function(n,a,f){for(var o,d,b,i=0,u=[];i<n.length;i++)d=n[i],r[d]&&u.push(r[d][0]),r[d]=0;for(o in a)Object.prototype.hasOwnProperty.call(a,o)&&(e[o]=a[o]);for(c&&c(n,a,f);u.length;)u.shift()();if(f)for(i=0;i<f.length;i++)b=t(t.s=f[i]);return b};var n={},r={28:0};function t(c){if(n[c])return n[c].exports;var r=n[c]={i:c,l:!1,exports:{}};return e[c].call(r.exports,r,r.exports,t),r.l=!0,r.exports}t.e=function(e){var c=r[e];if(0===c)return new Promise(function(e){e()});if(c)return c[2];var n=new Promise(function(n,t){c=r[e]=[n,t]});c[2]=n;var a=document.getElementsByTagName("head")[0],f=document.createElement("script");f.type="text/javascript",f.charset="utf-8",f.async=!0,f.timeout=12e4,t.nc&&f.setAttribute("nonce",t.nc),f.src=t.p+"static/js/"+e+"."+{0:"f72dbb9d754b88a9e6e3",1:"b17200cccd46e216dcb3",2:"140338f6a5528feea1a3",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"404ff5302fc6ee181ee9",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"c4a2e9952c298efc080c",9:"313072ac394fc9349d2f",10:"0591dbe3e75f89e4c00e",11:"9ccf6e8ba19ce146e66b",12:"d26d5fe93a45bd5c6eaa",13:"bfc06db76836c228f491",14:"b74db4e8e5c2f13b4c43",15:"d80f5cf2fd51d72b22ea",16:"2ca69ffb53da98b61da4",17:"64a6906a4b77392d43c7",18:"bb8da82a2138ed7b18a8",19:"a2c24b3aee6af674aa30",20:"1272deb68d764581e1ab",21:"5952cc009e9eb6c25dfc",22:"0a5f684edcb8df816a5d",23:"93251b045354cc966a59",24:"61c786230b6da7b9ddc7",25:"e85f7ab22c459c102670"}[e]+".js";var o=setTimeout(d,12e4);function d(){f.onerror=f.onload=null,clearTimeout(o);var c=r[e];0!==c&&(c&&c[1](new Error("Loading chunk "+e+" failed.")),r[e]=void 0)}return f.onerror=f.onload=d,a.appendChild(f),n},t.m=e,t.c=n,t.d=function(e,c,n){t.o(e,c)||Object.defineProperty(e,c,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var c=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(c,"a",c),c},t.o=function(e,c){return Object.prototype.hasOwnProperty.call(e,c)},t.p="/",t.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.d9be689ba09af216a8ce.js.map
\ No newline at end of file
{"version":3,"sources":["webpack:///webpack/bootstrap 290382fa1b040521abe2"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","28","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","23","24","25","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,uBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,wBAA8sBhE,GAAA,MACtxB,IAAAkC,EAAA+B,WAAAC,EAAA,MAEA,SAAAA,IAEArC,EAAAsC,QAAAtC,EAAAuC,OAAA,KACAC,aAAAnC,GACA,IAAAoC,EAAAjE,EAAAL,GACA,IAAAsE,IACAA,GACAA,EAAA,OAAAC,MAAA,iBAAAvE,EAAA,aAEAK,EAAAL,QAAAwE,GAKA,OAfA3C,EAAAsC,QAAAtC,EAAAuC,OAAAF,EAaAxC,EAAA+C,YAAA5C,GAEAL,GAIAX,EAAA6D,EAAA/D,EAGAE,EAAA8D,EAAA5D,EAGAF,EAAA+D,EAAA,SAAA3D,EAAA4D,EAAAC,GACAjE,EAAAkE,EAAA9D,EAAA4D,IACAtE,OAAAyE,eAAA/D,EAAA4D,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAjE,EAAAuE,EAAA,SAAAlE,GACA,IAAA4D,EAAA5D,KAAAmE,WACA,WAA2B,OAAAnE,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAA+D,EAAAE,EAAA,IAAAA,GACAA,GAIAjE,EAAAkE,EAAA,SAAAO,EAAAC,GAAsD,OAAAhF,OAAAC,UAAAC,eAAAC,KAAA4E,EAAAC,IAGtD1E,EAAAyB,EAAA,IAGAzB,EAAA2E,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.d9be689ba09af216a8ce.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\t28: 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\":\"404ff5302fc6ee181ee9\",\"6\":\"8f85de06573e2a5f9562\",\"7\":\"061807fe4716131f26f8\",\"8\":\"c4a2e9952c298efc080c\",\"9\":\"313072ac394fc9349d2f\",\"10\":\"0591dbe3e75f89e4c00e\",\"11\":\"9ccf6e8ba19ce146e66b\",\"12\":\"d26d5fe93a45bd5c6eaa\",\"13\":\"bfc06db76836c228f491\",\"14\":\"b74db4e8e5c2f13b4c43\",\"15\":\"d80f5cf2fd51d72b22ea\",\"16\":\"2ca69ffb53da98b61da4\",\"17\":\"64a6906a4b77392d43c7\",\"18\":\"bb8da82a2138ed7b18a8\",\"19\":\"a2c24b3aee6af674aa30\",\"20\":\"1272deb68d764581e1ab\",\"21\":\"5952cc009e9eb6c25dfc\",\"22\":\"0a5f684edcb8df816a5d\",\"23\":\"93251b045354cc966a59\",\"24\":\"61c786230b6da7b9ddc7\",\"25\":\"e85f7ab22c459c102670\"}[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 290382fa1b040521abe2"],"sourceRoot":""}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>sqlrest-parent</artifactId>
<groupId>com.gitee.sqlrest</groupId>
<version>1.2.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sqlrest-mcp</artifactId>
<packaging>pom</packaging>
<modules>
<module>sqlrest-mcp-core</module>
<module>sqlrest-mcp-springmvc</module>
</modules>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>sqlrest-mcp</artifactId>
<groupId>com.gitee.sqlrest</groupId>
<version>1.2.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sqlrest-mcp-core</artifactId>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents.client5/httpclient5 -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<!-- Used by the HttpServletSseServerTransport -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
/*
* Copyright 2024-2024 the original author or authors.
*/
package io.modelcontextprotocol.client;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.function.Function;
import io.modelcontextprotocol.spec.McpSchema;
import io.modelcontextprotocol.util.Assert;
import io.modelcontextprotocol.util.Utils;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
/**
* Representation of features and capabilities for Model Context Protocol (MCP) clients.
* This class provides two record types for managing client features:
* <ul>
* <li>{@link Async} for non-blocking operations with Project Reactor's Mono responses
* <li>{@link Sync} for blocking operations with direct responses
* </ul>
*
* <p>
* Each feature specification includes:
* <ul>
* <li>Client implementation information and capabilities
* <li>Root URI mappings for resource access
* <li>Change notification handlers for tools, resources, and prompts
* <li>Logging message consumers
* <li>Message sampling handlers for request processing
* </ul>
*
* <p>
* The class supports conversion between synchronous and asynchronous specifications
* through the {@link Async#fromSync} method, which ensures proper handling of blocking
* operations in non-blocking contexts by scheduling them on a bounded elastic scheduler.
*
* @author Dariusz Jędrzejczyk
* @see McpClient
* @see McpSchema.Implementation
* @see McpSchema.ClientCapabilities
*/
class McpClientFeatures {
/**
* Asynchronous client features specification providing the capabilities and request
* and notification handlers.
*/
@Getter
@Setter
static class Async {
McpSchema.Implementation clientInfo;
McpSchema.ClientCapabilities clientCapabilities;
Map<String, McpSchema.Root> roots; List<Function<List<McpSchema.Tool>, Mono<Void>>> toolsChangeConsumers;
List<Function<List<McpSchema.Resource>, Mono<Void>>> resourcesChangeConsumers;
List<Function<List<McpSchema.Prompt>, Mono<Void>>> promptsChangeConsumers;
List<Function<McpSchema.LoggingMessageNotification, Mono<Void>>> loggingConsumers;
Function<McpSchema.CreateMessageRequest, Mono<McpSchema.CreateMessageResult>> samplingHandler;
/**
* Create an instance and validate the arguments.
* @param clientCapabilities the client capabilities.
* @param roots the roots.
* @param toolsChangeConsumers the tools change consumers.
* @param resourcesChangeConsumers the resources change consumers.
* @param promptsChangeConsumers the prompts change consumers.
* @param loggingConsumers the logging consumers.
* @param samplingHandler the sampling handler.
*/
public Async(McpSchema.Implementation clientInfo, McpSchema.ClientCapabilities clientCapabilities,
Map<String, McpSchema.Root> roots,
List<Function<List<McpSchema.Tool>, Mono<Void>>> toolsChangeConsumers,
List<Function<List<McpSchema.Resource>, Mono<Void>>> resourcesChangeConsumers,
List<Function<List<McpSchema.Prompt>, Mono<Void>>> promptsChangeConsumers,
List<Function<McpSchema.LoggingMessageNotification, Mono<Void>>> loggingConsumers,
Function<McpSchema.CreateMessageRequest, Mono<McpSchema.CreateMessageResult>> samplingHandler) {
Assert.notNull(clientInfo, "Client info must not be null");
this.clientInfo = clientInfo;
this.clientCapabilities = (clientCapabilities != null) ? clientCapabilities
: new McpSchema.ClientCapabilities(null,
!Utils.isEmpty(roots) ? new McpSchema.ClientCapabilities.RootCapabilities(false) : null,
samplingHandler != null ? new McpSchema.ClientCapabilities.Sampling() : null);
this.roots = roots != null ? new ConcurrentHashMap<>(roots) : new ConcurrentHashMap<>();
this.toolsChangeConsumers = toolsChangeConsumers != null ? toolsChangeConsumers : Collections.emptyList();
this.resourcesChangeConsumers = resourcesChangeConsumers != null ? resourcesChangeConsumers : Collections.emptyList();
this.promptsChangeConsumers = promptsChangeConsumers != null ? promptsChangeConsumers : Collections.emptyList();
this.loggingConsumers = loggingConsumers != null ? loggingConsumers : Collections.emptyList();
this.samplingHandler = samplingHandler;
}
/**
* Convert a synchronous specification into an asynchronous one and provide
* blocking code offloading to prevent accidental blocking of the non-blocking
* transport.
* @param syncSpec a potentially blocking, synchronous specification.
* @return a specification which is protected from blocking calls specified by the
* user.
*/
public static Async fromSync(Sync syncSpec) {
List<Function<List<McpSchema.Tool>, Mono<Void>>> toolsChangeConsumers = new ArrayList<>();
for (Consumer<List<McpSchema.Tool>> consumer : syncSpec.getToolsChangeConsumers()) {
toolsChangeConsumers.add(t -> Mono.<Void>fromRunnable(() -> consumer.accept(t))
.subscribeOn(Schedulers.boundedElastic()));
}
List<Function<List<McpSchema.Resource>, Mono<Void>>> resourcesChangeConsumers = new ArrayList<>();
for (Consumer<List<McpSchema.Resource>> consumer : syncSpec.getResourcesChangeConsumers()) {
resourcesChangeConsumers.add(r -> Mono.<Void>fromRunnable(() -> consumer.accept(r))
.subscribeOn(Schedulers.boundedElastic()));
}
List<Function<List<McpSchema.Prompt>, Mono<Void>>> promptsChangeConsumers = new ArrayList<>();
for (Consumer<List<McpSchema.Prompt>> consumer : syncSpec.getPromptsChangeConsumers()) {
promptsChangeConsumers.add(p -> Mono.<Void>fromRunnable(() -> consumer.accept(p))
.subscribeOn(Schedulers.boundedElastic()));
}
List<Function<McpSchema.LoggingMessageNotification, Mono<Void>>> loggingConsumers = new ArrayList<>();
for (Consumer<McpSchema.LoggingMessageNotification> consumer : syncSpec.getLoggingConsumers()) {
loggingConsumers.add(l -> Mono.<Void>fromRunnable(() -> consumer.accept(l))
.subscribeOn(Schedulers.boundedElastic()));
}
Function<McpSchema.CreateMessageRequest, Mono<McpSchema.CreateMessageResult>> samplingHandler = r -> Mono
.fromCallable(() -> syncSpec.getSamplingHandler().apply(r))
.subscribeOn(Schedulers.boundedElastic());
return new Async(syncSpec.getClientInfo(), syncSpec.getClientCapabilities(), syncSpec.getRoots(),
toolsChangeConsumers, resourcesChangeConsumers, promptsChangeConsumers, loggingConsumers,
samplingHandler);
}
}
/**
* Synchronous client features specification providing the capabilities and request
* and notification handlers.
*/
@Getter
@Setter
public static class Sync {
McpSchema.Implementation clientInfo; McpSchema.ClientCapabilities clientCapabilities;
Map<String, McpSchema.Root> roots; List<Consumer<List<McpSchema.Tool>>> toolsChangeConsumers;
List<Consumer<List<McpSchema.Resource>>> resourcesChangeConsumers;
List<Consumer<List<McpSchema.Prompt>>> promptsChangeConsumers;
List<Consumer<McpSchema.LoggingMessageNotification>> loggingConsumers;
Function<McpSchema.CreateMessageRequest, McpSchema.CreateMessageResult> samplingHandler;
/**
* Create an instance and validate the arguments.
* @param clientInfo the client implementation information.
* @param clientCapabilities the client capabilities.
* @param roots the roots.
* @param toolsChangeConsumers the tools change consumers.
* @param resourcesChangeConsumers the resources change consumers.
* @param promptsChangeConsumers the prompts change consumers.
* @param loggingConsumers the logging consumers.
* @param samplingHandler the sampling handler.
*/
public Sync(McpSchema.Implementation clientInfo, McpSchema.ClientCapabilities clientCapabilities,
Map<String, McpSchema.Root> roots, List<Consumer<List<McpSchema.Tool>>> toolsChangeConsumers,
List<Consumer<List<McpSchema.Resource>>> resourcesChangeConsumers,
List<Consumer<List<McpSchema.Prompt>>> promptsChangeConsumers,
List<Consumer<McpSchema.LoggingMessageNotification>> loggingConsumers,
Function<McpSchema.CreateMessageRequest, McpSchema.CreateMessageResult> samplingHandler) {
Assert.notNull(clientInfo, "Client info must not be null");
this.clientInfo = clientInfo;
this.clientCapabilities = (clientCapabilities != null) ? clientCapabilities
: new McpSchema.ClientCapabilities(null,
!Utils.isEmpty(roots) ? new McpSchema.ClientCapabilities.RootCapabilities(false) : null,
samplingHandler != null ? new McpSchema.ClientCapabilities.Sampling() : null);
this.roots = roots != null ? new HashMap<>(roots) : new HashMap<>();
this.toolsChangeConsumers = toolsChangeConsumers != null ? toolsChangeConsumers : Collections.emptyList();
this.resourcesChangeConsumers = resourcesChangeConsumers != null ? resourcesChangeConsumers : Collections.emptyList();
this.promptsChangeConsumers = promptsChangeConsumers != null ? promptsChangeConsumers : Collections.emptyList();
this.loggingConsumers = loggingConsumers != null ? loggingConsumers : Collections.emptyList();
this.samplingHandler = samplingHandler;
}
}
}
/*
* Copyright 2024 - 2024 the original author or authors.
*/
package io.modelcontextprotocol.client.transport;
import io.modelcontextprotocol.util.Utils;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.var;
import org.apache.hc.client5.http.async.methods.AbstractCharResponseConsumer;
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.core5.http.ContentType;
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.Method;
import java.net.URI;
import java.nio.CharBuffer;
import java.util.concurrent.atomic.AtomicReference;
import java.util.regex.Pattern;
/**
* A Server-Sent Events (SSE) client implementation using Java's Flow API for reactive
* stream processing. This client establishes a connection to an SSE endpoint and
* processes the incoming event stream, parsing SSE-formatted messages into structured
* events.
*
* <p>
* The client supports standard SSE event fields including:
* <ul>
* <li>event - The event type (defaults to "message" if not specified)</li>
* <li>id - The event ID</li>
* <li>data - The event payload data</li>
* </ul>
*
* <p>
* Events are delivered to a provided {@link SseEventHandler} which can process events and
* handle any errors that occur during the connection.
*
* @author Christian Tzolov
* @see SseEventHandler
* @see SseEvent
*/
public class FlowSseClient {
private final CloseableHttpAsyncClient httpClient;
/**
* Pattern to extract the data content from SSE data field lines. Matches lines
* starting with "data:" and captures the remaining content.
*/
private static final Pattern EVENT_DATA_PATTERN = Pattern.compile("^data:(.+)$", Pattern.MULTILINE);
/**
* Pattern to extract the event ID from SSE id field lines. Matches lines starting
* with "id:" and captures the ID value.
*/
private static final Pattern EVENT_ID_PATTERN = Pattern.compile("^id:(.+)$", Pattern.MULTILINE);
/**
* Pattern to extract the event type from SSE event field lines. Matches lines
* starting with "event:" and captures the event type.
*/
private static final Pattern EVENT_TYPE_PATTERN = Pattern.compile("^event:(.+)$", Pattern.MULTILINE);
/**
* Record class representing a Server-Sent Event with its standard fields.
*
* @param id the event ID (may be null)
* @param type the event type (defaults to "message" if not specified in the stream)
* @param data the event payload data
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class SseEvent {
String id; String type; String data;
}
/**
* Interface for handling SSE events and errors. Implementations can process received
* events and handle any errors that occur during the SSE connection.
*/
public interface SseEventHandler {
/**
* Called when an SSE event is received.
* @param event the received SSE event containing id, type, and data
*/
void onEvent(SseEvent event);
/**
* Called when an error occurs during the SSE connection.
* @param error the error that occurred
*/
void onError(Throwable error);
}
/**
* Creates a new FlowSseClient with the specified HTTP client.
* @param httpClient the {@link HttpClient} instance to use for SSE connections
*/
public FlowSseClient(CloseableHttpAsyncClient httpClient) {
this.httpClient = httpClient;
}
/**
* Subscribes to an SSE endpoint and processes the event stream.
*
* <p>
* This method establishes a connection to the specified URL and begins processing the
* SSE stream. Events are parsed and delivered to the provided event handler. The
* connection remains active until either an error occurs or the server closes the
* connection.
* @param url the SSE endpoint URL to connect to
* @param eventHandler the handler that will receive SSE events and error
* notifications
* @throws RuntimeException if the connection fails with a non-200 status code
*/
public void subscribe(String url, SseEventHandler eventHandler) {
var request = SimpleHttpRequest.create(Method.GET, URI.create(url));
request.setHeader("Accept", "text/event-stream");
request.setHeader("Cache-Control", "no-cache");
StringBuilder eventBuilder = new StringBuilder();
AtomicReference<String> currentEventId = new AtomicReference<>();
AtomicReference<String> currentEventType = new AtomicReference<>("message");
// Function<Flow.Subscriber<String>, HttpResponse.BodySubscriber<Void>> subscriberFactory = subscriber -> HttpResponse.BodySubscribers
// .fromLineSubscriber(subscriber);
var future = this.httpClient.execute(SimpleRequestProducer.create(request), new AbstractCharResponseConsumer<HttpResponse>() {
final StringBuilder builder = new StringBuilder();
HttpResponse httpResponse;
@Override
protected void start(
final HttpResponse response,
final ContentType contentType) {
httpResponse = response;
}
@Override
protected int capacityIncrement() {
return Integer.MAX_VALUE;
}
@Override
protected void data(final CharBuffer data, final boolean endOfStream) {
while (data.hasRemaining()) {
char c = data.get();
if (c == '\n') {
onLine(builder.toString());
builder.setLength(0);
} else {
builder.append(c);
}
}
}
private void onLine(String line) {
if (line.trim().isEmpty()) {
// Empty line means end of event
if (eventBuilder.length() > 0) {
String eventData = eventBuilder.toString();
SseEvent event = new SseEvent(currentEventId.get(), currentEventType.get(), eventData.trim());
eventHandler.onEvent(event);
eventBuilder.setLength(0);
}
} else {
if (line.startsWith("data:")) {
var matcher = EVENT_DATA_PATTERN.matcher(line);
if (matcher.find()) {
eventBuilder.append(matcher.group(1).trim()).append("\n");
}
}
else if (line.startsWith("id:")) {
var matcher = EVENT_ID_PATTERN.matcher(line);
if (matcher.find()) {
currentEventId.set(matcher.group(1).trim());
}
}
else if (line.startsWith("event:")) {
var matcher = EVENT_TYPE_PATTERN.matcher(line);
if (matcher.find()) {
currentEventType.set(matcher.group(1).trim());
}
}
}
}
@Override
protected HttpResponse buildResult() {
return httpResponse;
}
@Override
public void failed(final Exception cause) {
System.out.println(request + "->" + cause);
}
@Override
public void releaseResources() {
}
}, null);
Utils.toCompletableFuture(future).thenAccept(response -> {
int status = response.getCode();
if (status != 200 && status != 201 && status != 202 && status != 206) {
throw new RuntimeException("Failed to connect to SSE stream. Unexpected status code: " + status);
}
}).exceptionally(throwable -> {
eventHandler.onError(throwable);
return null;
});
}
}
/*
* Copyright 2024-2024 the original author or authors.
*/
package io.modelcontextprotocol.client.transport;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.modelcontextprotocol.util.Assert;
/**
* Server parameters for stdio client.
*
* @author Christian Tzolov
* @author Dariusz Jędrzejczyk
*/
@JsonInclude(JsonInclude.Include.NON_ABSENT)
public class ServerParameters {
// Environment variables to inherit by default
private static final List<String> DEFAULT_INHERITED_ENV_VARS = System.getProperty("os.name")
.toLowerCase()
.contains("win")
? Arrays.asList("APPDATA", "HOMEDRIVE", "HOMEPATH", "LOCALAPPDATA", "PATH", "PROCESSOR_ARCHITECTURE",
"SYSTEMDRIVE", "SYSTEMROOT", "TEMP", "USERNAME", "USERPROFILE")
: Arrays.asList("HOME", "LOGNAME", "PATH", "SHELL", "TERM", "USER");
@JsonProperty("command")
private String command;
@JsonProperty("args")
private List<String> args = new ArrayList<>();
@JsonProperty("env")
private Map<String, String> env;
private ServerParameters(String command, List<String> args, Map<String, String> env) {
Assert.notNull(command, "The command can not be null");
Assert.notNull(args, "The args can not be null");
this.command = command;
this.args = args;
this.env = new HashMap<>(getDefaultEnvironment());
if (env != null && !env.isEmpty()) {
this.env.putAll(env);
}
}
public String getCommand() {
return this.command;
}
public List<String> getArgs() {
return this.args;
}
public Map<String, String> getEnv() {
return this.env;
}
public static Builder builder(String command) {
return new Builder(command);
}
public static class Builder {
private String command;
private List<String> args = new ArrayList<>();
private Map<String, String> env = new HashMap<>();
public Builder(String command) {
Assert.notNull(command, "The command can not be null");
this.command = command;
}
public Builder args(String... args) {
Assert.notNull(args, "The args can not be null");
this.args = Arrays.asList(args);
return this;
}
public Builder args(List<String> args) {
Assert.notNull(args, "The args can not be null");
this.args = new ArrayList<>(args);
return this;
}
public Builder arg(String arg) {
Assert.notNull(arg, "The arg can not be null");
this.args.add(arg);
return this;
}
public Builder env(Map<String, String> env) {
if (env != null && !env.isEmpty()) {
this.env.putAll(env);
}
return this;
}
public Builder addEnvVar(String key, String value) {
Assert.notNull(key, "The key can not be null");
Assert.notNull(value, "The value can not be null");
this.env.put(key, value);
return this;
}
public ServerParameters build() {
return new ServerParameters(command, args, env);
}
}
/**
* Returns a default environment object including only environment variables deemed
* safe to inherit.
*/
private static Map<String, String> getDefaultEnvironment() {
return System.getenv()
.entrySet()
.stream()
.filter(entry -> DEFAULT_INHERITED_ENV_VARS.contains(entry.getKey()))
.filter(entry -> entry.getValue() != null)
.filter(entry -> !entry.getValue().startsWith("()"))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
}
\ No newline at end of file
package io.modelcontextprotocol.server;
import com.fasterxml.jackson.core.type.TypeReference;
import io.modelcontextprotocol.spec.McpError;
import io.modelcontextprotocol.spec.McpSchema;
import io.modelcontextprotocol.spec.McpServerSession;
import reactor.core.publisher.Mono;
/**
* Represents an asynchronous exchange with a Model Context Protocol (MCP) client. The
* exchange provides methods to interact with the client and query its capabilities.
*
* @author Dariusz Jędrzejczyk
*/
public class McpAsyncServerExchange {
private final McpServerSession session;
private final McpSchema.ClientCapabilities clientCapabilities;
private final McpSchema.Implementation clientInfo;
private static final TypeReference<McpSchema.CreateMessageResult> CREATE_MESSAGE_RESULT_TYPE_REF = new TypeReference<McpSchema.CreateMessageResult>() {
};
private static final TypeReference<McpSchema.ListRootsResult> LIST_ROOTS_RESULT_TYPE_REF = new TypeReference<McpSchema.ListRootsResult>() {
};
/**
* Create a new asynchronous exchange with the client.
* @param session The server session representing a 1-1 interaction.
* @param clientCapabilities The client capabilities that define the supported
* features and functionality.
* @param clientInfo The client implementation information.
*/
public McpAsyncServerExchange(McpServerSession session, McpSchema.ClientCapabilities clientCapabilities,
McpSchema.Implementation clientInfo) {
this.session = session;
this.clientCapabilities = clientCapabilities;
this.clientInfo = clientInfo;
}
/**
* Get the client capabilities that define the supported features and functionality.
* @return The client capabilities
*/
public McpSchema.ClientCapabilities getClientCapabilities() {
return this.clientCapabilities;
}
/**
* Get the client implementation information.
* @return The client implementation details
*/
public McpSchema.Implementation getClientInfo() {
return this.clientInfo;
}
/**
* Create a new message using the sampling capabilities of the client. The Model
* Context Protocol (MCP) provides a standardized way for servers to request LLM
* sampling (“completions” or “generations”) from language models via clients. This
* flow allows clients to maintain control over model access, selection, and
* permissions while enabling servers to leverage AI capabilities—with no server API
* keys necessary. Servers can request text or image-based interactions and optionally
* include context from MCP servers in their prompts.
* @param createMessageRequest The request to create a new message
* @return A Mono that completes when the message has been created
* @see McpSchema.CreateMessageRequest
* @see McpSchema.CreateMessageResult
* @see <a href=
* "https://spec.modelcontextprotocol.io/specification/client/sampling/">Sampling
* Specification</a>
*/
public Mono<McpSchema.CreateMessageResult> createMessage(McpSchema.CreateMessageRequest createMessageRequest) {
if (this.clientCapabilities == null) {
return Mono.error(new McpError("Client must be initialized. Call the initialize method first!"));
}
if (this.clientCapabilities.getSampling() == null) {
return Mono.error(new McpError("Client must be configured with sampling capabilities"));
}
return this.session.sendRequest(McpSchema.METHOD_SAMPLING_CREATE_MESSAGE, createMessageRequest,
CREATE_MESSAGE_RESULT_TYPE_REF);
}
/**
* Retrieves the list of all roots provided by the client.
* @return A Mono that emits the list of roots result.
*/
public Mono<McpSchema.ListRootsResult> listRoots() {
return this.listRoots(null);
}
/**
* Retrieves a paginated list of roots provided by the client.
* @param cursor Optional pagination cursor from a previous list request
* @return A Mono that emits the list of roots result containing
*/
public Mono<McpSchema.ListRootsResult> listRoots(String cursor) {
return this.session.sendRequest(McpSchema.METHOD_ROOTS_LIST, new McpSchema.PaginatedRequest(cursor),
LIST_ROOTS_RESULT_TYPE_REF);
}
}
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