From b21a02c4a56e566481044522aa67fe9caad3dfce Mon Sep 17 00:00:00 2001 From: tanghc Date: Fri, 14 Jun 2019 17:28:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gitee/sop/adminserver/api/isv/IsvApi.java | 12 +- .../sop/adminserver/api/service/LimitApi.java | 4 +- .../adminserver/api/service/LimitNewApi.java | 6 +- .../sop/adminserver/api/service/LogApi.java | 12 +- .../sop/adminserver/api/service/RouteApi.java | 107 ++--- .../adminserver/api/service/ServiceApi.java | 56 ++- .../api/service/param/LimitNewAddParam.java | 2 + .../service/param/LimitNewUpdateParam.java | 2 + .../api/service/param/RouteAddParam.java | 76 ++++ .../api/service/param/RouteDeleteParam.java | 22 ++ ...{RouteParam.java => RouteUpdateParam.java} | 31 +- .../api/service/param/ServiceAddParam.java | 21 + .../api/service/result/ServiceInfo.java | 4 + .../bean/GatewayRouteDefinition.java | 15 +- .../adminserver/bean/ServiceRouteInfo.java | 3 + .../adminserver/bean/ZookeeperContext.java | 136 +++++-- .../sop/adminserver/common/BizException.java | 33 ++ .../common/ZookeeperOperationException.java | 26 ++ .../common/ZookeeperPathExistException.java | 10 + .../ZookeeperPathNotExistException.java | 10 + .../service/RouteConfigService.java | 2 +- .../sop/adminserver/service/RouteService.java | 4 +- .../src/main/resources/public/index.html | 2 +- .../static/css/chunk-29b24c82.857979fb.css | 1 - .../static/css/chunk-2a9bc230.2dae711a.css | 1 + ...3114f3.css => chunk-37401378.a43114f3.css} | 0 .../static/css/chunk-6a68a33e.3b12267b.css | 1 + .../js/{app.36a3cb86.js => app.3225a72c.js} | 2 +- .../static/js/chunk-29b24c82.2b3ac7ca.js | 1 - .../static/js/chunk-2a9bc230.6f8c0d92.js | 1 + .../static/js/chunk-2d0aa95b.447435b3.js | 1 - ...3ec98327.js => chunk-37401378.4e39ec9b.js} | 2 +- .../static/js/chunk-6a68a33e.8b63492e.js | 1 + sop-admin/sop-admin-vue/src/utils/global.js | 10 +- .../src/views/service/limit/index2.vue | 12 +- .../src/views/service/route/index.vue | 371 ++++++++++++++---- 36 files changed, 803 insertions(+), 197 deletions(-) create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteAddParam.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteDeleteParam.java rename sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/{RouteParam.java => RouteUpdateParam.java} (54%) create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/ServiceAddParam.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/BizException.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperOperationException.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathExistException.java create mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathNotExistException.java delete mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-29b24c82.857979fb.css create mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-2a9bc230.2dae711a.css rename sop-admin/sop-admin-server/src/main/resources/public/static/css/{chunk-19100986.a43114f3.css => chunk-37401378.a43114f3.css} (100%) create mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-6a68a33e.3b12267b.css rename sop-admin/sop-admin-server/src/main/resources/public/static/js/{app.36a3cb86.js => app.3225a72c.js} (64%) delete mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29b24c82.2b3ac7ca.js create mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2a9bc230.6f8c0d92.js delete mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d0aa95b.447435b3.js rename sop-admin/sop-admin-server/src/main/resources/public/static/js/{chunk-19100986.3ec98327.js => chunk-37401378.4e39ec9b.js} (90%) create mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-6a68a33e.8b63492e.js diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java index 64e6ca4f..9ddb5cc8 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java @@ -7,7 +7,6 @@ import com.gitee.easyopen.doc.DataType; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocField; import com.gitee.easyopen.doc.annotation.ApiDocMethod; -import com.gitee.easyopen.exception.ApiException; import com.gitee.easyopen.util.CopyUtil; import com.gitee.easyopen.util.KeyStore; import com.gitee.easyopen.util.RSAUtil; @@ -24,7 +23,10 @@ import com.gitee.sop.adminserver.api.isv.result.IsvVO; import com.gitee.sop.adminserver.api.isv.result.RoleVO; import com.gitee.sop.adminserver.bean.ChannelMsg; import com.gitee.sop.adminserver.bean.ZookeeperContext; +import com.gitee.sop.adminserver.common.BizException; import com.gitee.sop.adminserver.common.IdGen; +import com.gitee.sop.adminserver.common.ZookeeperOperationException; +import com.gitee.sop.adminserver.common.ZookeeperPathNotExistException; import com.gitee.sop.adminserver.entity.IsvInfo; import com.gitee.sop.adminserver.entity.PermIsvRole; import com.gitee.sop.adminserver.entity.PermRole; @@ -133,7 +135,7 @@ public class IsvApi { @Transactional(rollbackFor = Exception.class) public void addIsv(IsvInfoFormAdd param) throws Exception { if (isvInfoMapper.getByColumn("app_key", param.getAppKey()) != null) { - throw new ApiException("appKey已存在"); + throw new BizException("appKey已存在"); } formatForm(param); IsvInfo rec = new IsvInfo(); @@ -175,9 +177,9 @@ public class IsvApi { try { log.info("消息推送--ISV信息(update), path:{}, data:{}", path, data); ZookeeperContext.updatePathData(path, data); - } catch (Exception e) { + } catch (ZookeeperPathNotExistException e) { log.error("发送isvChannelMsg失败, path:{}, msg:{}", path, data, e); - throw new ApiException("保存失败,请查看日志"); + throw new BizException("路径不存在"); } } @@ -222,7 +224,7 @@ public class IsvApi { routePermissionService.sendIsvRolePermissionToZookeeper(isvInfo.getAppKey(), roleCodeList); } catch (Exception e) { log.error("保存到zookeeper中失败,isvInfo:{}, roleCodeList:{}", isvInfo, roleCodeList); - throw new ApiException("保存失败,请查看日志"); + throw new BizException("保存失败,请查看日志"); } } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitApi.java index 5d5d524c..e6ddb5cd 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitApi.java @@ -4,7 +4,6 @@ import com.gitee.easyopen.annotation.Api; import com.gitee.easyopen.annotation.ApiService; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocMethod; -import com.gitee.easyopen.exception.ApiException; import com.gitee.easyopen.util.CopyUtil; import com.gitee.fastmybatis.core.query.Query; import com.gitee.sop.adminserver.api.service.param.LimitParam; @@ -12,6 +11,7 @@ import com.gitee.sop.adminserver.api.service.param.RouteSearchParam; import com.gitee.sop.adminserver.api.service.result.LimitVO; import com.gitee.sop.adminserver.bean.GatewayRouteDefinition; import com.gitee.sop.adminserver.bean.RouteConfigDto; +import com.gitee.sop.adminserver.common.BizException; import com.gitee.sop.adminserver.common.LimitEnum; import com.gitee.sop.adminserver.entity.ConfigRouteLimit; import com.gitee.sop.adminserver.mapper.ConfigRouteLimitMapper; @@ -118,7 +118,7 @@ public class LimitApi { routeConfigService.sendRouteConfigMsg(routeConfigDto); } catch (Exception e) { log.error("推送限流消息错误, param:{}", param, e); - throw new ApiException("修改失败,请查看日志"); + throw new BizException("修改失败,请查看日志"); } } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java index e31fe409..d67ee856 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java @@ -4,7 +4,6 @@ import com.gitee.easyopen.annotation.Api; import com.gitee.easyopen.annotation.ApiService; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocMethod; -import com.gitee.easyopen.exception.ApiException; import com.gitee.easyopen.util.CopyUtil; import com.gitee.fastmybatis.core.PageInfo; import com.gitee.fastmybatis.core.query.Query; @@ -15,6 +14,7 @@ import com.gitee.sop.adminserver.api.service.param.LimitNewParam; import com.gitee.sop.adminserver.api.service.param.LimitNewUpdateParam; import com.gitee.sop.adminserver.api.service.result.LimitNewVO; import com.gitee.sop.adminserver.bean.ConfigLimitDto; +import com.gitee.sop.adminserver.common.BizException; import com.gitee.sop.adminserver.entity.ConfigLimit; import com.gitee.sop.adminserver.mapper.ConfigLimitMapper; import com.gitee.sop.adminserver.service.RouteConfigService; @@ -65,7 +65,7 @@ public class LimitNewApi { routeConfigService.sendLimitConfigMsg(configLimitDto); } catch (Exception e) { log.error("推送限流消息错误, param:{}", param, e); - throw new ApiException("新增失败,请查看日志"); + throw new BizException("新增失败,请查看日志"); } } @@ -87,7 +87,7 @@ public class LimitNewApi { routeConfigService.sendLimitConfigMsg(configLimitDto); } catch (Exception e) { log.error("推送限流消息错误, param:{}", param, e); - throw new ApiException("修改失败,请查看日志"); + throw new BizException("修改失败,请查看日志"); } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java index ad037c42..a72a29d0 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java @@ -6,11 +6,11 @@ import com.gitee.easyopen.annotation.Api; import com.gitee.easyopen.annotation.ApiService; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocMethod; -import com.gitee.easyopen.exception.ApiException; import com.gitee.easyopen.verify.DefaultMd5Verifier; import com.gitee.fastmybatis.core.query.Query; import com.gitee.sop.adminserver.api.service.param.LogMonitorInstanceAddParam; import com.gitee.sop.adminserver.api.service.result.LogMonitorInstanceVO; +import com.gitee.sop.adminserver.common.BizException; import com.gitee.sop.adminserver.common.QueryUtil; import com.gitee.sop.adminserver.entity.ConfigCommon; import com.gitee.sop.adminserver.mapper.ConfigCommonMapper; @@ -80,7 +80,7 @@ public class LogApi { } } catch (Exception e) { log.error("获取日志信息出错", e); - throw new ApiException("获取日志信息出错"); + throw new BizException("获取日志信息出错"); } } Collections.sort(ret, Comparator.comparing(LogMonitorInstanceVO::getCount)); @@ -98,7 +98,7 @@ public class LogApi { String ipPort = configCommon.getConfigKey(); this.requestLogServer(ipPort, "clearErrors"); } catch (Exception e) { - throw new ApiException("清除失败"); + throw new BizException("清除失败"); } } @@ -122,7 +122,7 @@ public class LogApi { .eq("config_key", ipPort); ConfigCommon rec = configCommonMapper.getByQuery(query); if (rec != null) { - throw new ApiException("该实例已添加"); + throw new BizException("该实例已添加"); } ConfigCommon configCommon = new ConfigCommon(); configCommon.setConfigGroup(LOG_MONITOR_INSTANCE); @@ -137,11 +137,11 @@ public class LogApi { JSONObject jsonObject = JSON.parseObject(json); if (!CODE_SUCCESS.equals(jsonObject.getString("code"))) { log.error("请求结果:{}", json); - throw new ApiException("添加失败"); + throw new BizException("添加失败"); } } catch (Exception e) { log.error("添加失败", e); - throw new ApiException("添加失败"); + throw new BizException("添加失败"); } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java index 433a0b00..526ebba6 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/RouteApi.java @@ -5,18 +5,21 @@ import com.gitee.easyopen.annotation.Api; import com.gitee.easyopen.annotation.ApiService; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocMethod; -import com.gitee.easyopen.exception.ApiException; import com.gitee.easyopen.util.CopyUtil; import com.gitee.fastmybatis.core.query.Query; import com.gitee.sop.adminserver.api.isv.result.RoleVO; -import com.gitee.sop.adminserver.api.service.param.RouteParam; +import com.gitee.sop.adminserver.api.service.param.RouteAddParam; +import com.gitee.sop.adminserver.api.service.param.RouteDeleteParam; import com.gitee.sop.adminserver.api.service.param.RoutePermissionParam; import com.gitee.sop.adminserver.api.service.param.RouteSearchParam; +import com.gitee.sop.adminserver.api.service.param.RouteUpdateParam; import com.gitee.sop.adminserver.api.service.result.RouteVO; -import com.gitee.sop.adminserver.api.service.result.ServiceInfo; import com.gitee.sop.adminserver.bean.GatewayRouteDefinition; import com.gitee.sop.adminserver.bean.RouteConfigDto; import com.gitee.sop.adminserver.bean.ZookeeperContext; +import com.gitee.sop.adminserver.common.BizException; +import com.gitee.sop.adminserver.common.ZookeeperPathExistException; +import com.gitee.sop.adminserver.common.ZookeeperPathNotExistException; import com.gitee.sop.adminserver.entity.ConfigRouteBase; import com.gitee.sop.adminserver.entity.PermRole; import com.gitee.sop.adminserver.entity.PermRolePermission; @@ -28,14 +31,13 @@ import com.gitee.sop.adminserver.service.RoutePermissionService; import com.gitee.sop.adminserver.service.RouteService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -96,67 +98,84 @@ public class RouteApi { return routeDefinitionList; } - @Api(name = "route.update") - @ApiDocMethod(description = "修改路由") - void updateRoute(RouteParam param) throws Exception { - String serviceIdPath = ZookeeperContext.getSopRouteRootPath() + "/" + param.getServiceId(); - String zookeeperRoutePath = serviceIdPath + "/" + param.getId(); - String data = ZookeeperContext.getData(zookeeperRoutePath); - GatewayRouteDefinition routeDefinition = JSON.parseObject(data, GatewayRouteDefinition.class); - CopyUtil.copyPropertiesIgnoreNull(param, routeDefinition); - ZookeeperContext.updatePathData(zookeeperRoutePath, JSON.toJSONString(routeDefinition)); - - this.updateRouteConfig(param); - } - @Api(name = "route.add") @ApiDocMethod(description = "新增路由") - void addRoute(RouteParam param) throws Exception { - String serviceIdPath = ZookeeperContext.getSopRouteRootPath() + "/" + param.getServiceId(); - String zookeeperRoutePath = serviceIdPath + "/" + param.getId(); - if (ZookeeperContext.isPathExist(zookeeperRoutePath)) { - throw new ApiException("id已存在"); - } + void addRoute(RouteAddParam param) { + String id = param.getName() + param.getVersion(); + String routePath = ZookeeperContext.buildRoutePath(param.getServiceId(), id); GatewayRouteDefinition routeDefinition = new GatewayRouteDefinition(); CopyUtil.copyPropertiesIgnoreNull(param, routeDefinition); - ZookeeperContext.createNewData(zookeeperRoutePath, JSON.toJSONString(routeDefinition)); - ServiceInfo serviceInfo = new ServiceInfo(); - serviceInfo.setServiceId(param.getServiceId()); - serviceInfo.setDescription(param.getServiceId()); - String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); - serviceInfo.setCreateTime(now); - serviceInfo.setUpdateTime(now); - ZookeeperContext.updatePathData(serviceIdPath, JSON.toJSONString(serviceInfo)); - - this.updateRouteConfig(param); + routeDefinition.setId(id); + routeDefinition.setCustom(1); + try { + ZookeeperContext.addPath(routePath, JSON.toJSONString(routeDefinition)); + } catch (ZookeeperPathExistException e) { + throw new BizException("路由已存在"); + } + this.updateRouteConfig(routeDefinition); } - private void updateRouteConfig(RouteParam param) { + @Api(name = "route.update") + @ApiDocMethod(description = "修改路由") + void updateRoute(RouteUpdateParam param) { + String routePath = ZookeeperContext.buildRoutePath(param.getServiceId(), param.getId()); + GatewayRouteDefinition routeDefinition = this.getGatewayRouteDefinition(routePath); + CopyUtil.copyPropertiesIgnoreNull(param, routeDefinition); try { - String routeId = param.getId(); + ZookeeperContext.updatePathData(routePath, JSON.toJSONString(routeDefinition)); + } catch (ZookeeperPathNotExistException e) { + throw new BizException("路由不存在"); + } + this.updateRouteConfig(routeDefinition); + } + + @Api(name = "route.del") + @ApiDocMethod(description = "删除路由") + void delRoute(RouteDeleteParam param) { + String routePath = ZookeeperContext.buildRoutePath(param.getServiceId(), param.getId()); + GatewayRouteDefinition routeDefinition = this.getGatewayRouteDefinition(routePath); + if (!BooleanUtils.toBoolean(routeDefinition.getCustom())) { + throw new BizException("非自定义路由,无法删除"); + } + ZookeeperContext.deletePathDeep(routePath); + } + + private GatewayRouteDefinition getGatewayRouteDefinition(String zookeeperRoutePath) { + String data = null; + try { + data = ZookeeperContext.getData(zookeeperRoutePath); + } catch (ZookeeperPathNotExistException e) { + throw new BizException("路由不存在"); + } + return JSON.parseObject(data, GatewayRouteDefinition.class); + } + + private void updateRouteConfig(GatewayRouteDefinition routeDefinition) { + try { + String routeId = routeDefinition.getId(); ConfigRouteBase configRouteBase = configRouteBaseMapper.getByColumn("route_id", routeId); boolean doSave = configRouteBase == null; if (doSave) { configRouteBase = new ConfigRouteBase(); - configRouteBase.setRouteId(param.getId()); + configRouteBase.setRouteId(routeId); } - configRouteBase.setStatus(param.getStatus().byteValue()); + configRouteBase.setStatus((byte) routeDefinition.getStatus()); int i = doSave ? configRouteBaseMapper.save(configRouteBase) : configRouteBaseMapper.update(configRouteBase); if (i > 0) { - this.sendMsg(param); + this.sendMsg(routeDefinition); } } catch (Exception e) { log.error("发送msg失败", e); } } - private void sendMsg(RouteParam param) throws Exception { + private void sendMsg(GatewayRouteDefinition routeDefinition) { RouteConfigDto routeConfigDto = new RouteConfigDto(); - routeConfigDto.setRouteId(param.getId()); - routeConfigDto.setStatus(param.getStatus()); + routeConfigDto.setRouteId(routeDefinition.getId()); + routeConfigDto.setStatus(routeDefinition.getStatus()); routeConfigService.sendRouteConfigMsg(routeConfigDto); } @@ -164,7 +183,7 @@ public class RouteApi { @ApiDocMethod(description = "获取路由对应的角色", elementClass = RoleVO.class) List getRouteRole(RouteSearchParam param) { if (StringUtils.isBlank(param.getId())) { - throw new ApiException("id不能为空"); + throw new BizException("id不能为空"); } return this.getRouteRole(param.getId()); } @@ -209,7 +228,7 @@ public class RouteApi { routePermissionService.sendRoutePermissionReloadMsg(); } catch (Exception e) { log.info("消息推送--路由权限(reload)失败", e); - throw new ApiException("修改失败,请查看日志"); + throw new BizException("修改失败,请查看日志"); } } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java index 93653a3b..3d2c972e 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/ServiceApi.java @@ -5,7 +5,7 @@ import com.gitee.easyopen.annotation.Api; import com.gitee.easyopen.annotation.ApiService; import com.gitee.easyopen.doc.annotation.ApiDoc; import com.gitee.easyopen.doc.annotation.ApiDocMethod; -import com.gitee.easyopen.exception.ApiException; +import com.gitee.sop.adminserver.api.service.param.ServiceAddParam; import com.gitee.sop.adminserver.api.service.param.ServiceInstanceParam; import com.gitee.sop.adminserver.api.service.param.ServiceSearchParam; import com.gitee.sop.adminserver.api.service.result.ServiceInfo; @@ -14,11 +14,16 @@ import com.gitee.sop.adminserver.bean.EurekaApplication; import com.gitee.sop.adminserver.bean.EurekaApps; import com.gitee.sop.adminserver.bean.EurekaInstance; import com.gitee.sop.adminserver.bean.EurekaUri; +import com.gitee.sop.adminserver.bean.ServiceRouteInfo; import com.gitee.sop.adminserver.bean.ZookeeperContext; +import com.gitee.sop.adminserver.common.BizException; +import com.gitee.sop.adminserver.common.ZookeeperPathExistException; +import com.gitee.sop.adminserver.common.ZookeeperPathNotExistException; import lombok.extern.slf4j.Slf4j; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.StringUtils; import org.apache.curator.framework.recipes.cache.ChildData; import org.springframework.beans.BeanUtils; @@ -28,6 +33,7 @@ import org.springframework.core.env.Environment; import javax.annotation.PostConstruct; import java.io.IOException; import java.util.ArrayList; +import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -48,8 +54,6 @@ public class ServiceApi { private String eurekaUrl; - // eureka.client.serviceUrl.defaultZone - @Api(name = "service.list") @ApiDocMethod(description = "服务列表(旧)", elementClass = ServiceInfo.class) List listServiceInfo(ServiceSearchParam param) throws Exception { @@ -74,6 +78,48 @@ public class ServiceApi { return serviceInfoList; } + @Api(name = "service.custom.add") + @ApiDocMethod(description = "添加服务") + void addService(ServiceAddParam param) { + String serviceId = param.getServiceId(); + String servicePath = ZookeeperContext.buildServiceIdPath(serviceId); + ServiceRouteInfo serviceRouteInfo = new ServiceRouteInfo(); + Date now = new Date(); + serviceRouteInfo.setServiceId(serviceId); + serviceRouteInfo.setDescription("自定义服务"); + serviceRouteInfo.setCreateTime(now); + serviceRouteInfo.setUpdateTime(now); + serviceRouteInfo.setCustom(BooleanUtils.toInteger(true)); + String serviceData = JSON.toJSONString(serviceRouteInfo); + try { + ZookeeperContext.addPath(servicePath, serviceData); + } catch (ZookeeperPathExistException e) { + throw new BizException("服务已存在"); + } + } + + @Api(name = "service.custom.del") + @ApiDocMethod(description = "删除自定义服务") + void delService(ServiceSearchParam param) { + String serviceId = param.getServiceId(); + String servicePath = ZookeeperContext.buildServiceIdPath(serviceId); + String data = null; + try { + data = ZookeeperContext.getData(servicePath); + } catch (ZookeeperPathNotExistException e) { + throw new BizException("服务不存在"); + } + if (StringUtils.isBlank(data)) { + throw new BizException("非自定义服务,无法删除"); + } + ServiceRouteInfo serviceRouteInfo = JSON.parseObject(data, ServiceRouteInfo.class); + int custom = serviceRouteInfo.getCustom(); + if (!BooleanUtils.toBoolean(custom)) { + throw new BizException("非自定义服务,无法删除"); + } + ZookeeperContext.deletePathDeep(servicePath); + } + @Api(name = "service.instance.list") @ApiDocMethod(description = "服务列表", elementClass = ServiceInfoVo.class) List listService(ServiceSearchParam param) throws Exception { @@ -133,7 +179,7 @@ public class ServiceApi { return response.body().string(); } else { log.error("操作失败,url:{}, msg:{}, code:{}", eurekaUri.getUri(args), response.message(), response.code()); - throw new ApiException("操作失败", String.valueOf(response.code())); + throw new BizException("操作失败", String.valueOf(response.code())); } } @@ -141,7 +187,7 @@ public class ServiceApi { protected void after() { String eurekaUrls = environment.getProperty("eureka.client.serviceUrl.defaultZone"); if (StringUtils.isBlank(eurekaUrls)) { - throw new ApiException("未指定eureka.client.serviceUrl.defaultZone参数"); + throw new BizException("未指定eureka.client.serviceUrl.defaultZone参数"); } String url = eurekaUrls.split("\\,")[0]; if (url.endsWith("/")) { diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewAddParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewAddParam.java index 0936c270..e7da2c63 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewAddParam.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewAddParam.java @@ -41,10 +41,12 @@ public class LimitNewAddParam { /** 返回的错误码, 数据库字段:limit_code */ @ApiDocField(description = "返回的错误码") + @Length(max = 64, message = "limitCode长度不能超过64") private String limitCode; /** 返回的错误信息, 数据库字段:limit_msg */ @ApiDocField(description = "返回的错误信息") + @Length(max = 100, message = "limitMsg长度不能超过100") private String limitMsg; /** 令牌桶容量, 数据库字段:token_bucket_count */ diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewUpdateParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewUpdateParam.java index d04630e6..aebadc77 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewUpdateParam.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/LimitNewUpdateParam.java @@ -46,10 +46,12 @@ public class LimitNewUpdateParam { /** 返回的错误码, 数据库字段:limit_code */ @ApiDocField(description = "返回的错误码") + @Length(max = 64, message = "limitCode长度不能超过64") private String limitCode; /** 返回的错误信息, 数据库字段:limit_msg */ @ApiDocField(description = "返回的错误信息") + @Length(max = 100, message = "limitMsg长度不能超过100") private String limitMsg; /** 令牌桶容量, 数据库字段:token_bucket_count */ diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteAddParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteAddParam.java new file mode 100644 index 00000000..f72a274e --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteAddParam.java @@ -0,0 +1,76 @@ +package com.gitee.sop.adminserver.api.service.param; + +import com.gitee.easyopen.doc.annotation.ApiDocField; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * @author tanghc + */ +@Getter +@Setter +public class RouteAddParam { + + @NotBlank(message = "serviceId不能为空") + @Length(max = 100, message = "serviceId长度不能超过100") + @ApiDocField(description = "serviceId") + private String serviceId; + + /** + * 接口名 + */ + @NotBlank(message = "接口名不能为空") + @Length(max = 100, message = "name长度不能超过100") + @ApiDocField(description = "接口名") + private String name; + + /** + * 版本号 + */ + @NotBlank(message = "版本号不能为空") + @Length(max = 100, message = "version长度不能超过100") + @ApiDocField(description = "版本号") + private String version; + + /** + * 路由规则转发的目标uri + */ + @NotBlank(message = "uri不能为空") + @Length(max = 100, message = "uri长度不能超过100") + @ApiDocField(description = "路由uri") + private String uri; + + /** + * uri后面跟的path + */ + @ApiDocField(description = "路由path") + @Length(max = 100, message = "path长度不能超过100") + private String path; + + /** + * 是否忽略验证,业务参数验证除外 + */ + @ApiDocField(description = "是否忽略验证,业务参数验证除外,1:忽略,0:不忽略") + private Integer ignoreValidate; + + /** + * 合并结果,统一格式输出 + */ + @ApiDocField(description = "合并结果,统一格式输出,1:合并,2:不合并") + private Integer mergeResult; + + /** + * 状态 + */ + @NotNull + @ApiDocField(description = "状态,0:审核,1:启用,2:禁用") + private Integer status; + + @ApiDocField(description = "是否是自定义路由,1:是,0:否") + private Integer custom; + +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteDeleteParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteDeleteParam.java new file mode 100644 index 00000000..8ab52da5 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteDeleteParam.java @@ -0,0 +1,22 @@ +package com.gitee.sop.adminserver.api.service.param; + +import com.gitee.easyopen.doc.annotation.ApiDocField; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * @author tanghc + */ +@Getter +@Setter +public class RouteDeleteParam { + @ApiDocField(description = "服务名serviceId") + @NotBlank(message = "serviceId不能为空") + private String serviceId; + + @ApiDocField(description = "路由id") + @NotBlank(message = "id不能为空") + private String id; +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteUpdateParam.java similarity index 54% rename from sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteParam.java rename to sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteUpdateParam.java index 3ea6bbd4..be0ccf1c 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteParam.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/RouteUpdateParam.java @@ -3,6 +3,7 @@ package com.gitee.sop.adminserver.api.service.param; import com.gitee.easyopen.doc.annotation.ApiDocField; import lombok.Getter; import lombok.Setter; +import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -12,23 +13,25 @@ import javax.validation.constraints.NotNull; */ @Getter @Setter -public class RouteParam { - - @NotBlank(message = "serviceId不能为空") - @ApiDocField(description = "serviceId") - private String serviceId; +public class RouteUpdateParam { /** * 路由的Id */ @NotBlank(message = "id不能为空") @ApiDocField(description = "路由id") - private String id = ""; + private String id; + + @NotBlank(message = "serviceId不能为空") + @Length(max = 100, message = "serviceId长度不能超过100") + @ApiDocField(description = "serviceId") + private String serviceId; /** * 路由规则转发的目标uri */ @NotBlank(message = "uri不能为空") + @Length(max = 100, message = "uri长度不能超过100") @ApiDocField(description = "路由uri") private String uri; @@ -36,8 +39,21 @@ public class RouteParam { * uri后面跟的path */ @ApiDocField(description = "路由path") + @Length(max = 100, message = "path长度不能超过100") private String path; + /** + * 是否忽略验证,业务参数验证除外 + */ + @ApiDocField(description = "是否忽略验证,业务参数验证除外,1:忽略,0:不忽略") + private Integer ignoreValidate; + + /** + * 合并结果,统一格式输出 + */ + @ApiDocField(description = "合并结果,统一格式输出,1:合并,2:不合并") + private Integer mergeResult; + /** * 状态 */ @@ -45,4 +61,7 @@ public class RouteParam { @ApiDocField(description = "状态,0:审核,1:启用,2:禁用") private Integer status; + @ApiDocField(description = "是否是自定义路由,1:是,0:否") + private Integer custom; + } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/ServiceAddParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/ServiceAddParam.java new file mode 100644 index 00000000..e9dedcbc --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/param/ServiceAddParam.java @@ -0,0 +1,21 @@ +package com.gitee.sop.adminserver.api.service.param; + +import com.gitee.easyopen.doc.annotation.ApiDocField; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; + +/** + * @author tanghc + */ +@Getter +@Setter +public class ServiceAddParam { + + @ApiDocField(description = "服务名serviceId") + @Length(max = 100, message = "长度不能超过100") + @NotBlank(message = "serviceId不能为空") + private String serviceId; +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/result/ServiceInfo.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/result/ServiceInfo.java index 85d561fb..b44a4e29 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/result/ServiceInfo.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/result/ServiceInfo.java @@ -19,4 +19,8 @@ public class ServiceInfo { @ApiDocField(description = "描述") private String description; + + /** 是否是自定义服务,1:是,0:否 */ + @ApiDocField(description = "是否是自定义服务,1:是,0:否") + private Integer custom; } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/GatewayRouteDefinition.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/GatewayRouteDefinition.java index 8ad92c47..9dd60585 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/GatewayRouteDefinition.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/GatewayRouteDefinition.java @@ -1,5 +1,6 @@ package com.gitee.sop.adminserver.bean; +import com.alibaba.fastjson.annotation.JSONField; import com.gitee.easyopen.doc.annotation.ApiDocField; import lombok.Data; @@ -30,11 +31,13 @@ public class GatewayRouteDefinition { /** * 路由断言集合配置 */ + @JSONField(serialize = false) private List predicates = new ArrayList<>(); /** * 路由过滤器集合配置 */ + @JSONField(serialize = false) private List filters = new ArrayList<>(); /** @@ -67,14 +70,20 @@ public class GatewayRouteDefinition { private int status = 1; /** - * 合并结果 + * 合并结果,统一格式输出 */ - @ApiDocField(description = "合并结果,1:合并,2:不合并") + @ApiDocField(description = "合并结果,统一格式输出,1:合并,0:不合并") private int mergeResult = 1; /** * 是否需要授权才能访问 */ - @ApiDocField(description = "是否需要授权才能访问,1:是,2:否") + @ApiDocField(description = "是否需要授权才能访问,1:是,0:否") private int permission; + + /** + * 是否是自定义路由 + */ + @ApiDocField(description = "是否是自定义路由,1:是,0:否") + private int custom; } \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceRouteInfo.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceRouteInfo.java index 25317cf2..9a3d1034 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceRouteInfo.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceRouteInfo.java @@ -24,4 +24,7 @@ public class ServiceRouteInfo { @JSONField(serialize = false) private List routeDefinitionList; + + /** 是否是自定义服务,1:是,0:否 */ + private int custom; } \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java index 8f8d8487..2f2ae540 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ZookeeperContext.java @@ -1,6 +1,9 @@ package com.gitee.sop.adminserver.bean; -import com.gitee.easyopen.exception.ApiException; +import com.gitee.sop.adminserver.common.ZookeeperOperationException; +import com.gitee.sop.adminserver.common.ZookeeperPathExistException; +import com.gitee.sop.adminserver.common.ZookeeperPathNotExistException; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.curator.framework.CuratorFramework; @@ -23,6 +26,7 @@ import static com.gitee.sop.adminserver.bean.SopAdminConstants.SOP_ROUTE_PERMISS * @author tanghc */ @Configuration +@Slf4j public class ZookeeperContext { private static CuratorFramework client; @@ -55,6 +59,24 @@ public class ZookeeperContext { return SopAdminConstants.SOP_SERVICE_ROUTE_PATH; } + public static String buildServiceIdPath(String serviceId) { + if (StringUtils.isBlank(serviceId)) { + throw new NullPointerException("serviceId不能为空"); + } + return getSopRouteRootPath() + "/" + serviceId; + } + + public static String buildRoutePath(String serviceId, String routeId) { + if (StringUtils.isBlank(serviceId)) { + throw new NullPointerException("serviceId不能为空"); + } + if (StringUtils.isBlank(routeId)) { + throw new NullPointerException("routeId不能为空"); + } + String serviceIdPath = getSopRouteRootPath() + "/" + serviceId; + return serviceIdPath + "/" + routeId; + } + public static String getRoutePermissionPath() { return SOP_ROUTE_PERMISSION_PATH; } @@ -95,30 +117,72 @@ public class ZookeeperContext { * 对已存在的path赋值。如果path不存在抛异常 * * @param path 已存在的 - * @param data + * @param data 数据 * @return - * @throws Exception + * @throws ZookeeperPathNotExistException */ - public static Stat updatePathData(String path, String data) throws Exception { + public static Stat updatePathData(String path, String data) throws ZookeeperPathNotExistException { if (!isPathExist(path)) { - throw new ApiException("path " + path + " 不存在"); + throw new ZookeeperPathNotExistException("path " + path + " 不存在"); + } + try { + return getClient().setData().forPath(path, data.getBytes()); + } catch (Exception e) { + throw new ZookeeperOperationException("updatePathData error, path=" + path, e); } - return getClient().setData().forPath(path, data.getBytes()); } /** * 创建新的path,并赋值。如果path已存在抛异常 * @param path 待创建的path * @param data 值 + * @throws ZookeeperPathExistException */ - public static String createNewData(String path, String data) throws Exception { + public static String addPath(String path, String data) throws ZookeeperPathExistException { if (isPathExist(path)) { - throw new ApiException("path " + path + " 已存在"); + throw new ZookeeperPathExistException("path " + path + " 已存在"); + } + try { + return getClient().create() + // 如果指定节点的父节点不存在,则Curator将会自动级联创建父节点 + .creatingParentContainersIfNeeded() + .forPath(path, data.getBytes()); + } catch (Exception e) { + throw new ZookeeperOperationException("addPath error path=" + path, e); + } + } + + /** + * 删除节点及子节点 + * @param path + */ + public static void deletePathDeep(String path) { + try { + getClient().delete() + .deletingChildrenIfNeeded() + .forPath(path); + } catch (Exception e) { + throw new ZookeeperOperationException("deletePathDeep error path=" + path, e); + } + } + + /** + * 创建新的path,并赋值。如果path已存在则不创建 + * @param path 待创建的path + * @param data 值 + */ + public static String addPathQuietly(String path, String data) { + if (isPathExist(path)) { + return path; + } + try { + return getClient().create() + // 如果指定节点的父节点不存在,则Curator将会自动级联创建父节点 + .creatingParentContainersIfNeeded() + .forPath(path, data.getBytes()); + } catch (Exception e) { + throw new ZookeeperOperationException("addPathQuietly error path=" + path, e); } - return getClient().create() - // 如果指定节点的父节点不存在,则Curator将会自动级联创建父节点 - .creatingParentContainersIfNeeded() - .forPath(path, data.getBytes()); } /** @@ -126,23 +190,36 @@ public class ZookeeperContext { * @param path * @param data * @return - * @throws Exception */ - public static String createOrUpdateData(String path, String data) throws Exception { - return getClient().create() - // 如果节点存在则Curator将会使用给出的数据设置这个节点的值 - .orSetData() - // 如果指定节点的父节点不存在,则Curator将会自动级联创建父节点 - .creatingParentContainersIfNeeded() - .forPath(path, data.getBytes()); + public static String createOrUpdateData(String path, String data) { + try { + return getClient().create() + // 如果节点存在则Curator将会使用给出的数据设置这个节点的值 + .orSetData() + // 如果指定节点的父节点不存在,则Curator将会自动级联创建父节点 + .creatingParentContainersIfNeeded() + .forPath(path, data.getBytes()); + } catch (Exception e) { + throw new ZookeeperOperationException("createOrUpdateData error path=" + path, e); + } } - public static String getData(String path) throws Exception { + /** + * 获取节点内容 + * @param path + * @return + * @throws ZookeeperPathNotExistException + */ + public static String getData(String path) throws ZookeeperPathNotExistException { if (!isPathExist(path)) { - return null; + throw new ZookeeperPathNotExistException("path 不存在, path=" + path); + } + try { + byte[] data = getClient().getData().forPath(path); + return new String(data); + } catch (Exception e) { + throw new ZookeeperOperationException("getData error path=" + path, e); } - byte[] data = getClient().getData().forPath(path); - return new String(data); } /** @@ -150,9 +227,8 @@ public class ZookeeperContext { * * @param parentPath 父节点 * @return - * @throws Exception */ - public static List getChildrenData(String parentPath) throws Exception { + public static List getChildrenData(String parentPath) { PathChildrenCache pathChildrenCache = buildPathChildrenCache(parentPath); if (pathChildrenCache == null) { return Collections.emptyList(); @@ -160,7 +236,7 @@ public class ZookeeperContext { return pathChildrenCache.getCurrentData(); } - public static PathChildrenCache buildPathChildrenCache(String path) throws Exception { + public static PathChildrenCache buildPathChildrenCache(String path) { if (!isPathExist(path)) { return null; } @@ -168,7 +244,11 @@ public class ZookeeperContext { // 且第三个参数要设置为true,不然ChildData对象中的getData返回null PathChildrenCache childrenCache = new PathChildrenCache(client, path, true); // 列出子节点数据列表,需要使用BUILD_INITIAL_CACHE同步初始化模式才能获得,异步是获取不到的 - childrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE); + try { + childrenCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE); + } catch (Exception e) { + throw new ZookeeperOperationException("buildPathChildrenCache error path=" + path, e); + } return childrenCache; } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/BizException.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/BizException.java new file mode 100644 index 00000000..0c7c46ce --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/BizException.java @@ -0,0 +1,33 @@ +package com.gitee.sop.adminserver.common; + +import com.gitee.easyopen.exception.ApiException; +import com.gitee.easyopen.message.Error; + +/** + * @author tanghc + */ +public class BizException extends ApiException { + public BizException(String msg) { + super(msg, "4000"); + } + + public BizException(Exception e) { + super(e); + } + + public BizException(Error error) { + super(error); + } + + public BizException(String msg, String code) { + super(msg, code); + } + + public BizException(String msg, String code, Object data) { + super(msg, code, data); + } + + public BizException(Error error, Object data) { + super(error, data); + } +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperOperationException.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperOperationException.java new file mode 100644 index 00000000..d75f35df --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperOperationException.java @@ -0,0 +1,26 @@ +package com.gitee.sop.adminserver.common; + +/** + * @author tanghc + */ +public class ZookeeperOperationException extends RuntimeException { + + public ZookeeperOperationException() { + } + + public ZookeeperOperationException(String message) { + super(message); + } + + public ZookeeperOperationException(String message, Throwable cause) { + super(message, cause); + } + + public ZookeeperOperationException(Throwable cause) { + super(cause); + } + + public ZookeeperOperationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathExistException.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathExistException.java new file mode 100644 index 00000000..4ec2e104 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathExistException.java @@ -0,0 +1,10 @@ +package com.gitee.sop.adminserver.common; + +/** + * @author tanghc + */ +public class ZookeeperPathExistException extends Exception { + public ZookeeperPathExistException(String message) { + super(message); + } +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathNotExistException.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathNotExistException.java new file mode 100644 index 00000000..bf690146 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ZookeeperPathNotExistException.java @@ -0,0 +1,10 @@ +package com.gitee.sop.adminserver.common; + +/** + * @author tanghc + */ +public class ZookeeperPathNotExistException extends Exception { + public ZookeeperPathNotExistException(String message) { + super(message); + } +} diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteConfigService.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteConfigService.java index ac02f8db..0b09a09b 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteConfigService.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteConfigService.java @@ -20,7 +20,7 @@ public class RouteConfigService { * @param routeConfigDto * @throws Exception */ - public void sendRouteConfigMsg(RouteConfigDto routeConfigDto) throws Exception { + public void sendRouteConfigMsg(RouteConfigDto routeConfigDto) { String configData = JSON.toJSONString(routeConfigDto); ChannelMsg channelMsg = new ChannelMsg("update", configData); String jsonData = JSON.toJSONString(channelMsg); diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteService.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteService.java index 4b48c084..b3fe1670 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteService.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/service/RouteService.java @@ -10,7 +10,6 @@ import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; -import java.util.stream.Stream; import static java.util.stream.Collectors.toList; @@ -44,8 +43,7 @@ public class RouteService { return isRoute && gatewayRouteDefinition.getId().contains(id); } }) - .collect(toList()) - ; + .collect(toList()); return routeDefinitionStream; } diff --git a/sop-admin/sop-admin-server/src/main/resources/public/index.html b/sop-admin/sop-admin-server/src/main/resources/public/index.html index 73897f95..ddd04955 100644 --- a/sop-admin/sop-admin-server/src/main/resources/public/index.html +++ b/sop-admin/sop-admin-server/src/main/resources/public/index.html @@ -1 +1 @@ -SOP Admin
\ No newline at end of file +SOP Admin
\ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-29b24c82.857979fb.css b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-29b24c82.857979fb.css deleted file mode 100644 index 26ea8fa2..00000000 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-29b24c82.857979fb.css +++ /dev/null @@ -1 +0,0 @@ -.limit-tip[data-v-29df7fee]{cursor:pointer;margin-left:10px} \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-2a9bc230.2dae711a.css b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-2a9bc230.2dae711a.css new file mode 100644 index 00000000..0852192c --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-2a9bc230.2dae711a.css @@ -0,0 +1 @@ +.limit-tip[data-v-31efca04]{cursor:pointer;margin-left:10px} \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-19100986.a43114f3.css b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-37401378.a43114f3.css similarity index 100% rename from sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-19100986.a43114f3.css rename to sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-37401378.a43114f3.css diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-6a68a33e.3b12267b.css b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-6a68a33e.3b12267b.css new file mode 100644 index 00000000..e41f7849 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-6a68a33e.3b12267b.css @@ -0,0 +1 @@ +.custom-tree-node{-webkit-box-flex:1;-ms-flex:1;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;font-size:14px;padding-right:8px}.el-input.is-disabled .el-input__inner,.el-radio__input.is-disabled+span.el-radio__label{color:#909399} \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.36a3cb86.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.3225a72c.js similarity index 64% rename from sop-admin/sop-admin-server/src/main/resources/public/static/js/app.36a3cb86.js rename to sop-admin/sop-admin-server/src/main/resources/public/static/js/app.3225a72c.js index d0df45df..5612aac1 100644 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.36a3cb86.js +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.3225a72c.js @@ -1 +1 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(e,t,n){e.exports=n("56d7")},"0cb8":function(e,t,n){},"186a":function(e,t,n){"use strict";var a=n("dc52"),i=n.n(a);i.a},"18f0":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"1f59":function(e,t,n){},2536:function(e,t,n){},2635:function(e,t,n){},"2a3d":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"30c3":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"34c8":function(e,t,n){"use strict";var a=n("5332"),i=n.n(a);i.a},"405a":function(e,t,n){"use strict";var a=n("1f59"),i=n.n(a);i.a},"47f1":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"4df5":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});r.a.add(s);t["default"]=s},"50be":function(e,t,n){"use strict";var a=n("2536"),i=n.n(a);i.a},"51ff":function(e,t,n){var a={"./dashboard.svg":"f782","./example.svg":"30c3","./eye-open.svg":"d7ec","./eye.svg":"4df5","./form.svg":"eb1b","./link.svg":"18f0","./nested.svg":"dcf8","./password.svg":"2a3d","./table.svg":"47f1","./tree.svg":"93cd","./user.svg":"b3b5"};function i(e){var t=o(e);return n(t)}function o(e){var t=a[e];if(!(t+1)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return t}i.keys=function(){return Object.keys(a)},i.resolve=o,e.exports=i,i.id="51ff"},5332:function(e,t,n){},"56d7":function(e,t,n){"use strict";n.r(t);n("cadf"),n("551c"),n("f751"),n("097d");var a=n("2b0e"),i=(n("f5df"),n("5c96")),o=n.n(i),r=(n("0fae"),n("f0d9")),s=n.n(r),c=(n("b20f"),function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("router-view")],1)}),u=[],l={name:"App"},d=l,m=n("2877"),h=Object(m["a"])(d,c,u,!1,null,null,null),f=h.exports,p=n("2f62"),v=(n("7f7f"),{sidebar:function(e){return e.app.sidebar},device:function(e){return e.app.device},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},name:function(e){return e.user.name}}),b=v,g=n("a78e"),w=n.n(g),x={sidebar:{opened:!w.a.get("sidebarStatus")||!!+w.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop"},y={TOGGLE_SIDEBAR:function(e){e.sidebar.opened=!e.sidebar.opened,e.sidebar.withoutAnimation=!1,e.sidebar.opened?w.a.set("sidebarStatus",1):w.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(e,t){w.a.set("sidebarStatus",0),e.sidebar.opened=!1,e.sidebar.withoutAnimation=t},TOGGLE_DEVICE:function(e,t){e.device=t}},_={toggleSideBar:function(e){var t=e.commit;t("TOGGLE_SIDEBAR")},closeSideBar:function(e,t){var n=e.commit,a=t.withoutAnimation;n("CLOSE_SIDEBAR",a)},toggleDevice:function(e,t){var n=e.commit;n("TOGGLE_DEVICE",t)}},C={namespaced:!0,state:x,mutations:y,actions:_},k=n("83d6"),O=n.n(k),S=O.a.showSettings,z=O.a.fixedHeader,B=O.a.sidebarLogo,H={showSettings:S,fixedHeader:z,sidebarLogo:B},M={CHANGE_SETTING:function(e,t){var n=t.key,a=t.value;e.hasOwnProperty(n)&&(e[n]=a)}},T={changeSetting:function(e,t){var n=e.commit;n("CHANGE_SETTING",t)}},E={namespaced:!0,state:H,mutations:M,actions:T},L=n("bc3a"),$=n.n(L),V=n("5f87"),A=$.a.create({baseURL:"/api",withCredentials:!0,timeout:5e3});A.interceptors.request.use(function(e){return bt.getters.token&&(e.headers["X-Token"]=Object(V["a"])()),e},function(e){return console.log(e),Promise.reject(e)}),A.interceptors.response.use(function(e){var t=e.data;return 2e4!==t.code?(Object(i["Message"])({message:t.message||"error",type:"error",duration:5e3}),50008!==t.code&&50012!==t.code&&50014!==t.code||i["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then(function(){bt.dispatch("user/resetToken").then(function(){location.reload()})}),Promise.reject(t.message||"error")):t},function(e){return console.log("err"+e),Object(i["Message"])({message:e.message,type:"error",duration:5e3}),Promise.reject(e)});var j=A;function P(e){return j({url:"/user/login",method:"post",data:e})}function I(e){return j({url:"/user/info",method:"get",params:{token:e}})}function N(){return j({url:"/user/logout",method:"post"})}var D=n("8c4f"),q=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-wrapper",class:e.classObj},["mobile"===e.device&&e.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:e.handleClickOutside}}):e._e(),e._v(" "),n("sidebar",{staticClass:"sidebar-container"}),e._v(" "),n("div",{staticClass:"main-container"},[n("div",{class:{"fixed-header":e.fixedHeader}},[n("navbar")],1),e._v(" "),n("app-main")],1)],1)},R=[],G=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"navbar"},[n("hamburger",{staticClass:"hamburger-container",attrs:{"is-active":e.sidebar.opened},on:{toggleClick:e.toggleSideBar}}),e._v(" "),n("breadcrumb",{staticClass:"breadcrumb-container"}),e._v(" "),n("div",{staticClass:"right-menu"},[n("el-button",{staticStyle:{"margin-right":"10px"},attrs:{type:"text"},on:{click:e.doLogout}},[e._v("退出")])],1)],1)},F=[],U=n("cebc"),K=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-breadcrumb",{staticClass:"app-breadcrumb",attrs:{separator:"/"}},[n("transition-group",{attrs:{name:"breadcrumb"}},e._l(e.levelList,function(t,a){return n("el-breadcrumb-item",{key:t.path},["noRedirect"===t.redirect||a==e.levelList.length-1?n("span",{staticClass:"no-redirect"},[e._v(e._s(t.meta.title))]):n("a",{on:{click:function(n){return n.preventDefault(),e.handleLink(t)}}},[e._v(e._s(t.meta.title))])])}),1)],1)},W=[],J=n("bd11"),X=n.n(J),Y={data:function(){return{levelList:null}},watch:{$route:function(){this.getBreadcrumb()}},created:function(){this.getBreadcrumb()},methods:{getBreadcrumb:function(){var e=this.$route.matched.filter(function(e){return e.meta&&e.meta.title}),t=e[0];this.isDashboard(t)||(e=[{path:"/dashboard",meta:{title:"Dashboard"}}].concat(e)),this.levelList=e.filter(function(e){return e.meta&&e.meta.title&&!1!==e.meta.breadcrumb})},isDashboard:function(e){var t=e&&e.name;return!!t&&t.trim().toLocaleLowerCase()==="Dashboard".toLocaleLowerCase()},pathCompile:function(e){var t=this.$route.params,n=X.a.compile(e);return n(t)},handleLink:function(e){var t=e.redirect,n=e.path;t?this.$router.push(t):this.$router.push(this.pathCompile(n))}}},Q=Y,Z=(n("34c8"),Object(m["a"])(Q,K,W,!1,null,"62cc9144",null)),ee=Z.exports,te=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticStyle:{padding:"0 15px"},on:{click:e.toggleClick}},[n("svg",{staticClass:"hamburger",class:{"is-active":e.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[n("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},ne=[],ae={name:"Hamburger",props:{isActive:{type:Boolean,default:!1}},methods:{toggleClick:function(){this.$emit("toggleClick")}}},ie=ae,oe=(n("186a"),Object(m["a"])(ie,te,ne,!1,null,"49e15297",null)),re=oe.exports,se={components:{Breadcrumb:ee,Hamburger:re},computed:Object(U["a"])({},Object(p["b"])(["sidebar","avatar"])),methods:{toggleSideBar:function(){this.$store.dispatch("app/toggleSideBar")},doLogout:function(){this.logout()}}},ce=se,ue=(n("405a"),Object(m["a"])(ce,G,F,!1,null,"1eff5c58",null)),le=ue.exports,de=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:{"has-logo":e.showLogo}},[e.showLogo?n("logo",{attrs:{collapse:e.isCollapse}}):e._e(),e._v(" "),n("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[n("el-menu",{attrs:{"default-active":e.activeMenu,collapse:e.isCollapse,"background-color":e.variables.menuBg,"text-color":e.variables.menuText,"unique-opened":!1,"active-text-color":e.variables.menuActiveText,"collapse-transition":!1,mode:"vertical"}},e._l(e.routes,function(e){return n("sidebar-item",{key:e.path,attrs:{item:e,"base-path":e.path}})}),1)],1)],1)},me=[],he=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-logo-container",class:{collapse:e.collapse}},[n("transition",{attrs:{name:"sidebarLogoFade"}},[e.collapse?n("router-link",{key:"collapse",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])]):n("router-link",{key:"expand",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):e._e(),e._v(" "),n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])])],1)],1)},fe=[],pe={name:"SidebarLogo",props:{collapse:{type:Boolean,required:!0}},data:function(){return{title:"SOP Admin",logo:"https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png"}}},ve=pe,be=(n("7c27"),Object(m["a"])(ve,he,fe,!1,null,"b905289c",null)),ge=be.exports,we=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.item.hidden?e._e():n("div",{staticClass:"menu-wrapper"},[!e.hasOneShowingChild(e.item.children,e.item)||e.onlyOneChild.children&&!e.onlyOneChild.noShowingChildren||e.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:e.resolvePath(e.item.path),"popper-append-to-body":""}},[n("template",{slot:"title"},[e.item.meta?n("item",{attrs:{icon:e.item.meta&&e.item.meta.icon,title:e.item.meta.title}}):e._e()],1),e._v(" "),e._l(e.item.children,function(t){return n("sidebar-item",{key:t.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:t,"base-path":e.resolvePath(t.path)}})})],2):[e.onlyOneChild.meta?n("app-link",{attrs:{to:e.resolvePath(e.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!e.isNest},attrs:{index:e.resolvePath(e.onlyOneChild.path)}},[n("item",{attrs:{icon:e.onlyOneChild.meta.icon||e.item.meta&&e.item.meta.icon,title:e.onlyOneChild.meta.title}})],1)],1):e._e()]],2)},xe=[],ye=n("df7c"),_e=n.n(ye);function Ce(e){return/^(https?:|mailto:|tel:)/.test(e)}var ke,Oe,Se={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(e,t){var n=t.props,a=n.icon,i=n.title,o=[];return a&&o.push(e("svg-icon",{attrs:{"icon-class":a}})),i&&o.push(e("span",{slot:"title"},[i])),o}},ze=Se,Be=Object(m["a"])(ze,ke,Oe,!1,null,null,null),He=Be.exports,Me=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("component",e._b({},"component",e.linkProps(e.to),!1),[e._t("default")],2)},Te=[],Ee={props:{to:{type:String,required:!0}},methods:{linkProps:function(e){return Ce(e)?{is:"a",href:e,target:"_blank",rel:"noopener"}:{is:"router-link",to:e}}}},Le=Ee,$e=Object(m["a"])(Le,Me,Te,!1,null,null,null),Ve=$e.exports,Ae={computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var e=this,t=this.$refs.subMenu;if(t){var n=t.handleMouseleave;t.handleMouseleave=function(t){"mobile"!==e.device&&n(t)}}}}},je={name:"SidebarItem",components:{Item:He,AppLink:Ve},mixins:[Ae],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return this.onlyOneChild=null,{}},methods:{hasOneShowingChild:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,a=t.filter(function(t){return!t.hidden&&(e.onlyOneChild=t,!0)});return 1===a.length||0===a.length&&(this.onlyOneChild=Object(U["a"])({},n,{path:"",noShowingChildren:!0}),!0)},resolvePath:function(e){return Ce(e)?e:Ce(this.basePath)?this.basePath:_e.a.resolve(this.basePath,e)}}},Pe=je,Ie=Object(m["a"])(Pe,we,xe,!1,null,null,null),Ne=Ie.exports,De=n("cf1e"),qe=n.n(De),Re={components:{SidebarItem:Ne,Logo:ge},computed:Object(U["a"])({},Object(p["b"])(["sidebar"]),{routes:function(){return this.$router.options.routes},activeMenu:function(){var e=this.$route,t=e.meta,n=e.path;return t.activeMenu?t.activeMenu:n},showLogo:function(){return this.$store.state.settings.sidebarLogo},variables:function(){return qe.a},isCollapse:function(){return!this.sidebar.opened}})},Ge=Re,Fe=Object(m["a"])(Ge,de,me,!1,null,null,null),Ue=Fe.exports,Ke=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("section",{staticClass:"app-main"},[n("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[n("router-view",{key:e.key})],1)],1)},We=[],Je={name:"AppMain",computed:{key:function(){return this.$route.fullPath}}},Xe=Je,Ye=(n("50be"),Object(m["a"])(Xe,Ke,We,!1,null,"43c24f68",null)),Qe=Ye.exports,Ze=document,et=Ze.body,tt=992,nt={watch:{$route:function(e){"mobile"===this.device&&this.sidebar.opened&&bt.dispatch("app/closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.$_resizeHandler)},beforeDestroy:function(){window.removeEventListener("resize",this.$_resizeHandler)},mounted:function(){var e=this.$_isMobile();e&&(bt.dispatch("app/toggleDevice","mobile"),bt.dispatch("app/closeSideBar",{withoutAnimation:!0}))},methods:{$_isMobile:function(){var e=et.getBoundingClientRect();return e.width-1'});r.a.add(s);t["default"]=s},"9f2b":function(e,t,n){"use strict";var a=n("5bb9"),i=n.n(a);i.a},b20f:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},b3b5:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});r.a.add(s);t["default"]=s},cf1e:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},d7ec:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});r.a.add(s);t["default"]=s},dc52:function(e,t,n){},dcf8:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},eb1b:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},f782:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});r.a.add(s);t["default"]=s}},[[0,"runtime","chunk-elementUI","chunk-libs"]]]); \ No newline at end of file +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["app"],{0:function(e,t,n){e.exports=n("56d7")},"0cb8":function(e,t,n){},"186a":function(e,t,n){"use strict";var a=n("dc52"),i=n.n(a);i.a},"18f0":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"1f59":function(e,t,n){},2536:function(e,t,n){},2635:function(e,t,n){},"2a3d":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"30c3":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"34c8":function(e,t,n){"use strict";var a=n("5332"),i=n.n(a);i.a},"405a":function(e,t,n){"use strict";var a=n("1f59"),i=n.n(a);i.a},"47f1":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},"4df5":function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});r.a.add(s);t["default"]=s},"50be":function(e,t,n){"use strict";var a=n("2536"),i=n.n(a);i.a},"51ff":function(e,t,n){var a={"./dashboard.svg":"f782","./example.svg":"30c3","./eye-open.svg":"d7ec","./eye.svg":"4df5","./form.svg":"eb1b","./link.svg":"18f0","./nested.svg":"dcf8","./password.svg":"2a3d","./table.svg":"47f1","./tree.svg":"93cd","./user.svg":"b3b5"};function i(e){var t=o(e);return n(t)}function o(e){var t=a[e];if(!(t+1)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return t}i.keys=function(){return Object.keys(a)},i.resolve=o,e.exports=i,i.id="51ff"},5332:function(e,t,n){},"56d7":function(e,t,n){"use strict";n.r(t);n("cadf"),n("551c"),n("f751"),n("097d");var a=n("2b0e"),i=(n("f5df"),n("5c96")),o=n.n(i),r=(n("0fae"),n("f0d9")),s=n.n(r),c=(n("b20f"),function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{attrs:{id:"app"}},[n("router-view")],1)}),u=[],l={name:"App"},d=l,m=n("2877"),h=Object(m["a"])(d,c,u,!1,null,null,null),f=h.exports,p=n("2f62"),v=(n("7f7f"),{sidebar:function(e){return e.app.sidebar},device:function(e){return e.app.device},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},name:function(e){return e.user.name}}),b=v,g=n("a78e"),w=n.n(g),x={sidebar:{opened:!w.a.get("sidebarStatus")||!!+w.a.get("sidebarStatus"),withoutAnimation:!1},device:"desktop"},y={TOGGLE_SIDEBAR:function(e){e.sidebar.opened=!e.sidebar.opened,e.sidebar.withoutAnimation=!1,e.sidebar.opened?w.a.set("sidebarStatus",1):w.a.set("sidebarStatus",0)},CLOSE_SIDEBAR:function(e,t){w.a.set("sidebarStatus",0),e.sidebar.opened=!1,e.sidebar.withoutAnimation=t},TOGGLE_DEVICE:function(e,t){e.device=t}},_={toggleSideBar:function(e){var t=e.commit;t("TOGGLE_SIDEBAR")},closeSideBar:function(e,t){var n=e.commit,a=t.withoutAnimation;n("CLOSE_SIDEBAR",a)},toggleDevice:function(e,t){var n=e.commit;n("TOGGLE_DEVICE",t)}},C={namespaced:!0,state:x,mutations:y,actions:_},k=n("83d6"),O=n.n(k),S=O.a.showSettings,z=O.a.fixedHeader,B=O.a.sidebarLogo,H={showSettings:S,fixedHeader:z,sidebarLogo:B},M={CHANGE_SETTING:function(e,t){var n=t.key,a=t.value;e.hasOwnProperty(n)&&(e[n]=a)}},T={changeSetting:function(e,t){var n=e.commit;n("CHANGE_SETTING",t)}},E={namespaced:!0,state:H,mutations:M,actions:T},L=n("bc3a"),$=n.n(L),V=n("5f87"),A=$.a.create({baseURL:"/api",withCredentials:!0,timeout:5e3});A.interceptors.request.use(function(e){return bt.getters.token&&(e.headers["X-Token"]=Object(V["a"])()),e},function(e){return console.log(e),Promise.reject(e)}),A.interceptors.response.use(function(e){var t=e.data;return 2e4!==t.code?(Object(i["Message"])({message:t.message||"error",type:"error",duration:5e3}),50008!==t.code&&50012!==t.code&&50014!==t.code||i["MessageBox"].confirm("You have been logged out, you can cancel to stay on this page, or log in again","Confirm logout",{confirmButtonText:"Re-Login",cancelButtonText:"Cancel",type:"warning"}).then(function(){bt.dispatch("user/resetToken").then(function(){location.reload()})}),Promise.reject(t.message||"error")):t},function(e){return console.log("err"+e),Object(i["Message"])({message:e.message,type:"error",duration:5e3}),Promise.reject(e)});var j=A;function P(e){return j({url:"/user/login",method:"post",data:e})}function I(e){return j({url:"/user/info",method:"get",params:{token:e}})}function N(){return j({url:"/user/logout",method:"post"})}var D=n("8c4f"),q=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"app-wrapper",class:e.classObj},["mobile"===e.device&&e.sidebar.opened?n("div",{staticClass:"drawer-bg",on:{click:e.handleClickOutside}}):e._e(),e._v(" "),n("sidebar",{staticClass:"sidebar-container"}),e._v(" "),n("div",{staticClass:"main-container"},[n("div",{class:{"fixed-header":e.fixedHeader}},[n("navbar")],1),e._v(" "),n("app-main")],1)],1)},R=[],G=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"navbar"},[n("hamburger",{staticClass:"hamburger-container",attrs:{"is-active":e.sidebar.opened},on:{toggleClick:e.toggleSideBar}}),e._v(" "),n("breadcrumb",{staticClass:"breadcrumb-container"}),e._v(" "),n("div",{staticClass:"right-menu"},[n("el-button",{staticStyle:{"margin-right":"10px"},attrs:{type:"text"},on:{click:e.doLogout}},[e._v("退出")])],1)],1)},F=[],U=n("cebc"),K=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-breadcrumb",{staticClass:"app-breadcrumb",attrs:{separator:"/"}},[n("transition-group",{attrs:{name:"breadcrumb"}},e._l(e.levelList,function(t,a){return n("el-breadcrumb-item",{key:t.path},["noRedirect"===t.redirect||a==e.levelList.length-1?n("span",{staticClass:"no-redirect"},[e._v(e._s(t.meta.title))]):n("a",{on:{click:function(n){return n.preventDefault(),e.handleLink(t)}}},[e._v(e._s(t.meta.title))])])}),1)],1)},W=[],J=n("bd11"),X=n.n(J),Y={data:function(){return{levelList:null}},watch:{$route:function(){this.getBreadcrumb()}},created:function(){this.getBreadcrumb()},methods:{getBreadcrumb:function(){var e=this.$route.matched.filter(function(e){return e.meta&&e.meta.title}),t=e[0];this.isDashboard(t)||(e=[{path:"/dashboard",meta:{title:"Dashboard"}}].concat(e)),this.levelList=e.filter(function(e){return e.meta&&e.meta.title&&!1!==e.meta.breadcrumb})},isDashboard:function(e){var t=e&&e.name;return!!t&&t.trim().toLocaleLowerCase()==="Dashboard".toLocaleLowerCase()},pathCompile:function(e){var t=this.$route.params,n=X.a.compile(e);return n(t)},handleLink:function(e){var t=e.redirect,n=e.path;t?this.$router.push(t):this.$router.push(this.pathCompile(n))}}},Q=Y,Z=(n("34c8"),Object(m["a"])(Q,K,W,!1,null,"62cc9144",null)),ee=Z.exports,te=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticStyle:{padding:"0 15px"},on:{click:e.toggleClick}},[n("svg",{staticClass:"hamburger",class:{"is-active":e.isActive},attrs:{viewBox:"0 0 1024 1024",xmlns:"http://www.w3.org/2000/svg",width:"64",height:"64"}},[n("path",{attrs:{d:"M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"}})])])},ne=[],ae={name:"Hamburger",props:{isActive:{type:Boolean,default:!1}},methods:{toggleClick:function(){this.$emit("toggleClick")}}},ie=ae,oe=(n("186a"),Object(m["a"])(ie,te,ne,!1,null,"49e15297",null)),re=oe.exports,se={components:{Breadcrumb:ee,Hamburger:re},computed:Object(U["a"])({},Object(p["b"])(["sidebar","avatar"])),methods:{toggleSideBar:function(){this.$store.dispatch("app/toggleSideBar")},doLogout:function(){this.logout()}}},ce=se,ue=(n("405a"),Object(m["a"])(ce,G,F,!1,null,"1eff5c58",null)),le=ue.exports,de=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{class:{"has-logo":e.showLogo}},[e.showLogo?n("logo",{attrs:{collapse:e.isCollapse}}):e._e(),e._v(" "),n("el-scrollbar",{attrs:{"wrap-class":"scrollbar-wrapper"}},[n("el-menu",{attrs:{"default-active":e.activeMenu,collapse:e.isCollapse,"background-color":e.variables.menuBg,"text-color":e.variables.menuText,"unique-opened":!1,"active-text-color":e.variables.menuActiveText,"collapse-transition":!1,mode:"vertical"}},e._l(e.routes,function(e){return n("sidebar-item",{key:e.path,attrs:{item:e,"base-path":e.path}})}),1)],1)],1)},me=[],he=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"sidebar-logo-container",class:{collapse:e.collapse}},[n("transition",{attrs:{name:"sidebarLogoFade"}},[e.collapse?n("router-link",{key:"collapse",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])]):n("router-link",{key:"expand",staticClass:"sidebar-logo-link",attrs:{to:"/"}},[e.logo?n("img",{staticClass:"sidebar-logo",attrs:{src:e.logo}}):e._e(),e._v(" "),n("h1",{staticClass:"sidebar-title"},[e._v(e._s(e.title)+" ")])])],1)],1)},fe=[],pe={name:"SidebarLogo",props:{collapse:{type:Boolean,required:!0}},data:function(){return{title:"SOP Admin",logo:"https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png"}}},ve=pe,be=(n("7c27"),Object(m["a"])(ve,he,fe,!1,null,"b905289c",null)),ge=be.exports,we=function(){var e=this,t=e.$createElement,n=e._self._c||t;return e.item.hidden?e._e():n("div",{staticClass:"menu-wrapper"},[!e.hasOneShowingChild(e.item.children,e.item)||e.onlyOneChild.children&&!e.onlyOneChild.noShowingChildren||e.item.alwaysShow?n("el-submenu",{ref:"subMenu",attrs:{index:e.resolvePath(e.item.path),"popper-append-to-body":""}},[n("template",{slot:"title"},[e.item.meta?n("item",{attrs:{icon:e.item.meta&&e.item.meta.icon,title:e.item.meta.title}}):e._e()],1),e._v(" "),e._l(e.item.children,function(t){return n("sidebar-item",{key:t.path,staticClass:"nest-menu",attrs:{"is-nest":!0,item:t,"base-path":e.resolvePath(t.path)}})})],2):[e.onlyOneChild.meta?n("app-link",{attrs:{to:e.resolvePath(e.onlyOneChild.path)}},[n("el-menu-item",{class:{"submenu-title-noDropdown":!e.isNest},attrs:{index:e.resolvePath(e.onlyOneChild.path)}},[n("item",{attrs:{icon:e.onlyOneChild.meta.icon||e.item.meta&&e.item.meta.icon,title:e.onlyOneChild.meta.title}})],1)],1):e._e()]],2)},xe=[],ye=n("df7c"),_e=n.n(ye);function Ce(e){return/^(https?:|mailto:|tel:)/.test(e)}var ke,Oe,Se={name:"MenuItem",functional:!0,props:{icon:{type:String,default:""},title:{type:String,default:""}},render:function(e,t){var n=t.props,a=n.icon,i=n.title,o=[];return a&&o.push(e("svg-icon",{attrs:{"icon-class":a}})),i&&o.push(e("span",{slot:"title"},[i])),o}},ze=Se,Be=Object(m["a"])(ze,ke,Oe,!1,null,null,null),He=Be.exports,Me=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("component",e._b({},"component",e.linkProps(e.to),!1),[e._t("default")],2)},Te=[],Ee={props:{to:{type:String,required:!0}},methods:{linkProps:function(e){return Ce(e)?{is:"a",href:e,target:"_blank",rel:"noopener"}:{is:"router-link",to:e}}}},Le=Ee,$e=Object(m["a"])(Le,Me,Te,!1,null,null,null),Ve=$e.exports,Ae={computed:{device:function(){return this.$store.state.app.device}},mounted:function(){this.fixBugIniOS()},methods:{fixBugIniOS:function(){var e=this,t=this.$refs.subMenu;if(t){var n=t.handleMouseleave;t.handleMouseleave=function(t){"mobile"!==e.device&&n(t)}}}}},je={name:"SidebarItem",components:{Item:He,AppLink:Ve},mixins:[Ae],props:{item:{type:Object,required:!0},isNest:{type:Boolean,default:!1},basePath:{type:String,default:""}},data:function(){return this.onlyOneChild=null,{}},methods:{hasOneShowingChild:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=arguments.length>1?arguments[1]:void 0,a=t.filter(function(t){return!t.hidden&&(e.onlyOneChild=t,!0)});return 1===a.length||0===a.length&&(this.onlyOneChild=Object(U["a"])({},n,{path:"",noShowingChildren:!0}),!0)},resolvePath:function(e){return Ce(e)?e:Ce(this.basePath)?this.basePath:_e.a.resolve(this.basePath,e)}}},Pe=je,Ie=Object(m["a"])(Pe,we,xe,!1,null,null,null),Ne=Ie.exports,De=n("cf1e"),qe=n.n(De),Re={components:{SidebarItem:Ne,Logo:ge},computed:Object(U["a"])({},Object(p["b"])(["sidebar"]),{routes:function(){return this.$router.options.routes},activeMenu:function(){var e=this.$route,t=e.meta,n=e.path;return t.activeMenu?t.activeMenu:n},showLogo:function(){return this.$store.state.settings.sidebarLogo},variables:function(){return qe.a},isCollapse:function(){return!this.sidebar.opened}})},Ge=Re,Fe=Object(m["a"])(Ge,de,me,!1,null,null,null),Ue=Fe.exports,Ke=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("section",{staticClass:"app-main"},[n("transition",{attrs:{name:"fade-transform",mode:"out-in"}},[n("router-view",{key:e.key})],1)],1)},We=[],Je={name:"AppMain",computed:{key:function(){return this.$route.fullPath}}},Xe=Je,Ye=(n("50be"),Object(m["a"])(Xe,Ke,We,!1,null,"43c24f68",null)),Qe=Ye.exports,Ze=document,et=Ze.body,tt=992,nt={watch:{$route:function(e){"mobile"===this.device&&this.sidebar.opened&&bt.dispatch("app/closeSideBar",{withoutAnimation:!1})}},beforeMount:function(){window.addEventListener("resize",this.$_resizeHandler)},beforeDestroy:function(){window.removeEventListener("resize",this.$_resizeHandler)},mounted:function(){var e=this.$_isMobile();e&&(bt.dispatch("app/toggleDevice","mobile"),bt.dispatch("app/closeSideBar",{withoutAnimation:!0}))},methods:{$_isMobile:function(){var e=et.getBoundingClientRect();return e.width-1'});r.a.add(s);t["default"]=s},"9f2b":function(e,t,n){"use strict";var a=n("5bb9"),i=n.n(a);i.a},b20f:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},b3b5:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});r.a.add(s);t["default"]=s},cf1e:function(e,t,n){e.exports={menuText:"#bfcbd9",menuActiveText:"#409EFF",subMenuActiveText:"#f4f4f5",menuBg:"#304156",menuHover:"#263445",subMenuBg:"#1f2d3d",subMenuHover:"#001528",sideBarWidth:"210px"}},d7ec:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});r.a.add(s);t["default"]=s},dc52:function(e,t,n){},dcf8:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},eb1b:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});r.a.add(s);t["default"]=s},f782:function(e,t,n){"use strict";n.r(t);var a=n("e017"),i=n.n(a),o=n("21a1"),r=n.n(o),s=new i.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});r.a.add(s);t["default"]=s}},[[0,"runtime","chunk-elementUI","chunk-libs"]]]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29b24c82.2b3ac7ca.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29b24c82.2b3ac7ca.js deleted file mode 100644 index 55d5be10..00000000 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29b24c82.2b3ac7ca.js +++ /dev/null @@ -1 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-29b24c82"],{"0a49":function(e,t,i){var a=i("9b43"),l=i("626a"),o=i("4bf8"),r=i("9def"),s=i("cd1c");e.exports=function(e,t){var i=1==e,n=2==e,m=3==e,c=4==e,p=6==e,u=5==e||p,d=t||s;return function(t,s,g){for(var f,h,D=o(t),y=l(D),v=a(s,g,3),b=r(y.length),k=0,x=i?d(t,b):n?d(t,0):void 0;b>k;k++)if((u||k in y)&&(f=y[k],h=v(f,k,D),e))if(i)x[k]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return k;case 2:x.push(f)}else if(c)return!1;return p?-1:m||c?c:x}}},1169:function(e,t,i){var a=i("2d95");e.exports=Array.isArray||function(e){return"Array"==a(e)}},1510:function(e,t,i){"use strict";i.r(t);var a=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"app-container"},[i("el-container",[i("el-aside",{staticStyle:{"min-height":"300px",width:"200px"}},[i("el-input",{staticStyle:{"margin-bottom":"20px"},attrs:{"prefix-icon":"el-icon-search",placeholder:"搜索服务...",size:"mini",clearable:""},model:{value:e.filterText,callback:function(t){e.filterText=t},expression:"filterText"}}),e._v(" "),i("el-tree",{ref:"tree2",staticClass:"filter-tree",attrs:{data:e.treeData,props:e.defaultProps,"filter-node-method":e.filterNode,"highlight-current":!0,"expand-on-click-node":!1,"empty-text":"无数据","node-key":"id","default-expand-all":""},on:{"node-click":e.onNodeClick},scopedSlots:e._u([{key:"default",fn:function(t){t.node;var a=t.data;return i("span",{staticClass:"custom-tree-node"},[a.label.length<15?i("span",[e._v(e._s(a.label))]):i("span",[i("el-tooltip",{staticClass:"item",attrs:{content:a.label,effect:"light",placement:"right"}},[i("span",[e._v(e._s(a.label.substring(0,15)+"..."))])])],1)])}}])})],1),e._v(" "),i("el-main",{staticStyle:{"padding-top":"0"}},[i("el-form",{staticClass:"demo-form-inline",attrs:{inline:!0,model:e.searchFormData,size:"mini"}},[i("el-form-item",{attrs:{label:"路由ID"}},[i("el-input",{attrs:{placeholder:"接口名,支持模糊查询",clearable:""},model:{value:e.searchFormData.routeId,callback:function(t){e.$set(e.searchFormData,"routeId",t)},expression:"searchFormData.routeId"}})],1),e._v(" "),i("el-form-item",{attrs:{label:"AppKey"}},[i("el-input",{attrs:{placeholder:"AppKey,支持模糊查询",clearable:""},model:{value:e.searchFormData.appKey,callback:function(t){e.$set(e.searchFormData,"appKey",t)},expression:"searchFormData.appKey"}})],1),e._v(" "),i("el-form-item",{attrs:{label:"IP"}},[i("el-input",{attrs:{placeholder:"ip,支持模糊查询",clearable:""},model:{value:e.searchFormData.limitIp,callback:function(t){e.$set(e.searchFormData,"limitIp",t)},expression:"searchFormData.limitIp"}})],1),e._v(" "),i("el-form-item",[i("el-button",{attrs:{type:"primary",icon:"el-icon-search",size:"mini"},on:{click:e.onSearchTable}},[e._v("查询")])],1)],1),e._v(" "),i("el-button",{staticStyle:{"margin-bottom":"10px"},attrs:{type:"primary",size:"mini",icon:"el-icon-plus"},on:{click:e.onAdd}},[e._v("新增限流")]),e._v(" "),i("el-table",{attrs:{data:e.pageInfo.list,border:""}},[i("el-table-column",{attrs:{prop:"limitKey",label:"限流维度",width:"400"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("div",{domProps:{innerHTML:e._s(e.limitRender(t.row))}})]}}])}),e._v(" "),i("el-table-column",{attrs:{prop:"limitType",label:"限流策略",width:"120"},scopedSlots:e._u([{key:"default",fn:function(t){return[1===t.row.limitType?i("span",[e._v("窗口策略")]):e._e(),e._v(" "),2===t.row.limitType?i("span",[e._v("令牌桶策略")]):e._e()]}}])},[i("template",{slot:"header"},[e._v("\n 限流策略 "),i("i",{staticClass:"el-icon-question",staticStyle:{cursor:"pointer"},on:{click:e.onLimitTypeTipClick}})])],2),e._v(" "),i("el-table-column",{attrs:{prop:"info",label:"限流信息",width:"250"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("span",{domProps:{innerHTML:e._s(e.infoRender(t.row))}})]}}])}),e._v(" "),i("el-table-column",{attrs:{prop:"limitStatus",label:"状态",width:"80"},scopedSlots:e._u([{key:"default",fn:function(t){return[1===t.row.limitStatus?i("span",{staticStyle:{color:"#67C23A"}},[e._v("已开启")]):e._e(),e._v(" "),0===t.row.limitStatus?i("span",{staticStyle:{color:"#909399"}},[e._v("已关闭")]):e._e()]}}])}),e._v(" "),i("el-table-column",{attrs:{prop:"orderIndex",label:"排序",width:"80"}}),e._v(" "),i("el-table-column",{attrs:{prop:"remark",label:"备注",width:"150","show-overflow-tooltip":!0}}),e._v(" "),i("el-table-column",{attrs:{prop:"gmtCreate",label:"创建时间",width:"160"}}),e._v(" "),i("el-table-column",{attrs:{prop:"gmtModified",label:"修改时间",width:"160"}}),e._v(" "),i("el-table-column",{attrs:{label:"操作",fixed:"right",width:"80"},scopedSlots:e._u([{key:"default",fn:function(t){return[i("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(i){return e.onTableUpdate(t.row)}}},[e._v("修改")])]}}])})],1),e._v(" "),i("el-pagination",{staticStyle:{"margin-top":"5px"},attrs:{background:"","current-page":e.searchFormData.pageIndex,"page-size":e.searchFormData.pageSize,"page-sizes":[5,10,20,40],total:e.pageInfo.total,layout:"total, sizes, prev, pager, next"},on:{"size-change":e.onSizeChange,"current-change":e.onPageIndexChange}}),e._v(" "),i("el-dialog",{attrs:{title:e.dlgTitle,visible:e.limitDialogVisible,"close-on-click-modal":!1},on:{"update:visible":function(t){e.limitDialogVisible=t},close:e.onLimitDialogClose}},[i("el-form",{ref:"limitDialogForm",attrs:{model:e.limitDialogFormData,rules:e.rulesLimit,"label-width":"150px",size:"mini"}},[i("el-form-item",{attrs:{label:"限流维度",prop:"typeKey"}},[i("el-checkbox-group",{model:{value:e.limitDialogFormData.typeKey,callback:function(t){e.$set(e.limitDialogFormData,"typeKey",t)},expression:"limitDialogFormData.typeKey"}},[i("el-checkbox",{attrs:{label:1,name:"typeKey"},model:{value:e.limitDialogFormData.typeKey[0],callback:function(t){e.$set(e.limitDialogFormData.typeKey,0,t)},expression:"limitDialogFormData.typeKey[0]"}},[e._v("路由ID")]),e._v(" "),i("el-checkbox",{attrs:{label:2,name:"typeKey"},model:{value:e.limitDialogFormData.typeKey[1],callback:function(t){e.$set(e.limitDialogFormData.typeKey,1,t)},expression:"limitDialogFormData.typeKey[1]"}},[e._v("AppKey")]),e._v(" "),i("el-checkbox",{attrs:{label:3,name:"typeKey"},model:{value:e.limitDialogFormData.typeKey[2],callback:function(t){e.$set(e.limitDialogFormData.typeKey,2,t)},expression:"limitDialogFormData.typeKey[2]"}},[e._v("IP")])],1)],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.checkTypeKey(1),expression:"checkTypeKey(1)"}],attrs:{prop:"routeId",label:"路由ID",rules:e.checkTypeKey(1)?e.rulesLimit.routeId:[]}},[i("el-select",{staticStyle:{width:"300px"},attrs:{filterable:"",placeholder:"可筛选"},model:{value:e.limitDialogFormData.routeId,callback:function(t){e.$set(e.limitDialogFormData,"routeId",t)},expression:"limitDialogFormData.routeId"}},e._l(e.routeList,function(t){return i("el-option",{key:t.id,attrs:{label:t.id,value:t.id}},[i("span",{staticStyle:{float:"left"}},[e._v(e._s(t.name))]),e._v(" "),i("span",{staticStyle:{float:"right",color:"#8492a6","font-size":"13px"}},[e._v(e._s(t.version))])])}),1)],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.checkTypeKey(2),expression:"checkTypeKey(2)"}],attrs:{prop:"appKey",label:"AppKey",rules:e.checkTypeKey(2)?e.rulesLimit.appKey:[]}},[i("el-input",{attrs:{placeholder:"需要限流的appKey"},model:{value:e.limitDialogFormData.appKey,callback:function(t){e.$set(e.limitDialogFormData,"appKey",t)},expression:"limitDialogFormData.appKey"}})],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.checkTypeKey(3),expression:"checkTypeKey(3)"}],attrs:{label:"限流IP",prop:"limitIp",rules:e.checkTypeKey(3)?e.rulesLimit.ip:[]}},[i("el-input",{attrs:{type:"textarea",rows:2,placeholder:"多个用英文逗号隔开"},model:{value:e.limitDialogFormData.limitIp,callback:function(t){e.$set(e.limitDialogFormData,"limitIp",t)},expression:"limitDialogFormData.limitIp"}})],1),e._v(" "),i("el-form-item",{attrs:{label:"限流策略"}},[i("el-radio-group",{model:{value:e.limitDialogFormData.limitType,callback:function(t){e.$set(e.limitDialogFormData,"limitType",t)},expression:"limitDialogFormData.limitType"}},[i("el-radio",{attrs:{label:1}},[e._v("窗口策略")]),e._v(" "),i("el-radio",{attrs:{label:2}},[e._v("令牌桶策略")])],1),e._v(" "),i("i",{staticClass:"el-icon-question limit-tip",on:{click:e.onLimitTypeTipClick}})],1),e._v(" "),i("el-form-item",{attrs:{label:"开启状态"}},[i("el-switch",{attrs:{"active-color":"#13ce66","inactive-color":"#ff4949","active-value":1,"inactive-value":0},model:{value:e.limitDialogFormData.limitStatus,callback:function(t){e.$set(e.limitDialogFormData,"limitStatus",t)},expression:"limitDialogFormData.limitStatus"}})],1),e._v(" "),i("el-form-item",{attrs:{label:"排序",prop:"orderIndex"}},[i("el-input-number",{attrs:{"controls-position":"right",min:0},model:{value:e.limitDialogFormData.orderIndex,callback:function(t){e.$set(e.limitDialogFormData,"orderIndex",t)},expression:"limitDialogFormData.orderIndex"}}),e._v(" "),i("el-tooltip",{staticClass:"item",attrs:{content:"值小优先执行",placement:"top"}},[i("i",{staticClass:"el-icon-question limit-tip"})])],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.isWindowType(),expression:"isWindowType()"}],attrs:{label:"每秒可处理请求数",prop:"execCountPerSecond",rules:e.isWindowType()?e.rulesLimit.execCountPerSecond:[]}},[i("el-input-number",{attrs:{"controls-position":"right",min:1},model:{value:e.limitDialogFormData.execCountPerSecond,callback:function(t){e.$set(e.limitDialogFormData,"execCountPerSecond",t)},expression:"limitDialogFormData.execCountPerSecond"}})],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.isWindowType(),expression:"isWindowType()"}],attrs:{label:"错误码",prop:"limitCode",rules:e.isWindowType()?e.rulesLimit.limitCode:[]}},[i("el-input",{model:{value:e.limitDialogFormData.limitCode,callback:function(t){e.$set(e.limitDialogFormData,"limitCode",t)},expression:"limitDialogFormData.limitCode"}})],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.isWindowType(),expression:"isWindowType()"}],attrs:{label:"错误信息",prop:"limitMsg",rules:e.isWindowType()?e.rulesLimit.limitMsg:[]}},[i("el-input",{model:{value:e.limitDialogFormData.limitMsg,callback:function(t){e.$set(e.limitDialogFormData,"limitMsg",t)},expression:"limitDialogFormData.limitMsg"}})],1),e._v(" "),i("el-form-item",{directives:[{name:"show",rawName:"v-show",value:e.isTokenType(),expression:"isTokenType()"}],attrs:{label:"令牌桶容量",prop:"tokenBucketCount",rules:e.isTokenType()?e.rulesLimit.tokenBucketCount:[]}},[i("el-input-number",{attrs:{"controls-position":"right",min:1},model:{value:e.limitDialogFormData.tokenBucketCount,callback:function(t){e.$set(e.limitDialogFormData,"tokenBucketCount",t)},expression:"limitDialogFormData.tokenBucketCount"}})],1),e._v(" "),i("el-form-item",{attrs:{label:"备注",prop:"remark"}},[i("el-input",{attrs:{type:"textarea",rows:2},model:{value:e.limitDialogFormData.remark,callback:function(t){e.$set(e.limitDialogFormData,"remark",t)},expression:"limitDialogFormData.remark"}})],1)],1),e._v(" "),i("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[i("el-button",{on:{click:function(t){e.limitDialogVisible=!1}}},[e._v("取 消")]),e._v(" "),i("el-button",{attrs:{type:"primary"},on:{click:e.onLimitDialogSave}},[e._v("保 存")])],1)],1)],1)],1)],1)},l=[],o=(i("7514"),{data:function(){return{filterText:"",treeData:[],tableData:[],serviceId:"",searchFormData:{pageIndex:1,pageSize:5},pageInfo:{list:[],total:0},routeList:[],defaultProps:{children:"children",label:"label"},dlgTitle:"设置限流",limitDialogVisible:!1,limitDialogFormData:{id:0,routeId:"",appKey:"",limitIp:"",limitKey:"",execCountPerSecond:5,limitCode:"",limitMsg:"",tokenBucketCount:5,limitStatus:0,limitType:1,orderIndex:0,remark:"",typeKey:[]},rulesLimit:{typeKey:[{type:"array",required:!0,message:"请至少选择一个",trigger:"change"}],routeId:[{required:!0,message:"不能为空",trigger:"blur"},{min:1,max:100,message:"长度在 1 到 100 个字符",trigger:"blur"}],appKey:[{required:!0,message:"不能为空",trigger:"blur"},{min:1,max:100,message:"长度在 1 到 100 个字符",trigger:"blur"}],ip:[{required:!0,message:"不能为空",trigger:"blur"},{min:1,max:500,message:"长度在 1 到 500 个字符",trigger:"blur"}],execCountPerSecond:[{required:!0,message:"不能为空",trigger:"blur"}],limitCode:[{required:!0,message:"不能为空",trigger:"blur"},{min:1,max:64,message:"长度在 1 到 64 个字符",trigger:"blur"}],limitMsg:[{required:!0,message:"不能为空",trigger:"blur"},{min:1,max:100,message:"长度在 1 到 100 个字符",trigger:"blur"}],tokenBucketCount:[{required:!0,message:"不能为空",trigger:"blur"}],orderIndex:[{required:!0,message:"不能为空",trigger:"blur"}],remark:[{max:128,message:"长度不能超过128字符",trigger:"blur"}]}}},watch:{filterText:function(e){this.$refs.tree2.filter(e)}},created:function(){this.loadTree()},methods:{loadTree:function(){this.post("service.list",{},function(e){var t=e.data;this.treeData=this.convertToTreeData(t,0)})},filterNode:function(e,t){return!e||-1!==t.label.indexOf(e)},onNodeClick:function(e,t,i){e.parentId&&(this.serviceId=e.label,this.searchFormData.serviceId=this.serviceId,this.loadTable(),this.loadRouteList(this.serviceId))},convertToTreeData:function(e,t){for(var i=[],a={label:"服务列表",parentId:t},l=[],o=0;osubCode:"+e.limitCode),t.push("
subMsg:"+e.limitMsg)):2===e.limitType&&t.push("令牌桶容量:"+e.tokenBucketCount),t.join("")},onLimitDialogSave:function(){var e=this;this.$refs["limitDialogForm"].validate(function(t){if(t){e.cleanCheckboxData(),e.limitDialogFormData.serviceId=e.serviceId;var i=e.limitDialogFormData.id?"config.limit.update":"config.limit.add";e.post(i,e.limitDialogFormData,function(e){this.limitDialogVisible=!1,this.loadTable()})}})},cleanCheckboxData:function(){this.checkTypeKey(1)||(this.limitDialogFormData.routeId=""),this.checkTypeKey(2)||(this.limitDialogFormData.appKey=""),this.checkTypeKey(3)||(this.limitDialogFormData.limitIp="")},onLimitTypeTipClick:function(){var e="窗口策略:每秒处理固定数量的请求,超出请求数量返回错误信息。",t="令牌桶策略:每秒放置固定数量的令牌数,每个请求进来后先去拿令牌,拿到了令牌才能继续,拿不到则等候令牌重新生成了再拿。",i=e+"
"+t;this.$alert(i,"限流策略",{dangerouslyUseHTMLString:!0})},onSizeChange:function(e){this.searchFormData.pageSize=e,this.loadTable()},onPageIndexChange:function(e){this.searchFormData.pageIndex=e,this.loadTable()},checkTypeKey:function(e){return this.limitDialogFormData.typeKey.find(function(t,i,a){return t===e})},isWindowType:function(){return 1===this.limitDialogFormData.limitType},isTokenType:function(){return 2===this.limitDialogFormData.limitType},limitRender:function(e){var t=[],i=[];return e.routeId&&(i.push(e.routeId),t.push("路由ID")),e.appKey&&(i.push(e.appKey),t.push("AppKey")),e.limitIp&&(i.push(e.limitIp),t.push("IP")),i.join(" + ")+"
("+t.join(" + ")+")"}}}),r=o,s=(i("edd4"),i("2877")),n=Object(s["a"])(r,a,l,!1,null,"29df7fee",null);t["default"]=n.exports},"44f4":function(e,t,i){},7514:function(e,t,i){"use strict";var a=i("5ca1"),l=i("0a49")(5),o="find",r=!0;o in[]&&Array(1)[o](function(){r=!1}),a(a.P+a.F*r,"Array",{find:function(e){return l(this,e,arguments.length>1?arguments[1]:void 0)}}),i("9c6c")(o)},cd1c:function(e,t,i){var a=i("e853");e.exports=function(e,t){return new(a(e))(t)}},e853:function(e,t,i){var a=i("d3f4"),l=i("1169"),o=i("2b4c")("species");e.exports=function(e){var t;return l(e)&&(t=e.constructor,"function"!=typeof t||t!==Array&&!l(t.prototype)||(t=void 0),a(t)&&(t=t[o],null===t&&(t=void 0))),void 0===t?Array:t}},edd4:function(e,t,i){"use strict";var a=i("44f4"),l=i.n(a);l.a}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2a9bc230.6f8c0d92.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2a9bc230.6f8c0d92.js new file mode 100644 index 00000000..2bf23197 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2a9bc230.6f8c0d92.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2a9bc230"],{"0a49":function(e,t,i){var a=i("9b43"),l=i("626a"),o=i("4bf8"),r=i("9def"),s=i("cd1c");e.exports=function(e,t){var i=1==e,n=2==e,m=3==e,c=4==e,p=6==e,u=5==e||p,d=t||s;return function(t,s,g){for(var f,h,D=o(t),y=l(D),v=a(s,g,3),b=r(y.length),k=0,x=i?d(t,b):n?d(t,0):void 0;b>k;k++)if((u||k in y)&&(f=y[k],h=v(f,k,D),e))if(i)x[k]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return k;case 2:x.push(f)}else if(c)return!1;return p?-1:m||c?c:x}}},1169:function(e,t,i){var a=i("2d95");e.exports=Array.isArray||function(e){return"Array"==a(e)}},1510:function(e,t,i){"use strict";i.r(t);var a=function(){var e=this,t=e.$createElement,i=e._self._c||t;return i("div",{staticClass:"app-container"},[i("el-container",[i("el-aside",{staticStyle:{"min-height":"300px",width:"250px"}},[i("el-input",{staticStyle:{"margin-bottom":"20px"},attrs:{"prefix-icon":"el-icon-search",placeholder:"搜索服务...",size:"mini",clearable:""},model:{value:e.filterText,callback:function(t){e.filterText=t},expression:"filterText"}}),e._v(" "),i("el-tree",{ref:"tree2",staticClass:"filter-tree",attrs:{data:e.treeData,props:e.defaultProps,"filter-node-method":e.filterNode,"highlight-current":!0,"expand-on-click-node":!1,"empty-text":"无数据","node-key":"id","default-expand-all":""},on:{"node-click":e.onNodeClick},scopedSlots:e._u([{key:"default",fn:function(t){t.node;var a=t.data;return i("span",{staticClass:"custom-tree-node"},[a.label.lengthsubCode:"+e.limitCode),t.push("
subMsg:"+e.limitMsg)):2===e.limitType&&t.push("令牌桶容量:"+e.tokenBucketCount),t.join("")},onLimitDialogSave:function(){var e=this;this.$refs["limitDialogForm"].validate(function(t){if(t){e.cleanCheckboxData(),e.limitDialogFormData.serviceId=e.serviceId;var i=e.limitDialogFormData.id?"config.limit.update":"config.limit.add";e.post(i,e.limitDialogFormData,function(e){this.limitDialogVisible=!1,this.loadTable()})}})},cleanCheckboxData:function(){this.checkTypeKey(1)||(this.limitDialogFormData.routeId=""),this.checkTypeKey(2)||(this.limitDialogFormData.appKey=""),this.checkTypeKey(3)||(this.limitDialogFormData.limitIp="")},onLimitTypeTipClick:function(){var e="窗口策略:每秒处理固定数量的请求,超出请求数量返回错误信息。",t="令牌桶策略:每秒放置固定数量的令牌数,每个请求进来后先去拿令牌,拿到了令牌才能继续,拿不到则等候令牌重新生成了再拿。",i=e+"
"+t;this.$alert(i,"限流策略",{dangerouslyUseHTMLString:!0})},onSizeChange:function(e){this.searchFormData.pageSize=e,this.loadTable()},onPageIndexChange:function(e){this.searchFormData.pageIndex=e,this.loadTable()},checkTypeKey:function(e){return this.limitDialogFormData.typeKey.find(function(t,i,a){return t===e})},isWindowType:function(){return 1===this.limitDialogFormData.limitType},isTokenType:function(){return 2===this.limitDialogFormData.limitType},limitRender:function(e){var t=[],i=[];return e.routeId&&(i.push(e.routeId),t.push("路由ID")),e.appKey&&(i.push(e.appKey),t.push("AppKey")),e.limitIp&&(i.push(e.limitIp),t.push("IP")),i.join(" + ")+"
("+t.join(" + ")+")"}}}),r=o,s=(i("bcf9"),i("2877")),n=Object(s["a"])(r,a,l,!1,null,"31efca04",null);t["default"]=n.exports},7514:function(e,t,i){"use strict";var a=i("5ca1"),l=i("0a49")(5),o="find",r=!0;o in[]&&Array(1)[o](function(){r=!1}),a(a.P+a.F*r,"Array",{find:function(e){return l(this,e,arguments.length>1?arguments[1]:void 0)}}),i("9c6c")(o)},a945:function(e,t,i){},bcf9:function(e,t,i){"use strict";var a=i("a945"),l=i.n(a);l.a},cd1c:function(e,t,i){var a=i("e853");e.exports=function(e,t){return new(a(e))(t)}},e853:function(e,t,i){var a=i("d3f4"),l=i("1169"),o=i("2b4c")("species");e.exports=function(e){var t;return l(e)&&(t=e.constructor,"function"!=typeof t||t!==Array&&!l(t.prototype)||(t=void 0),a(t)&&(t=t[o],null===t&&(t=void 0))),void 0===t?Array:t}}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d0aa95b.447435b3.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d0aa95b.447435b3.js deleted file mode 100644 index da97f7e1..00000000 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d0aa95b.447435b3.js +++ /dev/null @@ -1 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0aa95b"],{1248:function(t,e,a){"use strict";a.r(e);var o=function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"app-container"},[a("el-container",[a("el-aside",{staticStyle:{"min-height":"300px",width:"200px"}},[a("el-input",{staticStyle:{"margin-bottom":"20px"},attrs:{"prefix-icon":"el-icon-search",placeholder:"搜索服务...",size:"mini",clearable:""},model:{value:t.filterText,callback:function(e){t.filterText=e},expression:"filterText"}}),t._v(" "),a("el-tree",{ref:"tree2",staticClass:"filter-tree",attrs:{data:t.treeData,props:t.defaultProps,"filter-node-method":t.filterNode,"highlight-current":!0,"expand-on-click-node":!1,"empty-text":"无数据","node-key":"id","default-expand-all":""},on:{"node-click":t.onNodeClick},scopedSlots:t._u([{key:"default",fn:function(e){e.node;var o=e.data;return a("span",{staticClass:"custom-tree-node"},[o.label.length<15?a("span",[t._v(t._s(o.label))]):a("span",[a("el-tooltip",{staticClass:"item",attrs:{content:o.label,effect:"light",placement:"right"}},[a("span",[t._v(t._s(o.label.substring(0,15)+"..."))])])],1)])}}])})],1),t._v(" "),a("el-main",{staticStyle:{"padding-top":"0"}},[a("el-form",{staticClass:"demo-form-inline",attrs:{inline:!0,model:t.searchFormData,size:"mini"}},[a("el-form-item",{attrs:{label:"路由名称"}},[a("el-input",{attrs:{placeholder:"输入接口名或版本号"},model:{value:t.searchFormData.id,callback:function(e){t.$set(t.searchFormData,"id",e)},expression:"searchFormData.id"}})],1),t._v(" "),a("el-form-item",[a("el-button",{attrs:{type:"primary",icon:"el-icon-search"},on:{click:t.onSearchTable}},[t._v("查询")])],1)],1),t._v(" "),a("el-table",{attrs:{data:t.tableData,border:"","max-height":"500"}},[a("el-table-column",{attrs:{prop:"name",label:"接口名 (版本号)",width:"200"},scopedSlots:t._u([{key:"default",fn:function(e){return[t._v("\n "+t._s(e.row.name+(e.row.version?" ("+e.row.version+")":""))+"\n ")]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"uri",label:"LoadBalance",width:"350"},scopedSlots:t._u([{key:"default",fn:function(e){return[t._v("\n "+t._s(e.row.uri+e.row.path)+"\n ")]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"roles",label:"访问权限",width:"100"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("span",{domProps:{innerHTML:t._s(t.roleRender(e.row))}})]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"ignoreValidate",label:"忽略验证",width:"80"},scopedSlots:t._u([{key:"default",fn:function(e){return[1===e.row.ignoreValidate?a("span",{staticStyle:{color:"#67C23A"}},[t._v("是")]):t._e(),t._v(" "),0===e.row.ignoreValidate?a("span",{staticStyle:{color:"#909399"}},[t._v("否")]):t._e()]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"mergeResult",label:"统一格式输出",width:"120"},scopedSlots:t._u([{key:"default",fn:function(e){return[1===e.row.mergeResult?a("span",{staticStyle:{color:"#67C23A"}},[t._v("是")]):t._e(),t._v(" "),0===e.row.mergeResult?a("span",{staticStyle:{color:"#E6A23C"}},[t._v("否")]):t._e()]}}])}),t._v(" "),a("el-table-column",{attrs:{prop:"status",label:"状态",width:"80"},scopedSlots:t._u([{key:"default",fn:function(e){return[0===e.row.status?a("span",{staticStyle:{color:"#909399"}},[t._v("待审核")]):t._e(),t._v(" "),1===e.row.status?a("span",{staticStyle:{color:"#67C23A"}},[t._v("已启用")]):t._e(),t._v(" "),2===e.row.status?a("span",{staticStyle:{color:"#F56C6C"}},[t._v("已禁用")]):t._e()]}}])}),t._v(" "),a("el-table-column",{attrs:{label:"操作",fixed:"right",width:"100"},scopedSlots:t._u([{key:"default",fn:function(e){return[a("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(a){return t.onTableUpdate(e.row)}}},[t._v("修改")]),t._v(" "),e.row.permission?a("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(a){return t.onTableAuth(e.row)}}},[t._v("授权")]):t._e()]}}])})],1),t._v(" "),a("el-dialog",{attrs:{title:"修改路由",visible:t.routeDialogVisible,"close-on-click-modal":!1},on:{"update:visible":function(e){t.routeDialogVisible=e}}},[a("el-form",{attrs:{model:t.routeDialogFormData,"label-width":"120px",size:"mini"}},[a("el-form-item",{attrs:{label:"id"}},[a("el-input",{attrs:{readonly:"readonly"},model:{value:t.routeDialogFormData.id,callback:function(e){t.$set(t.routeDialogFormData,"id",e)},expression:"routeDialogFormData.id"}})],1),t._v(" "),a("el-form-item",{attrs:{label:"uri"}},[a("el-input",{model:{value:t.routeDialogFormData.uri,callback:function(e){t.$set(t.routeDialogFormData,"uri",e)},expression:"routeDialogFormData.uri"}})],1),t._v(" "),a("el-form-item",{attrs:{label:"path"}},[a("el-input",{model:{value:t.routeDialogFormData.path,callback:function(e){t.$set(t.routeDialogFormData,"path",e)},expression:"routeDialogFormData.path"}})],1),t._v(" "),a("el-form-item",{attrs:{label:"状态"}},[a("el-radio-group",{model:{value:t.routeDialogFormData.status,callback:function(e){t.$set(t.routeDialogFormData,"status",e)},expression:"routeDialogFormData.status"}},[a("el-radio",{attrs:{label:1,name:"status"}},[t._v("启用")]),t._v(" "),a("el-radio",{staticStyle:{color:"#F56C6C"},attrs:{label:2,name:"status"}},[t._v("禁用")])],1)],1)],1),t._v(" "),a("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[a("el-button",{on:{click:function(e){t.routeDialogVisible=!1}}},[t._v("取 消")]),t._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:t.onRouteDialogSave}},[t._v("保 存")])],1)],1),t._v(" "),a("el-dialog",{attrs:{title:"路由授权",visible:t.authDialogVisible,"close-on-click-modal":!1},on:{"update:visible":function(e){t.authDialogVisible=e}}},[a("el-form",{attrs:{model:t.authDialogFormData,"label-width":"120px",size:"mini"}},[a("el-form-item",{attrs:{label:"id"}},[a("el-input",{attrs:{readonly:"readonly"},model:{value:t.authDialogFormData.routeId,callback:function(e){t.$set(t.authDialogFormData,"routeId",e)},expression:"authDialogFormData.routeId"}})],1),t._v(" "),a("el-form-item",{attrs:{label:"角色"}},[a("el-checkbox-group",{model:{value:t.authDialogFormData.roleCode,callback:function(e){t.$set(t.authDialogFormData,"roleCode",e)},expression:"authDialogFormData.roleCode"}},t._l(t.roles,function(e){return a("el-checkbox",{key:e.roleCode,attrs:{label:e.roleCode}},[t._v(t._s(e.description))])}),1)],1)],1),t._v(" "),a("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[a("el-button",{on:{click:function(e){t.authDialogVisible=!1}}},[t._v("取 消")]),t._v(" "),a("el-button",{attrs:{type:"primary"},on:{click:t.onAuthDialogSave}},[t._v("保 存")])],1)],1)],1)],1)],1)},l=[],i={data:function(){return{filterText:"",treeData:[],tableData:[],serviceId:"",searchFormData:{},defaultProps:{children:"children",label:"label"},routeDialogFormData:{status:1},routeDialogVisible:!1,roles:[],authDialogFormData:{routeId:"",roleCode:[]},authDialogVisible:!1}},watch:{filterText:function(t){this.$refs.tree2.filter(t)}},created:function(){this.loadTree(),this.loadRouteRole()},methods:{loadTree:function(){this.post("service.list",{},function(t){var e=t.data;this.treeData=this.convertToTreeData(e,0)})},filterNode:function(t,e){return!t||-1!==e.label.indexOf(t)},onNodeClick:function(t,e,a){t.parentId&&(this.serviceId=t.label,this.searchFormData.serviceId=this.serviceId,this.loadTable())},convertToTreeData:function(t,e){for(var a=[],o={label:"服务列表",parentId:e},l=[],i=0;i0?e.join(", "):'未授权'},onRouteDialogSave:function(){this.routeDialogFormData.serviceId=this.serviceId,this.post("route.update",this.routeDialogFormData,function(){this.routeDialogVisible=!1,this.loadTable()})},onAuthDialogSave:function(){this.post("route.role.update",this.authDialogFormData,function(){console.log(this.authDialogFormData),this.authDialogVisible=!1,this.loadTable()})}}},r=i,s=a("2877"),n=Object(s["a"])(r,o,l,!1,null,null,null);e["default"]=n.exports}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-19100986.3ec98327.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-37401378.4e39ec9b.js similarity index 90% rename from sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-19100986.3ec98327.js rename to sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-37401378.4e39ec9b.js index f55a61bb..3d8d7bb3 100644 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-19100986.3ec98327.js +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-37401378.4e39ec9b.js @@ -1 +1 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-19100986"],{5040:function(t,n,a){"use strict";var e=a("a5a4"),s=a.n(e);s.a},9406:function(t,n,a){"use strict";a.r(n);var e=function(){var t=this,n=t.$createElement;t._self._c;return t._m(0)},s=[function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("div",{staticClass:"dashboard-container"},[a("div",{staticClass:"dashboard-text"},[t._v("欢迎使用SOP Admin")])])}],i={created:function(){this.post("admin.userinfo.get",{},function(t){})}},c=i,r=(a("5040"),a("2877")),o=Object(r["a"])(c,e,s,!1,null,"b4bd5162",null);n["default"]=o.exports},a5a4:function(t,n,a){}}]); \ No newline at end of file +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-37401378"],{5040:function(t,n,a){"use strict";var e=a("a5a4"),s=a.n(e);s.a},9406:function(t,n,a){"use strict";a.r(n);var e=function(){var t=this,n=t.$createElement;t._self._c;return t._m(0)},s=[function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("div",{staticClass:"dashboard-container"},[a("div",{staticClass:"dashboard-text"},[t._v("欢迎使用SOP Admin")])])}],i={created:function(){this.post("admin.userinfo.get",{},function(t){})}},c=i,r=(a("5040"),a("2877")),o=Object(r["a"])(c,e,s,!1,null,"b4bd5162",null);n["default"]=o.exports},a5a4:function(t,n,a){}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-6a68a33e.8b63492e.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-6a68a33e.8b63492e.js new file mode 100644 index 00000000..0131ea81 --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-6a68a33e.8b63492e.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-6a68a33e"],{1248:function(e,t,o){"use strict";o.r(t);var a=function(){var e=this,t=e.$createElement,o=e._self._c||t;return o("div",{staticClass:"app-container"},[o("el-container",[o("el-aside",{staticStyle:{"min-height":"300px",width:"250px"}},[o("el-button",{attrs:{type:"primary",plain:"",size:"mini",icon:"el-icon-plus"},on:{click:function(t){return t.stopPropagation(),e.addService(t)}}},[e._v("\n 新建服务\n ")]),e._v(" "),o("el-input",{staticStyle:{"margin-bottom":"10px","margin-top":"10px"},attrs:{"prefix-icon":"el-icon-search",placeholder:"搜索服务...",size:"mini",clearable:""},model:{value:e.filterText,callback:function(t){e.filterText=t},expression:"filterText"}}),e._v(" "),o("el-tree",{ref:"serviceTree",staticClass:"filter-tree",attrs:{data:e.treeData,props:e.defaultProps,"filter-node-method":e.filterNode,"highlight-current":!0,"expand-on-click-node":!1,"empty-text":"无数据","node-key":"serviceId","default-expand-all":""},on:{"node-click":e.onNodeClick},scopedSlots:e._u([{key:"default",fn:function(t){t.node;var a=t.data;return o("span",{staticClass:"custom-tree-node"},[o("div",[o("el-tooltip",{directives:[{name:"show",rawName:"v-show",value:a.custom,expression:"data.custom"}],staticClass:"item",attrs:{content:"自定义服务",effect:"light",placement:"top"}},[o("i",{staticClass:"el-icon-warning-outline"})]),e._v(" "),a.label.length0?t.join(", "):'未授权'},onRouteDialogSave:function(){var e=this;this.$refs.routeDialogFormRef.validate(function(t){if(t){var o=e.routeDialogFormData.id?"route.update":"route.add";e.routeDialogFormData.serviceId=e.serviceId,e.post(o,e.routeDialogFormData,function(){this.routeDialogVisible=!1,this.loadTable()})}})},onAuthDialogSave:function(){this.post("route.role.update",this.authDialogFormData,function(){this.authDialogVisible=!1,this.loadTable()})},addService:function(){this.addServiceDialogVisible=!0},closeAddServiceDlg:function(){this.$refs.addServiceForm.resetFields()},onAddService:function(){var e=this;this.$refs.addServiceForm.validate(function(t){t&&e.post("service.custom.add",e.addServiceForm,function(e){this.addServiceDialogVisible=!1,this.tip("添加成功"),this.loadTree()})})},onDelService:function(e){var t=e.serviceId;this.confirm("确认要删除服务"+t+"吗,【对应的路由配置会一起删除】",function(e){var o={serviceId:t};this.post("service.custom.del",o,function(){e(),this.tip("删除成功"),this.loadTree()})})}}},l=r,s=(o("55a2"),o("2877")),n=Object(s["a"])(l,a,i,!1,null,null,null);t["default"]=n.exports},"55a2":function(e,t,o){"use strict";var a=o("b294"),i=o.n(a);i.a},b294:function(e,t,o){}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-vue/src/utils/global.js b/sop-admin/sop-admin-vue/src/utils/global.js index 1d3b1bca..e8e7570f 100644 --- a/sop-admin/sop-admin-vue/src/utils/global.js +++ b/sop-admin/sop-admin-vue/src/utils/global.js @@ -8,7 +8,7 @@ import { getToken, removeToken } from './auth' // 创建axios实例 const client = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // api 的 base_url - timeout: 5000 // 请求超时时间 + timeout: 10000 // 请求超时时间 }) Object.assign(Vue.prototype, { @@ -94,6 +94,14 @@ Object.assign(Vue.prototype, { } }).catch(function() {}) }, + /** + * 重置表单 + * @param formName 表单元素的ref + */ + resetForm(formName) { + const frm = this.$refs[formName] + frm && frm.resetFields() + }, logout: function() { removeToken() const fullPath = this.$route.fullPath diff --git a/sop-admin/sop-admin-vue/src/views/service/limit/index2.vue b/sop-admin/sop-admin-vue/src/views/service/limit/index2.vue index 96ef8bbb..b7065189 100644 --- a/sop-admin/sop-admin-vue/src/views/service/limit/index2.vue +++ b/sop-admin/sop-admin-vue/src/views/service/limit/index2.vue @@ -1,7 +1,7 @@