From f03be910c48f674f0eb44a24ea4d55542b2f1102 Mon Sep 17 00:00:00 2001 From: tanghc Date: Wed, 7 Aug 2019 15:11:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=A2=84=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E3=80=81=E7=81=B0=E5=BA=A6=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/docs/files/10110_预发布灰度发布.md | 32 ++++--- sop-1.14.0.sql | 24 +++-- .../adminserver/api/service/ServiceApi.java | 38 +++++--- ...nition.java => ServiceGrayDefinition.java} | 3 +- .../adminserver/bean/ZookeeperContext.java | 4 +- .../adminserver/common/ChannelOperation.java | 10 +- .../mapper/ConfigGrayUserkeyMapper.java | 12 --- .../src/main/resources/public/index.html | 2 +- ...0599db.css => chunk-ea2e58a4.d10599db.css} | 0 .../js/{app.4a507d5e.js => app.8145abe4.js} | 2 +- .../static/js/chunk-2d208c3a.93f165b2.js | 1 - ...8f017357.js => chunk-2d221c34.c8ef105a.js} | 2 +- .../static/js/chunk-9f479afe.1204bc29.js | 1 + ...994a3ac0.js => chunk-ea2e58a4.f3f85b0e.js} | 4 +- .../src/views/service/serviceList.vue | 16 +--- .../bean/BaseServiceRouteInfo.java | 4 + ...nition.java => ServiceGrayDefinition.java} | 3 +- .../manager/DefaultEnvGrayManager.java | 58 +++++++----- .../gatewaycommon/manager/EnvGrayManager.java | 35 ++++++- .../manager/ZookeeperContext.java | 4 +- .../zuul/filter/PreVersionDecisionFilter.java | 18 +--- .../zuul/loadbalancer/BaseServerChooser.java | 8 -- .../zuul/loadbalancer/ServiceGrayConfig.java | 6 -- ...ConfigGrayUserkey.java => ConfigGray.java} | 18 ++-- .../gateway/entity/ConfigGrayInstance.java | 21 ++--- .../EnvironmentServerChooser.java | 19 +--- .../sop/gateway/manager/DbEnvGrayManager.java | 91 ++++++++++--------- .../gateway/manager/DbIPBlacklistManager.java | 1 - .../sop/gateway/manager/DbIsvManager.java | 1 - .../manager/DbIsvRoutePermissionManager.java | 2 + .../gateway/manager/DbLimitConfigManager.java | 1 - .../gateway/manager/DbRouteConfigManager.java | 1 - .../mapper/ConfigGrayInstanceMapper.java | 11 +++ .../sop/gateway/mapper/ConfigGrayMapper.java | 11 +++ .../mapper/ConfigGrayUserkeyMapper.java | 11 --- .../main/resources/application-dev.properties | 3 + sop.sql | 27 ++++-- 37 files changed, 278 insertions(+), 227 deletions(-) rename sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/{UserKeyDefinition.java => ServiceGrayDefinition.java} (69%) delete mode 100644 sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/ConfigGrayUserkeyMapper.java rename sop-admin/sop-admin-server/src/main/resources/public/static/css/{chunk-29e7142c.d10599db.css => chunk-ea2e58a4.d10599db.css} (100%) rename sop-admin/sop-admin-server/src/main/resources/public/static/js/{app.4a507d5e.js => app.8145abe4.js} (99%) delete mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d208c3a.93f165b2.js rename sop-admin/sop-admin-server/src/main/resources/public/static/js/{chunk-2d221c34.8f017357.js => chunk-2d221c34.c8ef105a.js} (65%) create mode 100644 sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-9f479afe.1204bc29.js rename sop-admin/sop-admin-server/src/main/resources/public/static/js/{chunk-29e7142c.994a3ac0.js => chunk-ea2e58a4.f3f85b0e.js} (98%) rename sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/{UserKeyDefinition.java => ServiceGrayDefinition.java} (69%) rename sop-gateway/src/main/java/com/gitee/sop/gateway/entity/{ConfigGrayUserkey.java => ConfigGray.java} (62%) rename sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/ConfigGrayUserkey.java => sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayInstance.java (55%) create mode 100644 sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayInstanceMapper.java create mode 100644 sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayMapper.java delete mode 100644 sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayUserkeyMapper.java diff --git a/doc/docs/files/10110_预发布灰度发布.md b/doc/docs/files/10110_预发布灰度发布.md index 6a19915d..fec894bb 100644 --- a/doc/docs/files/10110_预发布灰度发布.md +++ b/doc/docs/files/10110_预发布灰度发布.md @@ -11,21 +11,31 @@ |open1.domain.com |网关服务器1 | |openpre.domain.com | 网关服务器2,作为预发布请求入口| -线上域名为`open.domain.com`,请求网关`http://open.domain.com/api`会负载均衡到这两台服务器 +线上网关入口为`http://open.domain.com/api`,请求网关`http://open.domain.com/api`会负载均衡到这两台服务器 -在网关工程打开`com.gitee.sop.gateway.loadbalancer.EnvironmentServerChooser`类,修改`PRE_DOMAIN`变量 +SOP开启预发布步骤如下: -```java -/** - * 预发布机器域名 - */ -private static final String PRE_DOMAIN = "openpre.domain.com"; +修改网关工程配置文件,指定预发布域名 + +```properties +# 预发布网关域名 +pre.domain=openpre.domain.com ``` +重启网关 -网关工程打包发布到阿里云 - -登录SOP-Admin,在服务列表中点击预发布,然后接口的请求地址变成:`http://openpre.domain.com/api` +登录SOP-Admin,在服务列表中点击预发布,然后预发布请求地址变成:`http://openpre.domain.com/api`。 +从`openpre.domain.com`请求进来的用户都会进预发布服务器,其它情况都走非预发布服务器。 ## 使用灰度发布 -灰度发布可允许指定的用户进行访问,其它用户则走正常流程。 +灰度发布可允许指定的用户访问灰度服务器,其它用户还是走正常流程。 + +登录SOP-Admin,前往服务列表。 + +- 先设置灰度参数,指定灰度用户和灰度接口 +- 服务器实例开启灰度 + +参考类: + +- PreVersionDecisionFilter.java +- EnvironmentServerChooser.java \ No newline at end of file diff --git a/sop-1.14.0.sql b/sop-1.14.0.sql index b2669e93..c3bcff6f 100644 --- a/sop-1.14.0.sql +++ b/sop-1.14.0.sql @@ -1,13 +1,25 @@ use sop; -CREATE TABLE `config_gray_userkey` ( +CREATE TABLE `config_gray` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'serviceId', + `service_id` varchar(64) NOT NULL DEFAULT '', `user_key_content` text COMMENT '用户key,多个用引文逗号隔开', - `name_version_content` text COMMENT '需要灰度的接口,goods.get=1.2,order.list=1.2', - `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0:禁用,1:启用', + `name_version_content` text COMMENT '需要灰度的接口,goods.get1.0=1.2,多个用英文逗号隔开', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `uk_instanceid` (`instance_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='灰度发布用户key'; \ No newline at end of file + UNIQUE KEY `uk_serviceid` (`service_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='服务灰度配置'; + + +CREATE TABLE `config_gray_instance` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'instance_id', + `service_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'service_id', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:禁用,1:启用', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_instanceid` (`instance_id`) USING BTREE, + KEY `idx_serviceid` (`service_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='开启灰度服务器实例'; \ No newline at end of file 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 170ac8ec..1b7e2118 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 @@ -15,8 +15,8 @@ import com.gitee.sop.adminserver.api.service.result.ServiceInfoVo; import com.gitee.sop.adminserver.api.service.result.ServiceInstanceVO; import com.gitee.sop.adminserver.bean.ChannelMsg; import com.gitee.sop.adminserver.bean.MetadataEnum; +import com.gitee.sop.adminserver.bean.ServiceGrayDefinition; import com.gitee.sop.adminserver.bean.ServiceRouteInfo; -import com.gitee.sop.adminserver.bean.UserKeyDefinition; import com.gitee.sop.adminserver.bean.ZookeeperContext; import com.gitee.sop.adminserver.common.BizException; import com.gitee.sop.adminserver.common.ChannelOperation; @@ -215,14 +215,13 @@ public class ServiceApi { @Api(name = "service.gray.config.get") @ApiDocMethod(description = "灰度配置--获取") ConfigGray serviceEnvGrayConfigGet(ServiceIdParam param) throws IOException { - String serviceId = param.getServiceId(); - return configGrayMapper.getByColumn("service_id", serviceId); + return this.getConfigGray(param.getServiceId()); } @Api(name = "service.gray.config.save") @ApiDocMethod(description = "灰度配置--保存") void serviceEnvGrayConfigSave(ServiceGrayConfigParam param) throws IOException { - String serviceId = param.getServiceId(); + String serviceId = param.getServiceId().toLowerCase(); ConfigGray configGray = configGrayMapper.getByColumn("service_id", serviceId); if (configGray == null) { configGray = new ConfigGray(); @@ -235,16 +234,21 @@ public class ServiceApi { configGray.setUserKeyContent(param.getUserKeyContent()); configGrayMapper.update(configGray); } + this.sendServiceGrayMsg(serviceId, ChannelOperation.GRAY_USER_KEY_SET); } @Api(name = "service.instance.env.gray.open") @ApiDocMethod(description = "开启灰度发布") void serviceEnvGray(ServiceInstanceParam param) throws IOException { try { + String serviceId = param.getServiceId().toLowerCase(); + ConfigGray configGray = this.getConfigGray(serviceId); + if (configGray == null) { + throw new BizException("请先设置灰度参数"); + } MetadataEnum envPre = MetadataEnum.ENV_GRAY; registryService.setMetadata(param.buildServiceInstance(), envPre.getKey(), envPre.getValue()); - String serviceId = param.getServiceId(); String instanceId = param.getInstanceId(); ConfigGrayInstance configGrayInstance = configGrayInstanceMapper.getByColumn("instance_id", instanceId); @@ -256,9 +260,10 @@ public class ServiceApi { configGrayInstanceMapper.save(configGrayInstance); } else { configGrayInstance.setStatus(StatusEnum.STATUS_ENABLE.getStatus()); + configGrayInstance.setServiceId(serviceId); configGrayInstanceMapper.update(configGrayInstance); } - this.sendUserKeyMsg(instanceId, ChannelOperation.GRAY_USER_KEY_SET); + this.sendServiceGrayMsg(instanceId, serviceId, ChannelOperation.GRAY_USER_KEY_OPEN); } catch (Exception e) { log.error("灰度发布失败,param:{}", param, e); throw new BizException("灰度发布失败,请查看日志"); @@ -276,8 +281,8 @@ public class ServiceApi { if (configGrayInstance != null) { configGrayInstance.setStatus(StatusEnum.STATUS_DISABLE.getStatus()); configGrayInstanceMapper.update(configGrayInstance); + this.sendServiceGrayMsg(param.getInstanceId(), param.getServiceId().toLowerCase(), ChannelOperation.GRAY_USER_KEY_CLOSE); } - this.sendUserKeyMsg(param.getInstanceId(), ChannelOperation.GRAY_USER_KEY_CLEAR); } catch (Exception e) { log.error("上线失败,param:{}", param, e); throw new BizException("上线失败,请查看日志"); @@ -289,14 +294,23 @@ public class ServiceApi { return configGrayUserkeyMapper.getByColumn("instance_id", param.getInstanceId()); } - private void sendUserKeyMsg(String instanceId, ChannelOperation channelOperation) { - UserKeyDefinition userKeyDefinition = new UserKeyDefinition(); - userKeyDefinition.setInstanceId(instanceId); - ChannelMsg channelMsg = new ChannelMsg(channelOperation, userKeyDefinition); + private void sendServiceGrayMsg(String serviceId, ChannelOperation channelOperation) { + this.sendServiceGrayMsg(null, serviceId, channelOperation); + } + + private void sendServiceGrayMsg(String instanceId, String serviceId, ChannelOperation channelOperation) { + ServiceGrayDefinition serviceGrayDefinition = new ServiceGrayDefinition(); + serviceGrayDefinition.setInstanceId(instanceId); + serviceGrayDefinition.setServiceId(serviceId); + ChannelMsg channelMsg = new ChannelMsg(channelOperation, serviceGrayDefinition); String jsonData = JSON.toJSONString(channelMsg); - String path = ZookeeperContext.getUserKeyChannelPath(); + String path = ZookeeperContext.getServiceGrayChannelPath(); log.info("消息推送--灰度发布({}), path:{}, data:{}",channelOperation.getOperation(), path, jsonData); ZookeeperContext.createOrUpdateData(path, jsonData); } + private ConfigGray getConfigGray(String serviceId) { + return configGrayMapper.getByColumn("service_id", serviceId); + } + } diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/UserKeyDefinition.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceGrayDefinition.java similarity index 69% rename from sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/UserKeyDefinition.java rename to sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceGrayDefinition.java index ffb6cb9b..ffee4676 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/UserKeyDefinition.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/bean/ServiceGrayDefinition.java @@ -6,7 +6,8 @@ import lombok.Data; * @author tanghc */ @Data -public class UserKeyDefinition { +public class ServiceGrayDefinition { + private String serviceId; private String instanceId; private String data; } 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 285433f0..bbe5f788 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 @@ -89,8 +89,8 @@ public class ZookeeperContext { return serviceIdPath + "/" + routeId; } - public static String getUserKeyChannelPath() { - return SOP_MSG_CHANNEL_PATH + "/userkey"; + public static String getServiceGrayChannelPath() { + return SOP_MSG_CHANNEL_PATH + "/gray"; } public static String getIsvInfoChannelPath() { diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ChannelOperation.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ChannelOperation.java index 741ae0b8..97c2f467 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ChannelOperation.java +++ b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/common/ChannelOperation.java @@ -38,13 +38,17 @@ public enum ChannelOperation { ROUTE_PERMISSION_RELOAD("reload"), /** - * 灰度发布用户key设置 + * 灰度发布设置 */ GRAY_USER_KEY_SET("set"), /** - * 灰度发布用户key清除 + * 灰度发布-开启 */ - GRAY_USER_KEY_CLEAR("clear"), + GRAY_USER_KEY_OPEN("open"), + /** + * 灰度发布-关闭 + */ + GRAY_USER_KEY_CLOSE("close"), ; diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/ConfigGrayUserkeyMapper.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/ConfigGrayUserkeyMapper.java deleted file mode 100644 index 7af34e0d..00000000 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/mapper/ConfigGrayUserkeyMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gitee.sop.adminserver.mapper; - -import com.gitee.fastmybatis.core.mapper.CrudMapper; - -import com.gitee.sop.adminserver.entity.ConfigGrayUserkey; - - -/** - * @author tanghc - */ -public interface ConfigGrayUserkeyMapper extends CrudMapper { -} 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 184268e7..9d5ffdda 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-29e7142c.d10599db.css b/sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-ea2e58a4.d10599db.css similarity index 100% rename from sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-29e7142c.d10599db.css rename to sop-admin/sop-admin-server/src/main/resources/public/static/css/chunk-ea2e58a4.d10599db.css diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.4a507d5e.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.8145abe4.js similarity index 99% rename from sop-admin/sop-admin-server/src/main/resources/public/static/js/app.4a507d5e.js rename to sop-admin/sop-admin-server/src/main/resources/public/static/js/app.8145abe4.js index d70a41b1..03fbcc41 100644 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.4a507d5e.js +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/app.8145abe4.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),c=new i.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});r.a.add(c);t["default"]=c},"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")),c=n.n(r),s=(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,s,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}},k={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)}},_={namespaced:!0,state:x,mutations:y,actions:k},C=n("83d6"),O=n.n(C),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 I(e){return j({url:"/user/login",method:"post",data:e})}function P(e){return j({url:"/user/info",method:"get",params:{token:e}})}function N(){return j({url:"/user/logout",method:"post"})}var D=n("8c4f"),R=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)},q=[],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,ce={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()}}},se=ce,ue=(n("405a"),Object(m["a"])(se,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"),ke=n.n(ye);function _e(e){return/^(https?:|mailto:|tel:)/.test(e)}var Ce,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,Ce,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 _e(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 _e(e)?e:_e(this.basePath)?this.basePath:ke.a.resolve(this.basePath,e)}}},Ie=je,Pe=Object(m["a"])(Ie,we,xe,!1,null,null,null),Ne=Pe.exports,De=n("cf1e"),Re=n.n(De),qe={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 Re.a},isCollapse:function(){return!this.sidebar.opened}})},Ge=qe,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(c);t["default"]=c},"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),c=new i.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});r.a.add(c);t["default"]=c}},[[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),c=new i.a({id:"icon-link",use:"icon-link-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-password",use:"icon-password-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-example",use:"icon-example-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-table",use:"icon-table-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},"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),c=new i.a({id:"icon-eye",use:"icon-eye-usage",viewBox:"0 0 128 64",content:''});r.a.add(c);t["default"]=c},"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")),c=n.n(r),s=(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,s,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}},k={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)}},_={namespaced:!0,state:x,mutations:y,actions:k},C=n("83d6"),O=n.n(C),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 I(e){return j({url:"/user/login",method:"post",data:e})}function P(e){return j({url:"/user/info",method:"get",params:{token:e}})}function N(){return j({url:"/user/logout",method:"post"})}var D=n("8c4f"),R=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)},q=[],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,ce={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()}}},se=ce,ue=(n("405a"),Object(m["a"])(se,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"),ke=n.n(ye);function _e(e){return/^(https?:|mailto:|tel:)/.test(e)}var Ce,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,Ce,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 _e(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 _e(e)?e:_e(this.basePath)?this.basePath:ke.a.resolve(this.basePath,e)}}},Ie=je,Pe=Object(m["a"])(Ie,we,xe,!1,null,null,null),Ne=Pe.exports,De=n("cf1e"),Re=n.n(De),qe={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 Re.a},isCollapse:function(){return!this.sidebar.opened}})},Ge=qe,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(c);t["default"]=c},"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),c=new i.a({id:"icon-user",use:"icon-user-usage",viewBox:"0 0 130 130",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-eye-open",use:"icon-eye-open-usage",viewBox:"0 0 1024 1024",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-nested",use:"icon-nested-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-form",use:"icon-form-usage",viewBox:"0 0 128 128",content:''});r.a.add(c);t["default"]=c},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),c=new i.a({id:"icon-dashboard",use:"icon-dashboard-usage",viewBox:"0 0 128 100",content:''});r.a.add(c);t["default"]=c}},[[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-2d208c3a.93f165b2.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d208c3a.93f165b2.js deleted file mode 100644 index b4948d4d..00000000 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d208c3a.93f165b2.js +++ /dev/null @@ -1 +0,0 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d208c3a"],{a5d4:function(t,e,n){"use strict";n.r(e);var a=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-container"},[n("el-form",{staticClass:"demo-form-inline",attrs:{inline:!0,model:t.searchFormData,size:"mini"}},[n("el-form-item",{attrs:{label:"serviceId"}},[n("el-input",{staticStyle:{width:"250px"},attrs:{clearable:!0,placeholder:"serviceId"},model:{value:t.searchFormData.serviceId,callback:function(e){t.$set(t.searchFormData,"serviceId",e)},expression:"searchFormData.serviceId"}})],1),t._v(" "),n("el-form-item",[n("el-button",{attrs:{type:"primary",icon:"el-icon-search"},on:{click:t.onSearchTable}},[t._v("查询")])],1)],1),t._v(" "),n("el-table",{staticStyle:{width:"100%","margin-bottom":"20px"},attrs:{data:t.tableData,border:"","row-key":"id"}},[n("el-table-column",{attrs:{prop:"serviceId",label:"服务名称",width:"200"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("span",{domProps:{innerHTML:t._s(t.renderServiceName(e.row))}})]}}])}),t._v(" "),n("el-table-column",{attrs:{prop:"ipPort",label:"IP端口",width:"250"}}),t._v(" "),n("el-table-column",{attrs:{prop:"status",label:"服务状态",width:"100"},scopedSlots:t._u([{key:"default",fn:function(e){return[e.row.parentId>0&&"UP"===e.row.status?n("el-tag",{attrs:{type:"success"}},[t._v("已上线")]):t._e(),t._v(" "),e.row.parentId>0&&"STARTING"===e.row.status?n("el-tag",{attrs:{type:"info"}},[t._v("正在启动")]):t._e(),t._v(" "),e.row.parentId>0&&"UNKNOWN"===e.row.status?n("el-tag",[t._v("未知")]):t._e(),t._v(" "),e.row.parentId>0&&("OUT_OF_SERVICE"===e.row.status||"DOWN"===e.row.status)?n("el-tag",{attrs:{type:"danger"}},[t._v("已下线")]):t._e()]}}])}),t._v(" "),n("el-table-column",{attrs:{prop:"updateTime",label:"最后更新时间",width:"160"}}),t._v(" "),n("el-table-column",{attrs:{label:"操作",width:"100"},scopedSlots:t._u([{key:"default",fn:function(e){return[e.row.parentId>0&&"UP"===e.row.status?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return t.onOffline(e.row)}}},[t._v("下线")]):t._e(),t._v(" "),e.row.parentId>0&&"OUT_OF_SERVICE"===e.row.status?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return t.onOnline(e.row)}}},[t._v("上线")]):t._e()]}}])})],1)],1)},r=[],i=(n("ac6a"),{data:function(){return{searchFormData:{serviceId:""},tableData:[]}},created:function(){this.loadTable()},methods:{loadTable:function(){this.post("service.instance.list",this.searchFormData,function(t){this.tableData=this.buildTreeData(t.data)})},buildTreeData:function(t){return t.forEach(function(e){var n=e.parentId;0===n||t.forEach(function(t){if(t.id===n){var a=t.children;a||(a=[]),a.push(e),t.children=a}})}),t=t.filter(function(t){return 0===t.parentId}),t},onSearchTable:function(){this.loadTable()},onOffline:function(t){this.confirm("确定要下线【"+t.serviceId+"】吗?",function(e){this.post("service.instance.offline",t,function(){this.tip("下线成功"),e()})})},onOnline:function(t){this.confirm("确定要上线【"+t.serviceId+"】吗?",function(e){this.post("service.instance.online",t,function(){this.tip("上线成功"),e()})})},renderServiceName:function(t){var e="";if(t.children&&t.children.length>0){var n=t.children.filter(function(t){return"UP"===t.status}).length;e=" (".concat(n,"/").concat(t.children.length,")")}return t.serviceId+e}}}),o=i,s=n("2877"),l=Object(s["a"])(o,a,r,!1,null,null,null);e["default"]=l.exports}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d221c34.8f017357.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d221c34.c8ef105a.js similarity index 65% rename from sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d221c34.8f017357.js rename to sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d221c34.c8ef105a.js index 282b5296..379d4bc1 100644 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d221c34.8f017357.js +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-2d221c34.c8ef105a.js @@ -1 +1 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d221c34"],{cc75:function(a,t,e){"use strict";e.r(t);var i=function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("div",{staticClass:"app-container"},[e("el-form",{staticClass:"demo-form-inline",attrs:{inline:!0,model:a.searchFormData,size:"mini"}},[e("el-form-item",{attrs:{label:"IP"}},[e("el-input",{staticStyle:{width:"250px"},attrs:{clearable:!0,placeholder:"输入IP"},model:{value:a.searchFormData.ip,callback:function(t){a.$set(a.searchFormData,"ip",t)},expression:"searchFormData.ip"}})],1),a._v(" "),e("el-form-item",[e("el-button",{attrs:{type:"primary",icon:"el-icon-search"},on:{click:a.loadTable}},[a._v("查询")])],1)],1),a._v(" "),e("el-button",{staticStyle:{"margin-bottom":"10px"},attrs:{type:"primary",size:"mini",icon:"el-icon-plus"},on:{click:a.onAdd}},[a._v("新增IP")]),a._v(" "),e("el-table",{attrs:{data:a.pageInfo.rows,border:"","highlight-current-row":""}},[e("el-table-column",{attrs:{prop:"ip",label:"IP",width:"200"}}),a._v(" "),e("el-table-column",{attrs:{prop:"remark",label:"备注",width:"300"}}),a._v(" "),e("el-table-column",{attrs:{prop:"gmtCreate",label:"添加时间",width:"160"}}),a._v(" "),e("el-table-column",{attrs:{prop:"gmtModified",label:"修改时间",width:"160"}}),a._v(" "),e("el-table-column",{attrs:{label:"操作",width:"150"},scopedSlots:a._u([{key:"default",fn:function(t){return[e("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(e){return a.onTableUpdate(t.row)}}},[a._v("修改")]),a._v(" "),e("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(e){return a.onTableDelete(t.row)}}},[a._v("删除")])]}}])})],1),a._v(" "),e("el-pagination",{staticStyle:{"margin-top":"5px"},attrs:{background:"","current-page":a.searchFormData.pageIndex,"page-size":a.searchFormData.pageSize,"page-sizes":[5,10,20,40],total:a.pageInfo.total,layout:"total, sizes, prev, pager, next"},on:{"size-change":a.onSizeChange,"current-change":a.onPageIndexChange}}),a._v(" "),e("el-dialog",{attrs:{title:a.dialogTitle,visible:a.dialogVisible,"close-on-click-modal":!1},on:{"update:visible":function(t){a.dialogVisible=t},close:function(t){return a.resetForm("dialogForm")}}},[e("el-form",{ref:"dialogForm",attrs:{rules:a.dialogFormRules,model:a.dialogFormData,"label-width":"120px",size:"mini"}},[e("el-form-item",{attrs:{prop:"ip",label:"IP"}},[e("el-input",{directives:[{name:"show",rawName:"v-show",value:0===a.dialogFormData.id,expression:"dialogFormData.id === 0"}],model:{value:a.dialogFormData.ip,callback:function(t){a.$set(a.dialogFormData,"ip",t)},expression:"dialogFormData.ip"}}),a._v(" "),e("span",{directives:[{name:"show",rawName:"v-show",value:a.dialogFormData.id>0,expression:"dialogFormData.id > 0"}]},[a._v(a._s(a.dialogFormData.ip))])],1),a._v(" "),e("el-form-item",{attrs:{prop:"remark",label:"备注"}},[e("el-input",{model:{value:a.dialogFormData.remark,callback:function(t){a.$set(a.dialogFormData,"remark",t)},expression:"dialogFormData.remark"}})],1)],1),a._v(" "),e("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[e("el-button",{on:{click:function(t){a.dialogVisible=!1}}},[a._v("取 消")]),a._v(" "),e("el-button",{attrs:{type:"primary"},on:{click:a.onDialogSave}},[a._v("保 存")])],1)],1)],1)},o=[],l={data:function(){var a=function(a,t,e){if(""===t)e(new Error("请输入IP"));else{var i=/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;i.test(t)||e(new Error("IP格式不正确")),e()}};return{searchFormData:{ip:"",pageIndex:1,pageSize:10},pageInfo:{rows:[],total:0},dialogVisible:!1,dialogTitle:"",dialogFormData:{id:0,ip:"",remark:""},dialogFormRules:{ip:[{validator:a,trigger:"blur"},{min:1,max:64,message:"长度在 1 到 64 个字符",trigger:"blur"}],remark:[{max:100,message:"不能超过 100 个字符",trigger:"blur"}]}}},created:function(){this.loadTable()},methods:{loadTable:function(){this.post("ip.blacklist.page",this.searchFormData,function(a){this.pageInfo=a.data})},onTableUpdate:function(a){var t=this;this.dialogTitle="修改IP",this.dialogVisible=!0,this.$nextTick(function(){Object.assign(t.dialogFormData,a)})},onTableDelete:function(a){this.confirm("确认要移除IP【".concat(a.ip,"】吗?"),function(t){var e={id:a.id};this.post("ip.blacklist.del",e,function(){t(),this.tip("删除成功"),this.loadTable()})})},onDialogSave:function(){var a=this;this.$refs.dialogForm.validate(function(t){if(t){var e=a.dialogFormData.id?"ip.blacklist.update":"ip.blacklist.add";a.post(e,a.dialogFormData,function(){this.dialogVisible=!1,this.loadTable()})}})},onSizeChange:function(a){this.searchFormData.pageSize=a,this.loadTable()},onAdd:function(){this.dialogTitle="新增IP",this.dialogVisible=!0,this.dialogFormData.id=0},onPageIndexChange:function(a){this.searchFormData.pageIndex=a,this.loadTable()}}},r=l,n=e("2877"),s=Object(n["a"])(r,i,o,!1,null,null,null);t["default"]=s.exports}}]); \ No newline at end of file +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d221c34"],{cc75:function(a,t,e){"use strict";e.r(t);var i=function(){var a=this,t=a.$createElement,e=a._self._c||t;return e("div",{staticClass:"app-container"},[e("el-form",{staticClass:"demo-form-inline",attrs:{inline:!0,model:a.searchFormData,size:"mini"}},[e("el-form-item",{attrs:{label:"IP"}},[e("el-input",{staticStyle:{width:"250px"},attrs:{clearable:!0,placeholder:"输入IP"},model:{value:a.searchFormData.ip,callback:function(t){a.$set(a.searchFormData,"ip",t)},expression:"searchFormData.ip"}})],1),a._v(" "),e("el-form-item",[e("el-button",{attrs:{type:"primary",icon:"el-icon-search"},on:{click:a.loadTable}},[a._v("查询")])],1)],1),a._v(" "),e("el-button",{staticStyle:{"margin-bottom":"10px"},attrs:{type:"primary",size:"mini",icon:"el-icon-plus"},on:{click:a.onAdd}},[a._v("新增IP")]),a._v(" "),e("el-table",{attrs:{data:a.pageInfo.rows,border:"","highlight-current-row":""}},[e("el-table-column",{attrs:{prop:"ip",label:"IP",width:"200"}}),a._v(" "),e("el-table-column",{attrs:{prop:"remark",label:"备注",width:"300"}}),a._v(" "),e("el-table-column",{attrs:{prop:"gmtCreate",label:"添加时间",width:"160"}}),a._v(" "),e("el-table-column",{attrs:{prop:"gmtModified",label:"修改时间",width:"160"}}),a._v(" "),e("el-table-column",{attrs:{label:"操作",width:"150"},scopedSlots:a._u([{key:"default",fn:function(t){return[e("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(e){return a.onTableUpdate(t.row)}}},[a._v("修改")]),a._v(" "),e("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(e){return a.onTableDelete(t.row)}}},[a._v("删除")])]}}])})],1),a._v(" "),e("el-pagination",{staticStyle:{"margin-top":"5px"},attrs:{background:"","current-page":a.searchFormData.pageIndex,"page-size":a.searchFormData.pageSize,"page-sizes":[5,10,20,40],total:a.pageInfo.total,layout:"total, sizes, prev, pager, next"},on:{"size-change":a.onSizeChange,"current-change":a.onPageIndexChange}}),a._v(" "),e("el-dialog",{attrs:{title:a.dialogTitle,visible:a.dialogVisible,"close-on-click-modal":!1},on:{"update:visible":function(t){a.dialogVisible=t},close:function(t){return a.resetForm("dialogForm")}}},[e("el-form",{ref:"dialogForm",attrs:{rules:a.dialogFormRules,model:a.dialogFormData,"label-width":"120px",size:"mini"}},[e("el-form-item",{attrs:{prop:"ip",label:"IP"}},[e("el-input",{directives:[{name:"show",rawName:"v-show",value:0===a.dialogFormData.id,expression:"dialogFormData.id === 0"}],model:{value:a.dialogFormData.ip,callback:function(t){a.$set(a.dialogFormData,"ip",t)},expression:"dialogFormData.ip"}}),a._v(" "),e("span",{directives:[{name:"show",rawName:"v-show",value:a.dialogFormData.id>0,expression:"dialogFormData.id > 0"}]},[a._v(a._s(a.dialogFormData.ip))])],1),a._v(" "),e("el-form-item",{attrs:{prop:"remark",label:"备注"}},[e("el-input",{model:{value:a.dialogFormData.remark,callback:function(t){a.$set(a.dialogFormData,"remark",t)},expression:"dialogFormData.remark"}})],1)],1),a._v(" "),e("div",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[e("el-button",{on:{click:function(t){a.dialogVisible=!1}}},[a._v("取 消")]),a._v(" "),e("el-button",{attrs:{type:"primary"},on:{click:a.onDialogSave}},[a._v("保 存")])],1)],1)],1)},o=[],l={data:function(){var a=/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/,t=function(t,e,i){""===e?i(new Error("请输入IP")):(a.test(e)||i(new Error("IP格式不正确")),i())};return{searchFormData:{ip:"",pageIndex:1,pageSize:10},pageInfo:{rows:[],total:0},dialogVisible:!1,dialogTitle:"",dialogFormData:{id:0,ip:"",remark:""},dialogFormRules:{ip:[{validator:t,trigger:"blur"},{min:1,max:64,message:"长度在 1 到 64 个字符",trigger:"blur"}],remark:[{max:100,message:"不能超过 100 个字符",trigger:"blur"}]}}},created:function(){this.loadTable()},methods:{loadTable:function(){this.post("ip.blacklist.page",this.searchFormData,function(a){this.pageInfo=a.data})},onTableUpdate:function(a){var t=this;this.dialogTitle="修改IP",this.dialogVisible=!0,this.$nextTick(function(){Object.assign(t.dialogFormData,a)})},onTableDelete:function(a){this.confirm("确认要移除IP【".concat(a.ip,"】吗?"),function(t){var e={id:a.id};this.post("ip.blacklist.del",e,function(){t(),this.tip("删除成功"),this.loadTable()})})},onDialogSave:function(){var a=this;this.$refs.dialogForm.validate(function(t){if(t){var e=a.dialogFormData.id?"ip.blacklist.update":"ip.blacklist.add";a.post(e,a.dialogFormData,function(){this.dialogVisible=!1,this.loadTable()})}})},onSizeChange:function(a){this.searchFormData.pageSize=a,this.loadTable()},onAdd:function(){this.dialogTitle="新增IP",this.dialogVisible=!0,this.dialogFormData.id=0},onPageIndexChange:function(a){this.searchFormData.pageIndex=a,this.loadTable()}}},r=l,n=e("2877"),s=Object(n["a"])(r,i,o,!1,null,null,null);t["default"]=s.exports}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-9f479afe.1204bc29.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-9f479afe.1204bc29.js new file mode 100644 index 00000000..6bd0e42d --- /dev/null +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-9f479afe.1204bc29.js @@ -0,0 +1 @@ +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-9f479afe"],{"02f4":function(e,t,n){var r=n("4588"),o=n("be13");e.exports=function(e){return function(t,n){var i,a,s=String(o(t)),l=r(n),c=s.length;return l<0||l>=c?e?"":void 0:(i=s.charCodeAt(l),i<55296||i>56319||l+1===c||(a=s.charCodeAt(l+1))<56320||a>57343?e?s.charAt(l):i:e?s.slice(l,l+2):a-56320+(i-55296<<10)+65536)}}},"0390":function(e,t,n){"use strict";var r=n("02f4")(!0);e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},"0bfb":function(e,t,n){"use strict";var r=n("cb7c");e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},"214f":function(e,t,n){"use strict";n("b0c5");var r=n("2aba"),o=n("32e9"),i=n("79e5"),a=n("be13"),s=n("2b4c"),l=n("520a"),c=s("species"),u=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}),f=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var d=s(e),p=!i(function(){var t={};return t[d]=function(){return 7},7!=""[e](t)}),v=p?!i(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[c]=function(){return n}),n[d](""),!t}):void 0;if(!p||!v||"replace"===e&&!u||"split"===e&&!f){var g=/./[d],h=n(a,d,""[e],function(e,t,n,r,o){return t.exec===l?p&&!o?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),m=h[0],y=h[1];r(String.prototype,e,m),o(RegExp.prototype,d,2==t?function(e,t){return y.call(e,this,t)}:function(e){return y.call(e,this)})}}},"28a5":function(e,t,n){"use strict";var r=n("aae3"),o=n("cb7c"),i=n("ebd6"),a=n("0390"),s=n("9def"),l=n("5f1b"),c=n("520a"),u=n("79e5"),f=Math.min,d=[].push,p="split",v="length",g="lastIndex",h=4294967295,m=!u(function(){RegExp(h,"y")});n("214f")("split",2,function(e,t,n,u){var y;return y="c"=="abbc"[p](/(b)*/)[1]||4!="test"[p](/(?:)/,-1)[v]||2!="ab"[p](/(?:ab)*/)[v]||4!="."[p](/(.?)(.?)/)[v]||"."[p](/()()/)[v]>1||""[p](/.?/)[v]?function(e,t){var o=String(this);if(void 0===e&&0===t)return[];if(!r(e))return n.call(o,e,t);var i,a,s,l=[],u=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),f=0,p=void 0===t?h:t>>>0,m=new RegExp(e.source,u+"g");while(i=c.call(m,o)){if(a=m[g],a>f&&(l.push(o.slice(f,i.index)),i[v]>1&&i.index=p))break;m[g]===i.index&&m[g]++}return f===o[v]?!s&&m.test("")||l.push(""):l.push(o.slice(f)),l[v]>p?l.slice(0,p):l}:"0"[p](void 0,0)[v]?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,r){var o=e(this),i=void 0==n?void 0:n[t];return void 0!==i?i.call(n,o,r):y.call(String(o),n,r)},function(e,t){var r=u(y,e,this,t,y!==n);if(r.done)return r.value;var c=o(e),d=String(this),p=i(c,RegExp),v=c.unicode,g=(c.ignoreCase?"i":"")+(c.multiline?"m":"")+(c.unicode?"u":"")+(m?"y":"g"),b=new p(m?c:"^(?:"+c.source+")",g),w=void 0===t?h:t>>>0;if(0===w)return[];if(0===d.length)return null===l(b,d)?[d]:[];var _=0,x=0,I=[];while(x1&&i.call(a[0],n,function(){for(u=1;u0&&"pre"===t.row.metadata.env?n("el-tag",{attrs:{type:"warning"}},[e._v("预发布")]):e._e(),e._v(" "),t.row.parentId>0&&"gray"===t.row.metadata.env?n("el-tag",{attrs:{type:"info"}},[e._v("灰度")]):e._e(),e._v(" "),t.row.parentId>0&&!t.row.metadata.env?n("el-tag",{attrs:{type:"success"}},[e._v("线上")]):e._e()]}}])}),e._v(" "),n("el-table-column",{attrs:{prop:"metadata",label:"metadata",width:"250"},scopedSlots:e._u([{key:"default",fn:function(t){return[t.row.parentId>0?n("span",[e._v(e._s(JSON.stringify(t.row.metadata)))]):e._e()]}}])}),e._v(" "),n("el-table-column",{attrs:{prop:"status",label:"服务状态",width:"100"},scopedSlots:e._u([{key:"default",fn:function(t){return[t.row.parentId>0&&"UP"===t.row.status?n("el-tag",{attrs:{type:"success"}},[e._v("正常")]):e._e(),e._v(" "),t.row.parentId>0&&"STARTING"===t.row.status?n("el-tag",{attrs:{type:"info"}},[e._v("正在启动")]):e._e(),e._v(" "),t.row.parentId>0&&"UNKNOWN"===t.row.status?n("el-tag",[e._v("未知")]):e._e(),e._v(" "),t.row.parentId>0&&("OUT_OF_SERVICE"===t.row.status||"DOWN"===t.row.status)?n("el-tag",{attrs:{type:"danger"}},[e._v("已禁用")]):e._e()]}}])}),e._v(" "),n("el-table-column",{attrs:{prop:"updateTime",label:"最后更新时间",width:"160"}}),e._v(" "),n("el-table-column",{attrs:{label:"操作",width:"250"},scopedSlots:e._u([{key:"default",fn:function(t){return[t.row.parentId>0&&"pre"===t.row.metadata.env?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onEnvPreClose(t.row)}}},[e._v("结束预发布")]):e._e(),e._v(" "),t.row.parentId>0&&"gray"===t.row.metadata.env?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onEnvGrayClose(t.row)}}},[e._v("结束灰度")]):e._e(),e._v(" "),t.row.parentId>0&&!t.row.metadata.env?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onEnvPreOpen(t.row)}}},[e._v("开启预发布")]):e._e(),e._v(" "),t.row.parentId>0&&!t.row.metadata.env?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onEnvGrayOpen(t.row)}}},[e._v("开启灰度")]):e._e(),e._v(" "),0===t.row.parentId?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onGrayConfigUpdate(t.row)}}},[e._v("设置灰度参数")]):e._e(),e._v(" "),t.row.parentId>0&&"UP"===t.row.status?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onDisable(t.row)}}},[e._v("禁用")]):e._e(),e._v(" "),t.row.parentId>0&&"OUT_OF_SERVICE"===t.row.status?n("el-button",{attrs:{type:"text",size:"mini"},on:{click:function(n){return e.onEnable(t.row)}}},[e._v("启用")]):e._e()]}}])})],1),e._v(" "),n("el-dialog",{attrs:{title:"灰度设置",visible:e.grayDialogVisible,"close-on-click-modal":!1},on:{"update:visible":function(t){e.grayDialogVisible=t},close:function(t){return e.resetForm("grayForm")}}},[n("el-form",{ref:"grayForm",attrs:{model:e.grayForm,rules:e.grayFormRules,size:"mini"}},[n("el-form-item",{attrs:{label:"serviceId"}},[e._v("\n "+e._s(e.grayForm.serviceId)+"\n ")]),e._v(" "),n("el-tabs",{attrs:{type:"card"},model:{value:e.tabsActiveName,callback:function(t){e.tabsActiveName=t},expression:"tabsActiveName"}},[n("el-tab-pane",{attrs:{label:"灰度用户",name:"first"}},[n("el-alert",{staticStyle:{"margin-bottom":"20px"},attrs:{title:"可以是appId,或userId,多个用英文逗号隔开",type:"info",closable:!1}}),e._v(" "),n("el-form-item",{attrs:{prop:"userKeyContent"}},[n("el-input",{attrs:{placeholder:"可以是appId,或userId,多个用英文逗号隔开",type:"textarea",rows:6},model:{value:e.grayForm.userKeyContent,callback:function(t){e.$set(e.grayForm,"userKeyContent",t)},expression:"grayForm.userKeyContent"}})],1)],1),e._v(" "),n("el-tab-pane",{attrs:{label:"接口配置",name:"second"}},[n("el-form-item",[n("el-button",{attrs:{type:"text"},on:{click:e.addNameVersion}},[e._v("新增灰度接口")])],1),e._v(" "),n("table",{attrs:{cellpadding:"0",cellspacing:"0"}},e._l(e.grayForm.grayRouteConfigList,function(t,r){return n("tr",{key:t.key},[n("td",[n("el-form-item",{key:t.key,attrs:{prop:"grayRouteConfigList."+r+".oldRouteId",rules:{required:!0,message:"不能为空",trigger:["blur","change"]}}},[e._v("\n 老接口:\n "),n("el-select",{staticStyle:{"margin-right":"10px"},on:{change:function(n){return e.onChangeOldRoute(t)}},model:{value:t.oldRouteId,callback:function(n){e.$set(t,"oldRouteId",n)},expression:"grayRouteConfig.oldRouteId"}},e._l(e.routeList,function(e){return n("el-option",{key:e.id,attrs:{label:e.name+"("+e.version+")",value:e.id}})}),1)],1)],1),e._v(" "),n("td",[n("el-form-item",{key:t.key+1,attrs:{prop:"grayRouteConfigList."+r+".newVersion",rules:{required:!0,message:"不能为空",trigger:["blur","change"]}}},[e._v("\n 灰度接口:\n "),n("el-select",{attrs:{"no-data-text":"无数据"},model:{value:t.newVersion,callback:function(n){e.$set(t,"newVersion",n)},expression:"grayRouteConfig.newVersion"}},e._l(e.getGraySelectData(t.oldRouteId),function(e){return n("el-option",{key:e.id,attrs:{label:e.name+"("+e.version+")",value:e.version}})}),1)],1)],1),e._v(" "),n("td",{staticStyle:{"vertical-align":"baseline"}},[n("el-button",{directives:[{name:"show",rawName:"v-show",value:e.grayForm.grayRouteConfigList.length>1,expression:"grayForm.grayRouteConfigList.length > 1"}],attrs:{type:"text"},on:{click:function(n){return n.preventDefault(),e.removeNameVersion(t)}}},[e._v("删除")])],1)])}),0)],1)],1)],1),e._v(" "),n("span",{staticClass:"dialog-footer",attrs:{slot:"footer"},slot:"footer"},[n("el-button",{on:{click:function(t){e.grayDialogVisible=!1}}},[e._v("取 消")]),e._v(" "),n("el-button",{attrs:{type:"primary"},on:{click:e.onGrayConfigSave}},[e._v("确 定")])],1)],1)],1)},o=[],i=(n("28a5"),n("ac6a"),n("7f7f"),{data:function(){var e=/^\w+(,\w+)*$/,t=function(t,n,r){""===n?r(new Error("不能为空")):(e.test(n)||r(new Error("格式不正确")),r())};return{searchFormData:{serviceId:""},grayDialogVisible:!1,grayForm:{serviceId:"",userKeyContent:"",onlyUpdateGrayUserkey:!1,grayRouteConfigList:[]},tabsActiveName:"first",routeList:[],selectNameVersion:[],grayFormRules:{userKeyContent:[{required:!0,message:"不能为空",trigger:"blur"},{validator:t,trigger:"blur"}]},tableData:[]}},created:function(){this.loadTable()},methods:{loadTable:function(){this.post("service.instance.list",this.searchFormData,function(e){this.tableData=this.buildTreeData(e.data)})},loadRouteList:function(e){0===this.routeList.length&&this.post("route.list/1.2",{serviceId:e.toLowerCase()},function(e){this.routeList=e.data})},getGraySelectData:function(e){return this.routeList.filter(function(t){return e!==t.id&&e.indexOf(t.name)>-1})},buildTreeData:function(e){return e.forEach(function(t){var n=t.parentId;0===n||e.forEach(function(e){if(e.id===n){var r=e.children;r||(r=[]),r.push(t),e.children=r}})}),e=e.filter(function(e){return 0===e.parentId}),e},onSearchTable:function(){this.loadTable()},onDisable:function(e){this.confirm("确定要禁用【"+e.serviceId+"】吗?",function(t){this.post("service.instance.offline",e,function(){this.tip("下线成功"),t()})})},onEnable:function(e){this.confirm("确定要启用【"+e.serviceId+"】吗?",function(t){this.post("service.instance.online",e,function(){this.tip("上线成功"),t()})})},doEnvOnline:function(e,t){this.post("service.instance.env.online",e,function(){t&&t.call(this)})},onEnvPreOpen:function(e){this.confirm("确定要开启 ".concat(e.instanceId," 预发布吗?"),function(t){this.post("service.instance.env.pre.open",e,function(){this.tip("预发布成功"),t()})})},onEnvPreClose:function(e){this.confirm("确定要结束 ".concat(e.instanceId," 预发布吗?"),function(t){this.doEnvOnline(e,function(){this.tip("操作成功"),t()})})},onEnvGrayOpen:function(e){this.confirm("确定要开启 ".concat(e.instanceId," 灰度吗?"),function(t){this.post("service.instance.env.gray.open",e,function(){this.tip("开启成功"),t()})})},onEnvGrayClose:function(e){this.confirm("确定要结束 ".concat(e.instanceId," 灰度吗?"),function(t){this.doEnvOnline(e,function(){this.tip("操作成功"),t()})})},onGrayConfigUpdate:function(e){var t=e.serviceId;this.loadRouteList(t),this.post("service.gray.config.get",{serviceId:t},function(e){this.grayDialogVisible=!0;var n=e.data;Object.assign(this.grayForm,{serviceId:t,userKeyContent:n.userKeyContent||"",grayRouteConfigList:this.createGrayRouteConfigList(n.nameVersionContent)})})},onGrayConfigSave:function(){var e=this;this.$refs.grayForm.validate(function(t){if(t){for(var n=[],r=e.grayForm.grayRouteConfigList,o=0;o0){var n=e.children.filter(function(e){return"UP"===e.status}).length;t=" (".concat(n,"/").concat(e.children.length,")")}return e.serviceId+t}}}),a=i,s=n("2877"),l=Object(s["a"])(a,r,o,!1,null,null,null);t["default"]=l.exports},b0c5:function(e,t,n){"use strict";var r=n("520a");n("5ca1")({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29e7142c.994a3ac0.js b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-ea2e58a4.f3f85b0e.js similarity index 98% rename from sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29e7142c.994a3ac0.js rename to sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-ea2e58a4.f3f85b0e.js index b402f56e..71a5f277 100644 --- a/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-29e7142c.994a3ac0.js +++ b/sop-admin/sop-admin-server/src/main/resources/public/static/js/chunk-ea2e58a4.f3f85b0e.js @@ -1,4 +1,4 @@ -(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-29e7142c"],{2017:function(t,e,r){"use strict";var s=r("3b76"),o=r.n(s);o.a},"3b76":function(t,e,r){},"3c35":function(t,e){(function(e){t.exports=e}).call(this,{})},8237:function(module,exports,__webpack_require__){(function(process,global){var __WEBPACK_AMD_DEFINE_RESULT__; +(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-ea2e58a4"],{2017:function(t,e,r){"use strict";var s=r("3b76"),o=r.n(s);o.a},"3b76":function(t,e,r){},"3c35":function(t,e){(function(e){t.exports=e}).call(this,{})},8237:function(module,exports,__webpack_require__){(function(process,global){var __WEBPACK_AMD_DEFINE_RESULT__; /** * [js-md5]{@link https://github.com/emn178/js-md5} * @@ -17,4 +17,4 @@ * @copyright Chen, Yi-Cyuan 2014-2017 * @license MIT */ -(function(){"use strict";var ERROR="input is invalid type",WINDOW="object"===typeof window,root=WINDOW?window:{};root.JS_MD5_NO_WINDOW&&(WINDOW=!1);var WEB_WORKER=!WINDOW&&"object"===typeof self,NODE_JS=!root.JS_MD5_NO_NODE_JS&&"object"===typeof process&&process.versions&&process.versions.node;NODE_JS?root=global:WEB_WORKER&&(root=self);var COMMON_JS=!root.JS_MD5_NO_COMMON_JS&&"object"===typeof module&&module.exports,AMD=__webpack_require__("3c35"),ARRAY_BUFFER=!root.JS_MD5_NO_ARRAY_BUFFER&&"undefined"!==typeof ArrayBuffer,HEX_CHARS="0123456789abcdef".split(""),EXTRA=[128,32768,8388608,-2147483648],SHIFT=[0,8,16,24],OUTPUT_TYPES=["hex","array","digest","buffer","arrayBuffer","base64"],BASE64_ENCODE_CHAR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),blocks=[],buffer8;if(ARRAY_BUFFER){var buffer=new ArrayBuffer(68);buffer8=new Uint8Array(buffer),blocks=new Uint32Array(buffer)}!root.JS_MD5_NO_NODE_JS&&Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),!ARRAY_BUFFER||!root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(t){return"object"===typeof t&&t.buffer&&t.buffer.constructor===ArrayBuffer});var createOutputMethod=function(t){return function(e){return new Md5(!0).update(e)[t]()}},createMethod=function(){var t=createOutputMethod("hex");NODE_JS&&(t=nodeWrap(t)),t.create=function(){return new Md5},t.update=function(e){return t.create().update(e)};for(var e=0;e>2]|=t[i]<>6,h[o++]=128|63&s):s<55296||s>=57344?(h[o++]=224|s>>12,h[o++]=128|s>>6&63,h[o++]=128|63&s):(s=65536+((1023&s)<<10|1023&t.charCodeAt(++i)),h[o++]=240|s>>18,h[o++]=128|s>>12&63,h[o++]=128|s>>6&63,h[o++]=128|63&s);else for(o=this.start;i>2]|=s<>2]|=(192|s>>6)<>2]|=(128|63&s)<=57344?(a[o>>2]|=(224|s>>12)<>2]|=(128|s>>6&63)<>2]|=(128|63&s)<>2]|=(240|s>>18)<>2]|=(128|s>>12&63)<>2]|=(128|s>>6&63)<>2]|=(128|63&s)<=64?(this.start=o-64,this.hash(),this.hashed=!0):this.start=o}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},Md5.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex;t[e>>2]|=EXTRA[3&e],e>=56&&(this.hashed||this.hash(),t[0]=t[16],t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.bytes<<3,t[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},Md5.prototype.hash=function(){var t,e,r,s,o,i,n=this.blocks;this.first?(t=n[0]-680876937,t=(t<<7|t>>>25)-271733879<<0,s=(-1732584194^2004318071&t)+n[1]-117830708,s=(s<<12|s>>>20)+t<<0,r=(-271733879^s&(-271733879^t))+n[2]-1126478375,r=(r<<17|r>>>15)+s<<0,e=(t^r&(s^t))+n[3]-1316259209,e=(e<<22|e>>>10)+r<<0):(t=this.h0,e=this.h1,r=this.h2,s=this.h3,t+=(s^e&(r^s))+n[0]-680876936,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[1]-389564586,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[2]+606105819,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[3]-1044525330,e=(e<<22|e>>>10)+r<<0),t+=(s^e&(r^s))+n[4]-176418897,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[5]+1200080426,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[6]-1473231341,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[7]-45705983,e=(e<<22|e>>>10)+r<<0,t+=(s^e&(r^s))+n[8]+1770035416,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[9]-1958414417,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[10]-42063,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[11]-1990404162,e=(e<<22|e>>>10)+r<<0,t+=(s^e&(r^s))+n[12]+1804603682,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[13]-40341101,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[14]-1502002290,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[15]+1236535329,e=(e<<22|e>>>10)+r<<0,t+=(r^s&(e^r))+n[1]-165796510,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[6]-1069501632,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[11]+643717713,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[0]-373897302,e=(e<<20|e>>>12)+r<<0,t+=(r^s&(e^r))+n[5]-701558691,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[10]+38016083,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[15]-660478335,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[4]-405537848,e=(e<<20|e>>>12)+r<<0,t+=(r^s&(e^r))+n[9]+568446438,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[14]-1019803690,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[3]-187363961,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[8]+1163531501,e=(e<<20|e>>>12)+r<<0,t+=(r^s&(e^r))+n[13]-1444681467,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[2]-51403784,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[7]+1735328473,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[12]-1926607734,e=(e<<20|e>>>12)+r<<0,o=e^r,t+=(o^s)+n[5]-378558,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[8]-2022574463,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[11]+1839030562,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[14]-35309556,e=(e<<23|e>>>9)+r<<0,o=e^r,t+=(o^s)+n[1]-1530992060,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[4]+1272893353,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[7]-155497632,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[10]-1094730640,e=(e<<23|e>>>9)+r<<0,o=e^r,t+=(o^s)+n[13]+681279174,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[0]-358537222,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[3]-722521979,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[6]+76029189,e=(e<<23|e>>>9)+r<<0,o=e^r,t+=(o^s)+n[9]-640364487,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[12]-421815835,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[15]+530742520,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[2]-995338651,e=(e<<23|e>>>9)+r<<0,t+=(r^(e|~s))+n[0]-198630844,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[7]+1126891415,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[14]-1416354905,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[5]-57434055,e=(e<<21|e>>>11)+r<<0,t+=(r^(e|~s))+n[12]+1700485571,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[3]-1894986606,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[10]-1051523,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[1]-2054922799,e=(e<<21|e>>>11)+r<<0,t+=(r^(e|~s))+n[8]+1873313359,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[15]-30611744,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[6]-1560198380,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[13]+1309151649,e=(e<<21|e>>>11)+r<<0,t+=(r^(e|~s))+n[4]-145523070,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[11]-1120210379,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[2]+718787259,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[9]-343485551,e=(e<<21|e>>>11)+r<<0,this.first?(this.h0=t+1732584193<<0,this.h1=e-271733879<<0,this.h2=r-1732584194<<0,this.h3=s+271733878<<0,this.first=!1):(this.h0=this.h0+t<<0,this.h1=this.h1+e<<0,this.h2=this.h2+r<<0,this.h3=this.h3+s<<0)},Md5.prototype.hex=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,s=this.h3;return HEX_CHARS[t>>4&15]+HEX_CHARS[15&t]+HEX_CHARS[t>>12&15]+HEX_CHARS[t>>8&15]+HEX_CHARS[t>>20&15]+HEX_CHARS[t>>16&15]+HEX_CHARS[t>>28&15]+HEX_CHARS[t>>24&15]+HEX_CHARS[e>>4&15]+HEX_CHARS[15&e]+HEX_CHARS[e>>12&15]+HEX_CHARS[e>>8&15]+HEX_CHARS[e>>20&15]+HEX_CHARS[e>>16&15]+HEX_CHARS[e>>28&15]+HEX_CHARS[e>>24&15]+HEX_CHARS[r>>4&15]+HEX_CHARS[15&r]+HEX_CHARS[r>>12&15]+HEX_CHARS[r>>8&15]+HEX_CHARS[r>>20&15]+HEX_CHARS[r>>16&15]+HEX_CHARS[r>>28&15]+HEX_CHARS[r>>24&15]+HEX_CHARS[s>>4&15]+HEX_CHARS[15&s]+HEX_CHARS[s>>12&15]+HEX_CHARS[s>>8&15]+HEX_CHARS[s>>20&15]+HEX_CHARS[s>>16&15]+HEX_CHARS[s>>28&15]+HEX_CHARS[s>>24&15]},Md5.prototype.toString=Md5.prototype.hex,Md5.prototype.digest=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,s=this.h3;return[255&t,t>>8&255,t>>16&255,t>>24&255,255&e,e>>8&255,e>>16&255,e>>24&255,255&r,r>>8&255,r>>16&255,r>>24&255,255&s,s>>8&255,s>>16&255,s>>24&255]},Md5.prototype.array=Md5.prototype.digest,Md5.prototype.arrayBuffer=function(){this.finalize();var t=new ArrayBuffer(16),e=new Uint32Array(t);return e[0]=this.h0,e[1]=this.h1,e[2]=this.h2,e[3]=this.h3,t},Md5.prototype.buffer=Md5.prototype.arrayBuffer,Md5.prototype.base64=function(){for(var t,e,r,s="",o=this.array(),i=0;i<15;)t=o[i++],e=o[i++],r=o[i++],s+=BASE64_ENCODE_CHAR[t>>>2]+BASE64_ENCODE_CHAR[63&(t<<4|e>>>4)]+BASE64_ENCODE_CHAR[63&(e<<2|r>>>6)]+BASE64_ENCODE_CHAR[63&r];return t=o[i],s+=BASE64_ENCODE_CHAR[t>>>2]+BASE64_ENCODE_CHAR[t<<4&63]+"==",s};var exports=createMethod();COMMON_JS?module.exports=exports:(root.md5=exports,AMD&&(__WEBPACK_AMD_DEFINE_RESULT__=function(){return exports}.call(exports,__webpack_require__,exports,module),void 0===__WEBPACK_AMD_DEFINE_RESULT__||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)))})()}).call(this,__webpack_require__("4362"),__webpack_require__("c8ba"))},"9ed6":function(t,e,r){"use strict";r.r(e);var s=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"login-container"},[r("el-form",{ref:"loginForm",staticClass:"login-form",attrs:{model:t.loginForm,rules:t.loginRules,"auto-complete":"on","label-position":"left"}},[r("div",{staticClass:"title-container"},[r("h3",{staticClass:"title"},[t._v("SOP Admin")])]),t._v(" "),r("el-form-item",{attrs:{prop:"username"}},[r("span",{staticClass:"svg-container"},[r("svg-icon",{attrs:{"icon-class":"user"}})],1),t._v(" "),r("el-input",{ref:"username",attrs:{placeholder:"用户名",name:"username",type:"text",tabindex:"1","auto-complete":"on"},model:{value:t.loginForm.username,callback:function(e){t.$set(t.loginForm,"username",e)},expression:"loginForm.username"}})],1),t._v(" "),r("el-form-item",{attrs:{prop:"password"}},[r("span",{staticClass:"svg-container"},[r("svg-icon",{attrs:{"icon-class":"password"}})],1),t._v(" "),r("el-input",{key:t.passwordType,ref:"password",attrs:{type:t.passwordType,placeholder:"密码",name:"password",tabindex:"2","auto-complete":"on"},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.handleLogin(e)}},model:{value:t.loginForm.password,callback:function(e){t.$set(t.loginForm,"password",e)},expression:"loginForm.password"}}),t._v(" "),r("span",{staticClass:"show-pwd",on:{click:t.showPwd}},[r("svg-icon",{attrs:{"icon-class":"password"===t.passwordType?"eye":"eye-open"}})],1)],1),t._v(" "),r("el-button",{staticStyle:{width:"100%","margin-bottom":"30px"},attrs:{loading:t.loading,type:"primary"},nativeOn:{click:function(e){return e.preventDefault(),t.handleLogin(e)}}},[t._v("登 录")])],1)],1)},o=[],i=r("8237"),n=r.n(i),a=r("5f87"),h={name:"Login",data:function(){var t=function(t,e,r){0===e.length?r(new Error("请输入用户名")):r()},e=function(t,e,r){0===e.length?r(new Error("请输入密码")):e.length<6?r(new Error("请密码长度不得小于6位")):r()};return{loginForm:{username:"",password:""},loginRules:{username:[{required:!0,trigger:"blur",validator:t}],password:[{required:!0,trigger:"blur",validator:e}]},loading:!1,passwordType:"password",redirect:void 0}},watch:{$route:{handler:function(t){this.redirect=t.query&&t.query.redirect},immediate:!0}},methods:{showPwd:function(){var t=this;"password"===this.passwordType?this.passwordType="":this.passwordType="password",this.$nextTick(function(){t.$refs.password.focus()})},handleLogin:function(){var t=this;this.$refs.loginForm.validate(function(e){if(e){var r=t.loginForm,s=r.password;s=n()(s);var o={username:r.username,password:s};t.post("nologin.admin.login",o,function(t){Object(a["c"])(t.data),this.$router.push({path:this.redirect||"/"})})}})}}},c=h,u=(r("2017"),r("d982"),r("2877")),f=Object(u["a"])(c,s,o,!1,null,"0204d890",null);e["default"]=f.exports},d982:function(t,e,r){"use strict";var s=r("dabb"),o=r.n(s);o.a},dabb:function(t,e,r){}}]); \ No newline at end of file +(function(){"use strict";var ERROR="input is invalid type",WINDOW="object"===typeof window,root=WINDOW?window:{};root.JS_MD5_NO_WINDOW&&(WINDOW=!1);var WEB_WORKER=!WINDOW&&"object"===typeof self,NODE_JS=!root.JS_MD5_NO_NODE_JS&&"object"===typeof process&&process.versions&&process.versions.node;NODE_JS?root=global:WEB_WORKER&&(root=self);var COMMON_JS=!root.JS_MD5_NO_COMMON_JS&&"object"===typeof module&&module.exports,AMD=__webpack_require__("3c35"),ARRAY_BUFFER=!root.JS_MD5_NO_ARRAY_BUFFER&&"undefined"!==typeof ArrayBuffer,HEX_CHARS="0123456789abcdef".split(""),EXTRA=[128,32768,8388608,-2147483648],SHIFT=[0,8,16,24],OUTPUT_TYPES=["hex","array","digest","buffer","arrayBuffer","base64"],BASE64_ENCODE_CHAR="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),blocks=[],buffer8;if(ARRAY_BUFFER){var buffer=new ArrayBuffer(68);buffer8=new Uint8Array(buffer),blocks=new Uint32Array(buffer)}!root.JS_MD5_NO_NODE_JS&&Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),!ARRAY_BUFFER||!root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(t){return"object"===typeof t&&t.buffer&&t.buffer.constructor===ArrayBuffer});var createOutputMethod=function(t){return function(e){return new Md5(!0).update(e)[t]()}},createMethod=function(){var t=createOutputMethod("hex");NODE_JS&&(t=nodeWrap(t)),t.create=function(){return new Md5},t.update=function(e){return t.create().update(e)};for(var e=0;e>2]|=t[i]<>6,h[o++]=128|63&s):s<55296||s>=57344?(h[o++]=224|s>>12,h[o++]=128|s>>6&63,h[o++]=128|63&s):(s=65536+((1023&s)<<10|1023&t.charCodeAt(++i)),h[o++]=240|s>>18,h[o++]=128|s>>12&63,h[o++]=128|s>>6&63,h[o++]=128|63&s);else for(o=this.start;i>2]|=s<>2]|=(192|s>>6)<>2]|=(128|63&s)<=57344?(a[o>>2]|=(224|s>>12)<>2]|=(128|s>>6&63)<>2]|=(128|63&s)<>2]|=(240|s>>18)<>2]|=(128|s>>12&63)<>2]|=(128|s>>6&63)<>2]|=(128|63&s)<=64?(this.start=o-64,this.hash(),this.hashed=!0):this.start=o}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296<<0,this.bytes=this.bytes%4294967296),this}},Md5.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex;t[e>>2]|=EXTRA[3&e],e>=56&&(this.hashed||this.hash(),t[0]=t[16],t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.bytes<<3,t[15]=this.hBytes<<3|this.bytes>>>29,this.hash()}},Md5.prototype.hash=function(){var t,e,r,s,o,i,n=this.blocks;this.first?(t=n[0]-680876937,t=(t<<7|t>>>25)-271733879<<0,s=(-1732584194^2004318071&t)+n[1]-117830708,s=(s<<12|s>>>20)+t<<0,r=(-271733879^s&(-271733879^t))+n[2]-1126478375,r=(r<<17|r>>>15)+s<<0,e=(t^r&(s^t))+n[3]-1316259209,e=(e<<22|e>>>10)+r<<0):(t=this.h0,e=this.h1,r=this.h2,s=this.h3,t+=(s^e&(r^s))+n[0]-680876936,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[1]-389564586,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[2]+606105819,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[3]-1044525330,e=(e<<22|e>>>10)+r<<0),t+=(s^e&(r^s))+n[4]-176418897,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[5]+1200080426,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[6]-1473231341,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[7]-45705983,e=(e<<22|e>>>10)+r<<0,t+=(s^e&(r^s))+n[8]+1770035416,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[9]-1958414417,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[10]-42063,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[11]-1990404162,e=(e<<22|e>>>10)+r<<0,t+=(s^e&(r^s))+n[12]+1804603682,t=(t<<7|t>>>25)+e<<0,s+=(r^t&(e^r))+n[13]-40341101,s=(s<<12|s>>>20)+t<<0,r+=(e^s&(t^e))+n[14]-1502002290,r=(r<<17|r>>>15)+s<<0,e+=(t^r&(s^t))+n[15]+1236535329,e=(e<<22|e>>>10)+r<<0,t+=(r^s&(e^r))+n[1]-165796510,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[6]-1069501632,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[11]+643717713,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[0]-373897302,e=(e<<20|e>>>12)+r<<0,t+=(r^s&(e^r))+n[5]-701558691,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[10]+38016083,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[15]-660478335,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[4]-405537848,e=(e<<20|e>>>12)+r<<0,t+=(r^s&(e^r))+n[9]+568446438,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[14]-1019803690,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[3]-187363961,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[8]+1163531501,e=(e<<20|e>>>12)+r<<0,t+=(r^s&(e^r))+n[13]-1444681467,t=(t<<5|t>>>27)+e<<0,s+=(e^r&(t^e))+n[2]-51403784,s=(s<<9|s>>>23)+t<<0,r+=(t^e&(s^t))+n[7]+1735328473,r=(r<<14|r>>>18)+s<<0,e+=(s^t&(r^s))+n[12]-1926607734,e=(e<<20|e>>>12)+r<<0,o=e^r,t+=(o^s)+n[5]-378558,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[8]-2022574463,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[11]+1839030562,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[14]-35309556,e=(e<<23|e>>>9)+r<<0,o=e^r,t+=(o^s)+n[1]-1530992060,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[4]+1272893353,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[7]-155497632,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[10]-1094730640,e=(e<<23|e>>>9)+r<<0,o=e^r,t+=(o^s)+n[13]+681279174,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[0]-358537222,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[3]-722521979,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[6]+76029189,e=(e<<23|e>>>9)+r<<0,o=e^r,t+=(o^s)+n[9]-640364487,t=(t<<4|t>>>28)+e<<0,s+=(o^t)+n[12]-421815835,s=(s<<11|s>>>21)+t<<0,i=s^t,r+=(i^e)+n[15]+530742520,r=(r<<16|r>>>16)+s<<0,e+=(i^r)+n[2]-995338651,e=(e<<23|e>>>9)+r<<0,t+=(r^(e|~s))+n[0]-198630844,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[7]+1126891415,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[14]-1416354905,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[5]-57434055,e=(e<<21|e>>>11)+r<<0,t+=(r^(e|~s))+n[12]+1700485571,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[3]-1894986606,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[10]-1051523,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[1]-2054922799,e=(e<<21|e>>>11)+r<<0,t+=(r^(e|~s))+n[8]+1873313359,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[15]-30611744,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[6]-1560198380,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[13]+1309151649,e=(e<<21|e>>>11)+r<<0,t+=(r^(e|~s))+n[4]-145523070,t=(t<<6|t>>>26)+e<<0,s+=(e^(t|~r))+n[11]-1120210379,s=(s<<10|s>>>22)+t<<0,r+=(t^(s|~e))+n[2]+718787259,r=(r<<15|r>>>17)+s<<0,e+=(s^(r|~t))+n[9]-343485551,e=(e<<21|e>>>11)+r<<0,this.first?(this.h0=t+1732584193<<0,this.h1=e-271733879<<0,this.h2=r-1732584194<<0,this.h3=s+271733878<<0,this.first=!1):(this.h0=this.h0+t<<0,this.h1=this.h1+e<<0,this.h2=this.h2+r<<0,this.h3=this.h3+s<<0)},Md5.prototype.hex=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,s=this.h3;return HEX_CHARS[t>>4&15]+HEX_CHARS[15&t]+HEX_CHARS[t>>12&15]+HEX_CHARS[t>>8&15]+HEX_CHARS[t>>20&15]+HEX_CHARS[t>>16&15]+HEX_CHARS[t>>28&15]+HEX_CHARS[t>>24&15]+HEX_CHARS[e>>4&15]+HEX_CHARS[15&e]+HEX_CHARS[e>>12&15]+HEX_CHARS[e>>8&15]+HEX_CHARS[e>>20&15]+HEX_CHARS[e>>16&15]+HEX_CHARS[e>>28&15]+HEX_CHARS[e>>24&15]+HEX_CHARS[r>>4&15]+HEX_CHARS[15&r]+HEX_CHARS[r>>12&15]+HEX_CHARS[r>>8&15]+HEX_CHARS[r>>20&15]+HEX_CHARS[r>>16&15]+HEX_CHARS[r>>28&15]+HEX_CHARS[r>>24&15]+HEX_CHARS[s>>4&15]+HEX_CHARS[15&s]+HEX_CHARS[s>>12&15]+HEX_CHARS[s>>8&15]+HEX_CHARS[s>>20&15]+HEX_CHARS[s>>16&15]+HEX_CHARS[s>>28&15]+HEX_CHARS[s>>24&15]},Md5.prototype.toString=Md5.prototype.hex,Md5.prototype.digest=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,s=this.h3;return[255&t,t>>8&255,t>>16&255,t>>24&255,255&e,e>>8&255,e>>16&255,e>>24&255,255&r,r>>8&255,r>>16&255,r>>24&255,255&s,s>>8&255,s>>16&255,s>>24&255]},Md5.prototype.array=Md5.prototype.digest,Md5.prototype.arrayBuffer=function(){this.finalize();var t=new ArrayBuffer(16),e=new Uint32Array(t);return e[0]=this.h0,e[1]=this.h1,e[2]=this.h2,e[3]=this.h3,t},Md5.prototype.buffer=Md5.prototype.arrayBuffer,Md5.prototype.base64=function(){for(var t,e,r,s="",o=this.array(),i=0;i<15;)t=o[i++],e=o[i++],r=o[i++],s+=BASE64_ENCODE_CHAR[t>>>2]+BASE64_ENCODE_CHAR[63&(t<<4|e>>>4)]+BASE64_ENCODE_CHAR[63&(e<<2|r>>>6)]+BASE64_ENCODE_CHAR[63&r];return t=o[i],s+=BASE64_ENCODE_CHAR[t>>>2]+BASE64_ENCODE_CHAR[t<<4&63]+"==",s};var exports=createMethod();COMMON_JS?module.exports=exports:(root.md5=exports,AMD&&(__WEBPACK_AMD_DEFINE_RESULT__=function(){return exports}.call(exports,__webpack_require__,exports,module),void 0===__WEBPACK_AMD_DEFINE_RESULT__||(module.exports=__WEBPACK_AMD_DEFINE_RESULT__)))})()}).call(this,__webpack_require__("4362"),__webpack_require__("c8ba"))},"9ed6":function(t,e,r){"use strict";r.r(e);var s=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"login-container"},[r("el-form",{ref:"loginForm",staticClass:"login-form",attrs:{model:t.loginForm,rules:t.loginRules,"auto-complete":"on","label-position":"left"}},[r("div",{staticClass:"title-container"},[r("h3",{staticClass:"title"},[t._v("SOP Admin")])]),t._v(" "),r("el-form-item",{attrs:{prop:"username"}},[r("span",{staticClass:"svg-container"},[r("svg-icon",{attrs:{"icon-class":"user"}})],1),t._v(" "),r("el-input",{ref:"username",attrs:{placeholder:"用户名",name:"username",type:"text",tabindex:"1","auto-complete":"on"},model:{value:t.loginForm.username,callback:function(e){t.$set(t.loginForm,"username",e)},expression:"loginForm.username"}})],1),t._v(" "),r("el-form-item",{attrs:{prop:"password"}},[r("span",{staticClass:"svg-container"},[r("svg-icon",{attrs:{"icon-class":"password"}})],1),t._v(" "),r("el-input",{key:t.passwordType,ref:"password",attrs:{type:t.passwordType,placeholder:"密码",name:"password",tabindex:"2","auto-complete":"on"},nativeOn:{keyup:function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"enter",13,e.key,"Enter")?null:t.handleLogin(e)}},model:{value:t.loginForm.password,callback:function(e){t.$set(t.loginForm,"password",e)},expression:"loginForm.password"}}),t._v(" "),r("span",{staticClass:"show-pwd",on:{click:t.showPwd}},[r("svg-icon",{attrs:{"icon-class":"password"===t.passwordType?"eye":"eye-open"}})],1)],1),t._v(" "),r("el-button",{staticStyle:{width:"100%","margin-bottom":"30px"},attrs:{loading:t.loading,type:"primary"},nativeOn:{click:function(e){return e.preventDefault(),t.handleLogin(e)}}},[t._v("登 录")])],1)],1)},o=[],i=r("8237"),n=r.n(i),a=r("5f87"),h={name:"Login",data:function(){var t=function(t,e,r){0===e.length?r(new Error("请输入用户名")):r()},e=function(t,e,r){0===e.length?r(new Error("请输入密码")):e.length<6?r(new Error("请密码长度不得小于6位")):r()};return{loginForm:{username:"",password:""},loginRules:{username:[{required:!0,trigger:"blur",validator:t}],password:[{required:!0,trigger:"blur",validator:e}]},loading:!1,passwordType:"password",redirect:void 0}},watch:{$route:{handler:function(t){this.redirect=t.query&&t.query.redirect},immediate:!0}},methods:{showPwd:function(){var t=this;"password"===this.passwordType?this.passwordType="":this.passwordType="password",this.$nextTick(function(){t.$refs.password.focus()})},handleLogin:function(){var t=this;this.$refs.loginForm.validate(function(e){if(e){var r=t.loginForm,s=r.password;s=n()(s);var o={username:r.username,password:s};t.post("nologin.admin.login",o,function(t){Object(a["c"])(t.data),this.$router.push({path:this.redirect||"/"})})}})}}},u=h,c=(r("2017"),r("d982"),r("2877")),f=Object(c["a"])(u,s,o,!1,null,"0204d890",null);e["default"]=f.exports},d982:function(t,e,r){"use strict";var s=r("dabb"),o=r.n(s);o.a},dabb:function(t,e,r){}}]); \ No newline at end of file diff --git a/sop-admin/sop-admin-vue/src/views/service/serviceList.vue b/sop-admin/sop-admin-vue/src/views/service/serviceList.vue index 753f97f5..4200471c 100644 --- a/sop-admin/sop-admin-vue/src/views/service/serviceList.vue +++ b/sop-admin/sop-admin-vue/src/views/service/serviceList.vue @@ -54,7 +54,7 @@ width="100" > @@ -281,15 +281,12 @@ export default { }, doEnvOnline: function(row, callback) { this.post('service.instance.env.online', row, function() { - callback && callback() + callback && callback.call(this) }) }, onEnvPreOpen: function(row) { this.confirm(`确定要开启 ${row.instanceId} 预发布吗?`, function(done) { - this.post('service.instance.env.pre.open', { - serviceId: row.serviceId, - instanceId: row.instanceId - }, function() { + this.post('service.instance.env.pre.open', row, function() { this.tip('预发布成功') done() }) @@ -305,10 +302,7 @@ export default { }, onEnvGrayOpen: function(row) { this.confirm(`确定要开启 ${row.instanceId} 灰度吗?`, function(done) { - this.post('service.instance.env.gray.open', { - serviceId: row.serviceId, - instanceId: row.instanceId - }, function() { + this.post('service.instance.env.gray.open', row, function() { this.tip('开启成功') done() }) diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/BaseServiceRouteInfo.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/BaseServiceRouteInfo.java index b5d46aa1..a66d0f17 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/BaseServiceRouteInfo.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/BaseServiceRouteInfo.java @@ -12,4 +12,8 @@ import java.util.List; public class BaseServiceRouteInfo { private String serviceId; private List routeDefinitionList = Collections.emptyList(); + + public String fetchServiceIdLowerCase() { + return this.serviceId.toLowerCase(); + } } \ No newline at end of file diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/UserKeyDefinition.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ServiceGrayDefinition.java similarity index 69% rename from sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/UserKeyDefinition.java rename to sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ServiceGrayDefinition.java index 0889d4cb..8126ca88 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/UserKeyDefinition.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/ServiceGrayDefinition.java @@ -6,7 +6,8 @@ import lombok.Data; * @author tanghc */ @Data -public class UserKeyDefinition { +public class ServiceGrayDefinition { + private String serviceId; private String instanceId; private String data; } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java index 6aae3577..3fa8561f 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/DefaultEnvGrayManager.java @@ -2,11 +2,8 @@ package com.gitee.sop.gatewaycommon.manager; import com.gitee.sop.gatewaycommon.zuul.loadbalancer.ServiceGrayConfig; import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * @author tanghc @@ -14,17 +11,18 @@ import java.util.stream.Collectors; public class DefaultEnvGrayManager implements EnvGrayManager { /** - * KEY:instanceId + * key:serviceId,服务对应的灰度配置 */ - private Map serviceUserKeyMap = Maps.newConcurrentMap(); + private Map serviceGrayConfigMap = Maps.newConcurrentMap(); + + /** + * key:instanceId value:serviceId + */ + private Map instanceIdServiceIdMap = Maps.newConcurrentMap(); @Override - public List listGrayInstanceId(String serviceId) { - return serviceUserKeyMap - .values() - .stream() - .map(ServiceGrayConfig::getInstanceId) - .collect(Collectors.toList()); + public void saveServiceGrayConfig(ServiceGrayConfig serviceGrayConfig) { + serviceGrayConfigMap.putIfAbsent(serviceGrayConfig.getServiceId(), serviceGrayConfig); } @Override @@ -32,26 +30,40 @@ public class DefaultEnvGrayManager implements EnvGrayManager { if (instanceId == null || userKey == null) { return false; } - return this.getServiceGrayConfig(instanceId).containsKey(userKey); + String serviceId = instanceIdServiceIdMap.get(instanceId); + ServiceGrayConfig grayConfig = this.getGrayConfig(serviceId); + return grayConfig != null && grayConfig.containsKey(userKey); } @Override - public String getVersion(String instanceId, String nameVersion) { - if (instanceId == null || nameVersion == null) { + public String getVersion(String serviceId, String nameVersion) { + if (serviceId == null || nameVersion == null) { return null; } - return this.getServiceGrayConfig(instanceId).getVersion(nameVersion); + boolean opened = instanceIdServiceIdMap.values().contains(serviceId); + // 没有开启灰度 + if (!opened) { + return null; + } + ServiceGrayConfig grayConfig = this.getGrayConfig(serviceId); + return grayConfig != null ? grayConfig.getVersion(nameVersion) : null; + } + + private ServiceGrayConfig getGrayConfig(String serviceId) { + if (serviceId == null) { + return null; + } + return serviceGrayConfigMap.get(serviceId); } @Override - public ServiceGrayConfig getServiceGrayConfig(String instanceId) { - return serviceUserKeyMap.computeIfAbsent(instanceId, key -> { - ServiceGrayConfig serviceGrayConfig = new ServiceGrayConfig(); - serviceGrayConfig.setInstanceId(instanceId); - serviceGrayConfig.setUserKeys(Sets.newConcurrentHashSet()); - serviceGrayConfig.setGrayNameVersion(Maps.newConcurrentMap()); - return serviceGrayConfig; - }); + public void openGray(String instanceId, String serviceId) { + instanceIdServiceIdMap.putIfAbsent(instanceId, serviceId); + } + + @Override + public void closeGray(String instanceId) { + instanceIdServiceIdMap.remove(instanceId); } @Override diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java index d89fea0b..9591a36e 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/EnvGrayManager.java @@ -3,18 +3,43 @@ package com.gitee.sop.gatewaycommon.manager; import com.gitee.sop.gatewaycommon.bean.BeanInitializer; import com.gitee.sop.gatewaycommon.zuul.loadbalancer.ServiceGrayConfig; -import java.util.List; - /** * @author tanghc */ public interface EnvGrayManager extends BeanInitializer { - List listGrayInstanceId(String serviceId); + /** + * 保存灰度配置 + * @param serviceGrayConfig 灰度配置 + */ + void saveServiceGrayConfig(ServiceGrayConfig serviceGrayConfig); + /** + * 实例是否允许 + * @param instanceId 实例id + * @param userKey 用户key,如appKey + * @return true:允许访问 + */ boolean containsKey(String instanceId, Object userKey); - String getVersion(String instanceId, String nameVersion); + /** + * 获取灰度发布新版本号 + * @param serviceId serviceId + * @param nameVersion 路由id + * @return 返回新版本号 + */ + String getVersion(String serviceId, String nameVersion); - ServiceGrayConfig getServiceGrayConfig(String instanceId); + /** + * 开启灰度 + * @param instanceId instanceId + * @param serviceId serviceId + */ + void openGray(String instanceId, String serviceId); + + /** + * 关闭灰度 + * @param instanceId instanceId + */ + void closeGray(String instanceId); } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/ZookeeperContext.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/ZookeeperContext.java index 508afda7..b7672836 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/ZookeeperContext.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/ZookeeperContext.java @@ -69,8 +69,8 @@ public class ZookeeperContext { return SOP_MSG_CHANNEL_PATH + "/isvinfo"; } - public static String getUserKeyChannelPath() { - return SOP_MSG_CHANNEL_PATH + "/userkey"; + public static String getServiceGrayChannelPath() { + return SOP_MSG_CHANNEL_PATH + "/gray"; } public static String getIsvRoutePermissionChannelPath() { diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java index dfea50c4..d0198414 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/filter/PreVersionDecisionFilter.java @@ -10,8 +10,6 @@ import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import org.springframework.beans.factory.annotation.Autowired; -import java.util.List; - /** * @author tanghc */ @@ -38,17 +36,11 @@ public class PreVersionDecisionFilter extends BaseZuulFilter { if (targetRoute == null) { return null; } - String serviceId = targetRoute.getServiceRouteInfo().getServiceId(); - List instanceIdList = envGrayManager.listGrayInstanceId(serviceId); - String appKey = apiParam.fetchAppKey(); - for (String instanceId : instanceIdList) { - if (envGrayManager.containsKey(instanceId, appKey)) { - String version = envGrayManager.getVersion(instanceId, nameVersion); - if (version != null) { - requestContext.addZuulRequestHeader(ParamNames.HEADER_VERSION_NAME, version); - break; - } - } + String serviceId = targetRoute.getServiceRouteInfo().fetchServiceIdLowerCase(); + // 如果服务在灰度阶段,返回一个灰度版本号 + String version = envGrayManager.getVersion(serviceId, nameVersion); + if (version != null) { + requestContext.addZuulRequestHeader(ParamNames.HEADER_VERSION_NAME, version); } return null; } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java index 2b3b5953..fed0ae94 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/BaseServerChooser.java @@ -42,14 +42,6 @@ public abstract class BaseServerChooser extends ZoneAvoidanceRule { */ protected abstract boolean canVisitPre(Server server, HttpServletRequest request); - /** - * 能否访问灰度服务器 - * @param server 灰度服务器 - * @param request request - * @return true:能 - */ - protected abstract boolean canVisitGray(Server server, HttpServletRequest request); - @Override public Server choose(Object key) { ILoadBalancer lb = getLoadBalancer(); diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java index 2e11b8e8..7aed5c38 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/loadbalancer/ServiceGrayConfig.java @@ -13,8 +13,6 @@ public class ServiceGrayConfig { private String serviceId; - private String instanceId; - /** * 用户id */ @@ -31,8 +29,4 @@ public class ServiceGrayConfig { return grayNameVersion.get(name); } - public void clear() { - this.userKeys.clear(); - this.grayNameVersion.clear(); - } } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayUserkey.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGray.java similarity index 62% rename from sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayUserkey.java rename to sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGray.java index 9f91de18..15da8353 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayUserkey.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGray.java @@ -11,35 +11,29 @@ import java.util.Date; /** - * 表名:config_gray_userkey - * 备注:灰度发布用户key + * 表名:config_gray + * 备注:服务灰度配置 * * @author tanghc */ -@Table(name = "config_gray_userkey") +@Table(name = "config_gray") @Data -public class ConfigGrayUserkey { +public class ConfigGray { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) /** 数据库字段:id */ private Long id; - /** serviceId, 数据库字段:service_id */ + /** 数据库字段:service_id */ private String serviceId; - /** instanceId, 数据库字段:instance_id */ - private String instanceId; - /** 用户key,多个用引文逗号隔开, 数据库字段:user_key_content */ private String userKeyContent; - /** 需要灰度的接口,goods.get=1.2,order.list=1.2, 数据库字段:name_version_content */ + /** 需要灰度的接口,goods.get1.0=1.2,多个用英文逗号隔开, 数据库字段:name_version_content */ private String nameVersionContent; - /** 0:禁用,1:启用, 数据库字段:status */ - private Byte status; - /** 数据库字段:gmt_create */ private Date gmtCreate; diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/ConfigGrayUserkey.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayInstance.java similarity index 55% rename from sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/ConfigGrayUserkey.java rename to sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayInstance.java index d822e182..81bc95ce 100644 --- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/ConfigGrayUserkey.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/entity/ConfigGrayInstance.java @@ -1,4 +1,4 @@ -package com.gitee.sop.adminserver.entity; +package com.gitee.sop.gateway.entity; import lombok.Data; @@ -11,31 +11,24 @@ import java.util.Date; /** - * 表名:config_gray_userkey - * 备注:灰度发布用户key + * 表名:config_gray_instance * * @author tanghc */ -@Table(name = "config_gray_userkey") +@Table(name = "config_gray_instance") @Data -public class ConfigGrayUserkey { +public class ConfigGrayInstance { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) /** 数据库字段:id */ private Long id; - /** serviceId, 数据库字段:service_id */ - private String serviceId; - - /** instanceId, 数据库字段:instance_id */ + /** instance_id, 数据库字段:instance_id */ private String instanceId; - /** 用户key,多个用引文逗号隔开, 数据库字段:user_key_content */ - private String userKeyContent; - - /** 需要灰度的接口,goods.get=1.2,order.list=1.2, 数据库字段:name_version_content */ - private String nameVersionContent; + /** service_id, 数据库字段:service_id */ + private String serviceId; /** 0:禁用,1:启用, 数据库字段:status */ private Byte status; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java index 905bb846..addf958c 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/loadbalancer/EnvironmentServerChooser.java @@ -2,12 +2,11 @@ package com.gitee.sop.gateway.loadbalancer; import com.gitee.sop.gateway.manager.DbEnvGrayManager; import com.gitee.sop.gatewaycommon.bean.SpringContext; -import com.gitee.sop.gatewaycommon.param.ApiParam; import com.gitee.sop.gatewaycommon.param.Param; -import com.gitee.sop.gatewaycommon.zuul.ZuulContext; import com.gitee.sop.gatewaycommon.zuul.loadbalancer.BaseServerChooser; import com.netflix.loadbalancer.Server; import com.netflix.niws.loadbalancer.DiscoveryEnabledServer; +import org.springframework.core.env.Environment; import javax.servlet.http.HttpServletRequest; import java.util.Map; @@ -56,22 +55,10 @@ public class EnvironmentServerChooser extends BaseServerChooser { @Override protected boolean canVisitPre(Server server, HttpServletRequest request) { String serverName = request.getServerName(); - return PRE_DOMAIN.equals(serverName); + String domain = SpringContext.getBean(Environment.class).getProperty("pre.domain", PRE_DOMAIN); + return domain.equals(serverName); } - /** - * 能否进入灰度环境 - * - * @param request request - * @return 返回true:可以进入到预发环境 - */ - protected boolean canVisitGray(Server server, HttpServletRequest request) { - ApiParam apiParam = ZuulContext.getApiParam(); - DbEnvGrayManager userKeyManager = SpringContext.getBean(DbEnvGrayManager.class); - return this.isGrayUser(apiParam, userKeyManager, server, request); - } - - /** * 是否是灰度用户,可修改此方法实现自己想要的 * diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java index f5491605..305ace89 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbEnvGrayManager.java @@ -2,13 +2,16 @@ package com.gitee.sop.gateway.manager; import com.alibaba.fastjson.JSON; import com.gitee.fastmybatis.core.query.Query; -import com.gitee.sop.gateway.entity.ConfigGrayUserkey; -import com.gitee.sop.gateway.mapper.ConfigGrayUserkeyMapper; +import com.gitee.sop.gateway.entity.ConfigGray; +import com.gitee.sop.gateway.entity.ConfigGrayInstance; +import com.gitee.sop.gateway.mapper.ConfigGrayInstanceMapper; +import com.gitee.sop.gateway.mapper.ConfigGrayMapper; import com.gitee.sop.gatewaycommon.bean.ChannelMsg; -import com.gitee.sop.gatewaycommon.bean.UserKeyDefinition; +import com.gitee.sop.gatewaycommon.bean.ServiceGrayDefinition; import com.gitee.sop.gatewaycommon.manager.DefaultEnvGrayManager; import com.gitee.sop.gatewaycommon.manager.ZookeeperContext; import com.gitee.sop.gatewaycommon.zuul.loadbalancer.ServiceGrayConfig; +import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +22,8 @@ import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -33,82 +38,86 @@ public class DbEnvGrayManager extends DefaultEnvGrayManager { private static final int STATUS_ENABLE = 1; + private static final Function FUNCTION_KEY = arr -> arr[0]; + private static final Function FUNCTION_VALUE = arr -> arr[1]; + @Autowired private Environment environment; @Autowired - private ConfigGrayUserkeyMapper configGrayUserkeyMapper; + private ConfigGrayMapper configGrayMapper; + + @Autowired + private ConfigGrayInstanceMapper configGrayInstanceMapper; @Override public void load() { + + List list = configGrayMapper.list(new Query()); + for (ConfigGray configGray : list) { + this.setServiceGrayConfig(configGray); + } + Query query = new Query(); query.eq("status", STATUS_ENABLE); - List list = configGrayUserkeyMapper.list(query); - for (ConfigGrayUserkey configGrayUserkey : list) { - this.setServiceGrayConfig(configGrayUserkey); + List grayInstanceList = configGrayInstanceMapper.list(query); + for (ConfigGrayInstance configGrayInstance : grayInstanceList) { + this.openGray(configGrayInstance.getInstanceId(), configGrayInstance.getServiceId()); } } /** * 设置用户key * - * @param configGrayUserkey 灰度配置 + * @param configGray 灰度配置 */ - public void setServiceGrayConfig(ConfigGrayUserkey configGrayUserkey) { - if (configGrayUserkey == null) { + public void setServiceGrayConfig(ConfigGray configGray) { + if (configGray == null) { return; } - String instanceId = configGrayUserkey.getInstanceId(); - this.clear(instanceId); - String userKeyData = configGrayUserkey.getUserKeyContent(); - String nameVersionContent = configGrayUserkey.getNameVersionContent(); + String userKeyData = configGray.getUserKeyContent(); + String nameVersionContent = configGray.getNameVersionContent(); String[] userKeys = StringUtils.split(userKeyData, ','); String[] nameVersionList = StringUtils.split(nameVersionContent, ','); - log.info("添加userKey,userKeys.length:{}, nameVersionList:{}", userKeys.length, Arrays.toString(nameVersionList)); + log.info("灰度配置,userKeys.length:{}, nameVersionList:{}", userKeys.length, Arrays.toString(nameVersionList)); - List list = Stream.of(userKeys).collect(Collectors.toList()); - ServiceGrayConfig serviceGrayConfig = getServiceGrayConfig(instanceId); - serviceGrayConfig.setServiceId(configGrayUserkey.getServiceId()); - serviceGrayConfig.getUserKeys().addAll(list); + Set userKeySet = Stream.of(userKeys) + .collect(Collectors.toCollection(Sets::newConcurrentHashSet)); - Map grayNameVersion = serviceGrayConfig.getGrayNameVersion(); - for (String nameVersion : nameVersionList) { - String[] nameVersionInfo = StringUtils.split(nameVersion, '='); - String name = nameVersionInfo[0]; - String version = nameVersionInfo[1]; - grayNameVersion.put(name, version); - } + Map grayNameVersionMap = Stream.of(nameVersionList) + .map(nameVersion -> StringUtils.split(nameVersion, '=')) + .collect(Collectors.toConcurrentMap(FUNCTION_KEY, FUNCTION_VALUE)); - } - - /** - * 清空用户key - */ - public void clear(String instanceId) { - getServiceGrayConfig(instanceId).clear(); + ServiceGrayConfig serviceGrayConfig = new ServiceGrayConfig(); + serviceGrayConfig.setServiceId(configGray.getServiceId()); + serviceGrayConfig.setUserKeys(userKeySet); + serviceGrayConfig.setGrayNameVersion(grayNameVersionMap); + this.saveServiceGrayConfig(serviceGrayConfig); } @PostConstruct protected void after() throws Exception { ZookeeperContext.setEnvironment(environment); - String isvChannelPath = ZookeeperContext.getUserKeyChannelPath(); + String isvChannelPath = ZookeeperContext.getServiceGrayChannelPath(); ZookeeperContext.listenPath(isvChannelPath, nodeCache -> { String nodeData = new String(nodeCache.getCurrentData().getData()); ChannelMsg channelMsg = JSON.parseObject(nodeData, ChannelMsg.class); String data = channelMsg.getData(); - UserKeyDefinition userKeyDefinition = JSON.parseObject(data, UserKeyDefinition.class); - String instanceId = userKeyDefinition.getInstanceId(); + ServiceGrayDefinition userKeyDefinition = JSON.parseObject(data, ServiceGrayDefinition.class); + String serviceId = userKeyDefinition.getServiceId(); switch (channelMsg.getOperation()) { case "set": - ConfigGrayUserkey configGrayUserkey = configGrayUserkeyMapper.getByColumn("instance_id", instanceId); - this.setServiceGrayConfig(configGrayUserkey); + ConfigGray configGray = configGrayMapper.getByColumn("service_id", serviceId); + this.setServiceGrayConfig(configGray); break; - case "clear": - clear(instanceId); + case "open": + openGray(userKeyDefinition.getInstanceId(), serviceId); + break; + case "close": + closeGray(userKeyDefinition.getInstanceId()); break; default: - log.error("userKey消息,错误的消息指令,nodeData:{}", nodeData); } }); diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIPBlacklistManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIPBlacklistManager.java index 8f97e349..7db0eada 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIPBlacklistManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIPBlacklistManager.java @@ -56,7 +56,6 @@ public class DbIPBlacklistManager extends DefaultIPBlacklistManager { remove(ip); break; default: - log.error("IP黑名单,错误的消息指令,nodeData:{}", nodeData); } }); } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvManager.java index 51cc9b2c..6ece0b03 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvManager.java @@ -61,7 +61,6 @@ public class DbIsvManager extends CacheIsvManager { remove(isvDefinition.getAppKey()); break; default: - log.error("ISV信息,错误的消息指令,nodeData:{}", nodeData); } }); diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvRoutePermissionManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvRoutePermissionManager.java index 2162d0e7..0715703a 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvRoutePermissionManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvRoutePermissionManager.java @@ -152,6 +152,8 @@ public class DbIsvRoutePermissionManager extends DefaultIsvRoutePermissionManage log.info("删除ISV路由权限信息,isvRoutePermission:{}", isvRoutePermission); remove(isvRoutePermission.getAppKey()); break; + default: + } }); } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbLimitConfigManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbLimitConfigManager.java index 9804f492..0f150334 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbLimitConfigManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbLimitConfigManager.java @@ -63,7 +63,6 @@ public class DbLimitConfigManager extends DefaultLimitConfigManager { update(configLimitDto); break; default: - log.error("限流配置信息,错误的消息指令,nodeData:{}", nodeData); } }); } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbRouteConfigManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbRouteConfigManager.java index 6c5a9674..ef7125f5 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbRouteConfigManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbRouteConfigManager.java @@ -87,7 +87,6 @@ public class DbRouteConfigManager extends DefaultRouteConfigManager { update(routeConfig); break; default: - log.error("路由配置信息,错误的消息指令,nodeData:{}", nodeData); } }); } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayInstanceMapper.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayInstanceMapper.java new file mode 100644 index 00000000..cd8bd242 --- /dev/null +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayInstanceMapper.java @@ -0,0 +1,11 @@ +package com.gitee.sop.gateway.mapper; + +import com.gitee.fastmybatis.core.mapper.CrudMapper; +import com.gitee.sop.gateway.entity.ConfigGrayInstance; + + +/** + * @author tanghc + */ +public interface ConfigGrayInstanceMapper extends CrudMapper { +} diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayMapper.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayMapper.java new file mode 100644 index 00000000..3405badb --- /dev/null +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayMapper.java @@ -0,0 +1,11 @@ +package com.gitee.sop.gateway.mapper; + +import com.gitee.fastmybatis.core.mapper.CrudMapper; +import com.gitee.sop.gateway.entity.ConfigGray; + + +/** + * @author tanghc + */ +public interface ConfigGrayMapper extends CrudMapper { +} diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayUserkeyMapper.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayUserkeyMapper.java deleted file mode 100644 index 38e4d70a..00000000 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/mapper/ConfigGrayUserkeyMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gitee.sop.gateway.mapper; - -import com.gitee.fastmybatis.core.mapper.CrudMapper; -import com.gitee.sop.gateway.entity.ConfigGrayUserkey; - - -/** - * @author tanghc - */ -public interface ConfigGrayUserkeyMapper extends CrudMapper { -} diff --git a/sop-gateway/src/main/resources/application-dev.properties b/sop-gateway/src/main/resources/application-dev.properties index 8517f0ee..b8aa8f58 100644 --- a/sop-gateway/src/main/resources/application-dev.properties +++ b/sop-gateway/src/main/resources/application-dev.properties @@ -12,6 +12,9 @@ eureka.url=http://localhost:1111/eureka/ zookeeper.url=localhost:2181 # zipkin服务监控地址,没有开启不用改 zipkin.url=http://127.0.0.1:9411/ + +# 预发布网关域名 +pre.domain=localhost # ------- 需要改的配置end ------- # 入口地址,不用改,默认是/zuul diff --git a/sop.sql b/sop.sql index 18d4af9d..d9d8cfb0 100644 --- a/sop.sql +++ b/sop.sql @@ -15,7 +15,8 @@ DROP TABLE IF EXISTS `admin_user_info`; DROP TABLE IF EXISTS `config_common`; DROP TABLE IF EXISTS `isv_keys`; DROP TABLE IF EXISTS `config_ip_blacklist`; -DROP TABLE IF EXISTS `config_gray_userkey`; +DROP TABLE IF EXISTS `config_gray`; +DROP TABLE IF EXISTS `config_gray_instance`; CREATE TABLE `admin_user_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, @@ -176,17 +177,29 @@ CREATE TABLE `config_ip_blacklist` ( UNIQUE KEY `uk_ip` (`ip`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='IP黑名单'; -CREATE TABLE `config_gray_userkey` ( +CREATE TABLE `config_gray` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, - `instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'serviceId', + `service_id` varchar(64) NOT NULL DEFAULT '', `user_key_content` text COMMENT '用户key,多个用引文逗号隔开', - `name_version_content` text COMMENT '需要灰度的接口,goods.get=1.2,order.list=1.2', - `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0:禁用,1:启用', + `name_version_content` text COMMENT '需要灰度的接口,goods.get1.0=1.2,多个用英文逗号隔开', `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), - UNIQUE KEY `uk_instanceid` (`instance_id`) USING BTREE -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='灰度发布用户key'; + UNIQUE KEY `uk_serviceid` (`service_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='服务灰度配置'; + + +CREATE TABLE `config_gray_instance` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `instance_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'instance_id', + `service_id` varchar(64) NOT NULL DEFAULT '' COMMENT 'service_id', + `status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0:禁用,1:启用', + `gmt_create` datetime DEFAULT CURRENT_TIMESTAMP, + `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `uk_instanceid` (`instance_id`) USING BTREE, + KEY `idx_serviceid` (`service_id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='开启灰度服务器实例'; SET FOREIGN_KEY_CHECKS = @PREVIOUS_FOREIGN_KEY_CHECKS;